summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachinePipeliner.cpp
diff options
context:
space:
mode:
authorSergei Barannikov <barannikov88@gmail.com>2025-11-13 13:26:58 +0300
committerGitHub <noreply@github.com>2025-11-13 10:26:58 +0000
commitef9a02ce028782684f9a43dcda756804635ba86a (patch)
treef788dda56b2e080bd01f875770b4d30a1e43cce4 /llvm/lib/CodeGen/MachinePipeliner.cpp
parenta25daa33f01b193472b1f74dc3ab49fcf5757329 (diff)
[CodeGen] Use VirtRegOrUnit where appropriate (NFCI) (#167730)
Use it in `printVRegOrUnit()`, `getPressureSets()`/`PSetIterator`, and in functions/classes dealing with register pressure. Static type checking revealed several bugs, mainly in MachinePipeliner. I'm not very familiar with this pass, so I left a bunch of FIXMEs. There is one bug in `findUseBetween()` in RegisterPressure.cpp, also annotated with a FIXME.
Diffstat (limited to 'llvm/lib/CodeGen/MachinePipeliner.cpp')
-rw-r--r--llvm/lib/CodeGen/MachinePipeliner.cpp66
1 files changed, 48 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/MachinePipeliner.cpp b/llvm/lib/CodeGen/MachinePipeliner.cpp
index a717d9e4a618..e2f7dfc5cadd 100644
--- a/llvm/lib/CodeGen/MachinePipeliner.cpp
+++ b/llvm/lib/CodeGen/MachinePipeliner.cpp
@@ -1509,7 +1509,11 @@ private:
void dumpPSet(Register Reg) const {
dbgs() << "Reg=" << printReg(Reg, TRI, 0, &MRI) << " PSet=";
- for (auto PSetIter = MRI.getPressureSets(Reg); PSetIter.isValid();
+ // FIXME: The static_cast is a bug compensating bugs in the callers.
+ VirtRegOrUnit VRegOrUnit =
+ Reg.isVirtual() ? VirtRegOrUnit(Reg)
+ : VirtRegOrUnit(static_cast<MCRegUnit>(Reg.id()));
+ for (auto PSetIter = MRI.getPressureSets(VRegOrUnit); PSetIter.isValid();
++PSetIter) {
dbgs() << *PSetIter << ' ';
}
@@ -1518,7 +1522,11 @@ private:
void increaseRegisterPressure(std::vector<unsigned> &Pressure,
Register Reg) const {
- auto PSetIter = MRI.getPressureSets(Reg);
+ // FIXME: The static_cast is a bug compensating bugs in the callers.
+ VirtRegOrUnit VRegOrUnit =
+ Reg.isVirtual() ? VirtRegOrUnit(Reg)
+ : VirtRegOrUnit(static_cast<MCRegUnit>(Reg.id()));
+ auto PSetIter = MRI.getPressureSets(VRegOrUnit);
unsigned Weight = PSetIter.getWeight();
for (; PSetIter.isValid(); ++PSetIter)
Pressure[*PSetIter] += Weight;
@@ -1526,7 +1534,7 @@ private:
void decreaseRegisterPressure(std::vector<unsigned> &Pressure,
Register Reg) const {
- auto PSetIter = MRI.getPressureSets(Reg);
+ auto PSetIter = MRI.getPressureSets(VirtRegOrUnit(Reg));
unsigned Weight = PSetIter.getWeight();
for (; PSetIter.isValid(); ++PSetIter) {
auto &P = Pressure[*PSetIter];
@@ -1559,7 +1567,11 @@ private:
if (MI.isDebugInstr())
continue;
for (auto &Use : ROMap[&MI].Uses) {
- auto Reg = Use.RegUnit;
+ // FIXME: The static_cast is a bug.
+ Register Reg =
+ Use.VRegOrUnit.isVirtualReg()
+ ? Use.VRegOrUnit.asVirtualReg()
+ : Register(static_cast<unsigned>(Use.VRegOrUnit.asMCRegUnit()));
// Ignore the variable that appears only on one side of phi instruction
// because it's used only at the first iteration.
if (MI.isPHI() && Reg != getLoopPhiReg(MI, OrigMBB))
@@ -1609,8 +1621,14 @@ private:
Register Reg = getLoopPhiReg(*MI, OrigMBB);
UpdateTargetRegs(Reg);
} else {
- for (auto &Use : ROMap.find(MI)->getSecond().Uses)
- UpdateTargetRegs(Use.RegUnit);
+ for (auto &Use : ROMap.find(MI)->getSecond().Uses) {
+ // FIXME: The static_cast is a bug.
+ Register Reg = Use.VRegOrUnit.isVirtualReg()
+ ? Use.VRegOrUnit.asVirtualReg()
+ : Register(static_cast<unsigned>(
+ Use.VRegOrUnit.asMCRegUnit()));
+ UpdateTargetRegs(Reg);
+ }
}
}
@@ -1621,7 +1639,11 @@ private:
DenseMap<Register, MachineInstr *> LastUseMI;
for (MachineInstr *MI : llvm::reverse(OrderedInsts)) {
for (auto &Use : ROMap.find(MI)->getSecond().Uses) {
- auto Reg = Use.RegUnit;
+ // FIXME: The static_cast is a bug.
+ Register Reg =
+ Use.VRegOrUnit.isVirtualReg()
+ ? Use.VRegOrUnit.asVirtualReg()
+ : Register(static_cast<unsigned>(Use.VRegOrUnit.asMCRegUnit()));
if (!TargetRegs.contains(Reg))
continue;
auto [Ite, Inserted] = LastUseMI.try_emplace(Reg, MI);
@@ -1635,8 +1657,8 @@ private:
}
Instr2LastUsesTy LastUses;
- for (auto &Entry : LastUseMI)
- LastUses[Entry.second].insert(Entry.first);
+ for (auto [Reg, MI] : LastUseMI)
+ LastUses[MI].insert(Reg);
return LastUses;
}
@@ -1675,7 +1697,12 @@ private:
});
const auto InsertReg = [this, &CurSetPressure](RegSetTy &RegSet,
- Register Reg) {
+ VirtRegOrUnit VRegOrUnit) {
+ // FIXME: The static_cast is a bug.
+ Register Reg =
+ VRegOrUnit.isVirtualReg()
+ ? VRegOrUnit.asVirtualReg()
+ : Register(static_cast<unsigned>(VRegOrUnit.asMCRegUnit()));
if (!Reg.isValid() || isReservedRegister(Reg))
return;
@@ -1712,7 +1739,7 @@ private:
const unsigned Iter = I - Stage;
for (auto &Def : ROMap.find(MI)->getSecond().Defs)
- InsertReg(LiveRegSets[Iter], Def.RegUnit);
+ InsertReg(LiveRegSets[Iter], Def.VRegOrUnit);
for (auto LastUse : LastUses[MI]) {
if (MI->isPHI()) {
@@ -2235,7 +2262,7 @@ static void computeLiveOuts(MachineFunction &MF, RegPressureTracker &RPTracker,
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
MachineRegisterInfo &MRI = MF.getRegInfo();
SmallVector<VRegMaskOrUnit, 8> LiveOutRegs;
- SmallSet<Register, 4> Uses;
+ SmallSet<VirtRegOrUnit, 4> Uses;
for (SUnit *SU : NS) {
const MachineInstr *MI = SU->getInstr();
if (MI->isPHI())
@@ -2243,9 +2270,10 @@ static void computeLiveOuts(MachineFunction &MF, RegPressureTracker &RPTracker,
for (const MachineOperand &MO : MI->all_uses()) {
Register Reg = MO.getReg();
if (Reg.isVirtual())
- Uses.insert(Reg);
+ Uses.insert(VirtRegOrUnit(Reg));
else if (MRI.isAllocatable(Reg))
- Uses.insert_range(TRI->regunits(Reg.asMCReg()));
+ for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg()))
+ Uses.insert(VirtRegOrUnit(Unit));
}
}
for (SUnit *SU : NS)
@@ -2253,12 +2281,14 @@ static void computeLiveOuts(MachineFunction &MF, RegPressureTracker &RPTracker,
if (!MO.isDead()) {
Register Reg = MO.getReg();
if (Reg.isVirtual()) {
- if (!Uses.count(Reg))
- LiveOutRegs.emplace_back(Reg, LaneBitmask::getNone());
+ if (!Uses.count(VirtRegOrUnit(Reg)))
+ LiveOutRegs.emplace_back(VirtRegOrUnit(Reg),
+ LaneBitmask::getNone());
} else if (MRI.isAllocatable(Reg)) {
for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg()))
- if (!Uses.count(Unit))
- LiveOutRegs.emplace_back(Unit, LaneBitmask::getNone());
+ if (!Uses.count(VirtRegOrUnit(Unit)))
+ LiveOutRegs.emplace_back(VirtRegOrUnit(Unit),
+ LaneBitmask::getNone());
}
}
RPTracker.addLiveRegs(LiveOutRegs);