diff options
| author | Sergei Barannikov <barannikov88@gmail.com> | 2025-11-13 13:26:58 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-13 10:26:58 +0000 |
| commit | ef9a02ce028782684f9a43dcda756804635ba86a (patch) | |
| tree | f788dda56b2e080bd01f875770b4d30a1e43cce4 /llvm/lib/CodeGen/MachinePipeliner.cpp | |
| parent | a25daa33f01b193472b1f74dc3ab49fcf5757329 (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.cpp | 66 |
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); |
