@@ -1509,7 +1509,11 @@ class HighRegisterPressureDetector {
15091509
15101510 void dumpPSet (Register Reg) const {
15111511 dbgs () << " Reg=" << printReg (Reg, TRI, 0 , &MRI) << " PSet=" ;
1512- for (auto PSetIter = MRI.getPressureSets (Reg); PSetIter.isValid ();
1512+ // FIXME: The static_cast is a bug compensating bugs in the callers.
1513+ VirtRegOrUnit VRegOrUnit =
1514+ Reg.isVirtual () ? VirtRegOrUnit (Reg)
1515+ : VirtRegOrUnit (static_cast <MCRegUnit>(Reg.id ()));
1516+ for (auto PSetIter = MRI.getPressureSets (VRegOrUnit); PSetIter.isValid ();
15131517 ++PSetIter) {
15141518 dbgs () << *PSetIter << ' ' ;
15151519 }
@@ -1518,15 +1522,19 @@ class HighRegisterPressureDetector {
15181522
15191523 void increaseRegisterPressure (std::vector<unsigned > &Pressure,
15201524 Register Reg) const {
1521- auto PSetIter = MRI.getPressureSets (Reg);
1525+ // FIXME: The static_cast is a bug compensating bugs in the callers.
1526+ VirtRegOrUnit VRegOrUnit =
1527+ Reg.isVirtual () ? VirtRegOrUnit (Reg)
1528+ : VirtRegOrUnit (static_cast <MCRegUnit>(Reg.id ()));
1529+ auto PSetIter = MRI.getPressureSets (VRegOrUnit);
15221530 unsigned Weight = PSetIter.getWeight ();
15231531 for (; PSetIter.isValid (); ++PSetIter)
15241532 Pressure[*PSetIter] += Weight;
15251533 }
15261534
15271535 void decreaseRegisterPressure (std::vector<unsigned > &Pressure,
15281536 Register Reg) const {
1529- auto PSetIter = MRI.getPressureSets (Reg);
1537+ auto PSetIter = MRI.getPressureSets (VirtRegOrUnit ( Reg) );
15301538 unsigned Weight = PSetIter.getWeight ();
15311539 for (; PSetIter.isValid (); ++PSetIter) {
15321540 auto &P = Pressure[*PSetIter];
@@ -1559,7 +1567,11 @@ class HighRegisterPressureDetector {
15591567 if (MI.isDebugInstr ())
15601568 continue ;
15611569 for (auto &Use : ROMap[&MI].Uses ) {
1562- auto Reg = Use.RegUnit ;
1570+ // FIXME: The static_cast is a bug.
1571+ Register Reg =
1572+ Use.VRegOrUnit .isVirtualReg ()
1573+ ? Use.VRegOrUnit .asVirtualReg ()
1574+ : Register (static_cast <unsigned >(Use.VRegOrUnit .asMCRegUnit ()));
15631575 // Ignore the variable that appears only on one side of phi instruction
15641576 // because it's used only at the first iteration.
15651577 if (MI.isPHI () && Reg != getLoopPhiReg (MI, OrigMBB))
@@ -1609,8 +1621,14 @@ class HighRegisterPressureDetector {
16091621 Register Reg = getLoopPhiReg (*MI, OrigMBB);
16101622 UpdateTargetRegs (Reg);
16111623 } else {
1612- for (auto &Use : ROMap.find (MI)->getSecond ().Uses )
1613- UpdateTargetRegs (Use.RegUnit );
1624+ for (auto &Use : ROMap.find (MI)->getSecond ().Uses ) {
1625+ // FIXME: The static_cast is a bug.
1626+ Register Reg = Use.VRegOrUnit .isVirtualReg ()
1627+ ? Use.VRegOrUnit .asVirtualReg ()
1628+ : Register (static_cast <unsigned >(
1629+ Use.VRegOrUnit .asMCRegUnit ()));
1630+ UpdateTargetRegs (Reg);
1631+ }
16141632 }
16151633 }
16161634
@@ -1621,7 +1639,11 @@ class HighRegisterPressureDetector {
16211639 DenseMap<Register, MachineInstr *> LastUseMI;
16221640 for (MachineInstr *MI : llvm::reverse (OrderedInsts)) {
16231641 for (auto &Use : ROMap.find (MI)->getSecond ().Uses ) {
1624- auto Reg = Use.RegUnit ;
1642+ // FIXME: The static_cast is a bug.
1643+ Register Reg =
1644+ Use.VRegOrUnit .isVirtualReg ()
1645+ ? Use.VRegOrUnit .asVirtualReg ()
1646+ : Register (static_cast <unsigned >(Use.VRegOrUnit .asMCRegUnit ()));
16251647 if (!TargetRegs.contains (Reg))
16261648 continue ;
16271649 auto [Ite, Inserted] = LastUseMI.try_emplace (Reg, MI);
@@ -1635,8 +1657,8 @@ class HighRegisterPressureDetector {
16351657 }
16361658
16371659 Instr2LastUsesTy LastUses;
1638- for (auto &Entry : LastUseMI)
1639- LastUses[Entry. second ].insert (Entry. first );
1660+ for (auto [Reg, MI] : LastUseMI)
1661+ LastUses[MI ].insert (Reg );
16401662 return LastUses;
16411663 }
16421664
@@ -1675,7 +1697,12 @@ class HighRegisterPressureDetector {
16751697 });
16761698
16771699 const auto InsertReg = [this , &CurSetPressure](RegSetTy &RegSet,
1678- Register Reg) {
1700+ VirtRegOrUnit VRegOrUnit) {
1701+ // FIXME: The static_cast is a bug.
1702+ Register Reg =
1703+ VRegOrUnit.isVirtualReg ()
1704+ ? VRegOrUnit.asVirtualReg ()
1705+ : Register (static_cast <unsigned >(VRegOrUnit.asMCRegUnit ()));
16791706 if (!Reg.isValid () || isReservedRegister (Reg))
16801707 return ;
16811708
@@ -1712,7 +1739,7 @@ class HighRegisterPressureDetector {
17121739 const unsigned Iter = I - Stage;
17131740
17141741 for (auto &Def : ROMap.find (MI)->getSecond ().Defs )
1715- InsertReg (LiveRegSets[Iter], Def.RegUnit );
1742+ InsertReg (LiveRegSets[Iter], Def.VRegOrUnit );
17161743
17171744 for (auto LastUse : LastUses[MI]) {
17181745 if (MI->isPHI ()) {
@@ -2235,30 +2262,33 @@ static void computeLiveOuts(MachineFunction &MF, RegPressureTracker &RPTracker,
22352262 const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
22362263 MachineRegisterInfo &MRI = MF.getRegInfo ();
22372264 SmallVector<VRegMaskOrUnit, 8 > LiveOutRegs;
2238- SmallSet<Register , 4 > Uses;
2265+ SmallSet<VirtRegOrUnit , 4 > Uses;
22392266 for (SUnit *SU : NS) {
22402267 const MachineInstr *MI = SU->getInstr ();
22412268 if (MI->isPHI ())
22422269 continue ;
22432270 for (const MachineOperand &MO : MI->all_uses ()) {
22442271 Register Reg = MO.getReg ();
22452272 if (Reg.isVirtual ())
2246- Uses.insert (Reg);
2273+ Uses.insert (VirtRegOrUnit ( Reg) );
22472274 else if (MRI.isAllocatable (Reg))
2248- Uses.insert_range (TRI->regunits (Reg.asMCReg ()));
2275+ for (MCRegUnit Unit : TRI->regunits (Reg.asMCReg ()))
2276+ Uses.insert (VirtRegOrUnit (Unit));
22492277 }
22502278 }
22512279 for (SUnit *SU : NS)
22522280 for (const MachineOperand &MO : SU->getInstr ()->all_defs ())
22532281 if (!MO.isDead ()) {
22542282 Register Reg = MO.getReg ();
22552283 if (Reg.isVirtual ()) {
2256- if (!Uses.count (Reg))
2257- LiveOutRegs.emplace_back (Reg, LaneBitmask::getNone ());
2284+ if (!Uses.count (VirtRegOrUnit (Reg)))
2285+ LiveOutRegs.emplace_back (VirtRegOrUnit (Reg),
2286+ LaneBitmask::getNone ());
22582287 } else if (MRI.isAllocatable (Reg)) {
22592288 for (MCRegUnit Unit : TRI->regunits (Reg.asMCReg ()))
2260- if (!Uses.count (Unit))
2261- LiveOutRegs.emplace_back (Unit, LaneBitmask::getNone ());
2289+ if (!Uses.count (VirtRegOrUnit (Unit)))
2290+ LiveOutRegs.emplace_back (VirtRegOrUnit (Unit),
2291+ LaneBitmask::getNone ());
22622292 }
22632293 }
22642294 RPTracker.addLiveRegs (LiveOutRegs);
0 commit comments