@@ -1509,7 +1509,10 @@ 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) : VirtRegOrUnit (Reg.id ());
1515+ for (auto PSetIter = MRI.getPressureSets (VRegOrUnit); PSetIter.isValid ();
15131516 ++PSetIter) {
15141517 dbgs () << *PSetIter << ' ' ;
15151518 }
@@ -1518,15 +1521,18 @@ class HighRegisterPressureDetector {
15181521
15191522 void increaseRegisterPressure (std::vector<unsigned > &Pressure,
15201523 Register Reg) const {
1521- auto PSetIter = MRI.getPressureSets (Reg);
1524+ // FIXME: The static cast is a bug compensating bugs in the callers.
1525+ VirtRegOrUnit VRegOrUnit =
1526+ Reg.isVirtual () ? VirtRegOrUnit (Reg) : VirtRegOrUnit (Reg.id ());
1527+ auto PSetIter = MRI.getPressureSets (VRegOrUnit);
15221528 unsigned Weight = PSetIter.getWeight ();
15231529 for (; PSetIter.isValid (); ++PSetIter)
15241530 Pressure[*PSetIter] += Weight;
15251531 }
15261532
15271533 void decreaseRegisterPressure (std::vector<unsigned > &Pressure,
15281534 Register Reg) const {
1529- auto PSetIter = MRI.getPressureSets (Reg);
1535+ auto PSetIter = MRI.getPressureSets (VirtRegOrUnit ( Reg) );
15301536 unsigned Weight = PSetIter.getWeight ();
15311537 for (; PSetIter.isValid (); ++PSetIter) {
15321538 auto &P = Pressure[*PSetIter];
@@ -1559,7 +1565,11 @@ class HighRegisterPressureDetector {
15591565 if (MI.isDebugInstr ())
15601566 continue ;
15611567 for (auto &Use : ROMap[&MI].Uses ) {
1562- auto Reg = Use.RegUnit ;
1568+ // FIXME: The static_cast is a bug.
1569+ Register Reg =
1570+ Use.VRegOrUnit .isVirtualReg ()
1571+ ? Use.VRegOrUnit .asVirtualReg ()
1572+ : static_cast <Register>(Use.VRegOrUnit .asMCRegUnit ());
15631573 // Ignore the variable that appears only on one side of phi instruction
15641574 // because it's used only at the first iteration.
15651575 if (MI.isPHI () && Reg != getLoopPhiReg (MI, OrigMBB))
@@ -1609,8 +1619,14 @@ class HighRegisterPressureDetector {
16091619 Register Reg = getLoopPhiReg (*MI, OrigMBB);
16101620 UpdateTargetRegs (Reg);
16111621 } else {
1612- for (auto &Use : ROMap.find (MI)->getSecond ().Uses )
1613- UpdateTargetRegs (Use.RegUnit );
1622+ for (auto &Use : ROMap.find (MI)->getSecond ().Uses ) {
1623+ // FIXME: The static_cast is a bug.
1624+ Register Reg =
1625+ Use.VRegOrUnit .isVirtualReg ()
1626+ ? Use.VRegOrUnit .asVirtualReg ()
1627+ : static_cast <Register>(Use.VRegOrUnit .asMCRegUnit ());
1628+ UpdateTargetRegs (Reg);
1629+ }
16141630 }
16151631 }
16161632
@@ -1621,7 +1637,11 @@ class HighRegisterPressureDetector {
16211637 DenseMap<Register, MachineInstr *> LastUseMI;
16221638 for (MachineInstr *MI : llvm::reverse (OrderedInsts)) {
16231639 for (auto &Use : ROMap.find (MI)->getSecond ().Uses ) {
1624- auto Reg = Use.RegUnit ;
1640+ // FIXME: The static_cast is a bug.
1641+ Register Reg =
1642+ Use.VRegOrUnit .isVirtualReg ()
1643+ ? Use.VRegOrUnit .asVirtualReg ()
1644+ : static_cast <Register>(Use.VRegOrUnit .asMCRegUnit ());
16251645 if (!TargetRegs.contains (Reg))
16261646 continue ;
16271647 auto [Ite, Inserted] = LastUseMI.try_emplace (Reg, MI);
@@ -1635,8 +1655,8 @@ class HighRegisterPressureDetector {
16351655 }
16361656
16371657 Instr2LastUsesTy LastUses;
1638- for (auto &Entry : LastUseMI)
1639- LastUses[Entry. second ].insert (Entry. first );
1658+ for (auto [Reg, MI] : LastUseMI)
1659+ LastUses[MI ].insert (Reg );
16401660 return LastUses;
16411661 }
16421662
@@ -1675,7 +1695,11 @@ class HighRegisterPressureDetector {
16751695 });
16761696
16771697 const auto InsertReg = [this , &CurSetPressure](RegSetTy &RegSet,
1678- Register Reg) {
1698+ VirtRegOrUnit VRegOrUnit) {
1699+ // FIXME: The static_cast is a bug.
1700+ Register Reg = VRegOrUnit.isVirtualReg ()
1701+ ? VRegOrUnit.asVirtualReg ()
1702+ : static_cast <Register>(VRegOrUnit.asMCRegUnit ());
16791703 if (!Reg.isValid () || isReservedRegister (Reg))
16801704 return ;
16811705
@@ -1712,7 +1736,7 @@ class HighRegisterPressureDetector {
17121736 const unsigned Iter = I - Stage;
17131737
17141738 for (auto &Def : ROMap.find (MI)->getSecond ().Defs )
1715- InsertReg (LiveRegSets[Iter], Def.RegUnit );
1739+ InsertReg (LiveRegSets[Iter], Def.VRegOrUnit );
17161740
17171741 for (auto LastUse : LastUses[MI]) {
17181742 if (MI->isPHI ()) {
@@ -2235,30 +2259,33 @@ static void computeLiveOuts(MachineFunction &MF, RegPressureTracker &RPTracker,
22352259 const TargetRegisterInfo *TRI = MF.getSubtarget ().getRegisterInfo ();
22362260 MachineRegisterInfo &MRI = MF.getRegInfo ();
22372261 SmallVector<VRegMaskOrUnit, 8 > LiveOutRegs;
2238- SmallSet<Register , 4 > Uses;
2262+ SmallSet<VirtRegOrUnit , 4 > Uses;
22392263 for (SUnit *SU : NS) {
22402264 const MachineInstr *MI = SU->getInstr ();
22412265 if (MI->isPHI ())
22422266 continue ;
22432267 for (const MachineOperand &MO : MI->all_uses ()) {
22442268 Register Reg = MO.getReg ();
22452269 if (Reg.isVirtual ())
2246- Uses.insert (Reg);
2270+ Uses.insert (VirtRegOrUnit ( Reg) );
22472271 else if (MRI.isAllocatable (Reg))
2248- Uses.insert_range (TRI->regunits (Reg.asMCReg ()));
2272+ for (MCRegUnit Unit : TRI->regunits (Reg.asMCReg ()))
2273+ Uses.insert (VirtRegOrUnit (Unit));
22492274 }
22502275 }
22512276 for (SUnit *SU : NS)
22522277 for (const MachineOperand &MO : SU->getInstr ()->all_defs ())
22532278 if (!MO.isDead ()) {
22542279 Register Reg = MO.getReg ();
22552280 if (Reg.isVirtual ()) {
2256- if (!Uses.count (Reg))
2257- LiveOutRegs.emplace_back (Reg, LaneBitmask::getNone ());
2281+ if (!Uses.count (VirtRegOrUnit (Reg)))
2282+ LiveOutRegs.emplace_back (VirtRegOrUnit (Reg),
2283+ LaneBitmask::getNone ());
22582284 } else if (MRI.isAllocatable (Reg)) {
22592285 for (MCRegUnit Unit : TRI->regunits (Reg.asMCReg ()))
2260- if (!Uses.count (Unit))
2261- LiveOutRegs.emplace_back (Unit, LaneBitmask::getNone ());
2286+ if (!Uses.count (VirtRegOrUnit (Unit)))
2287+ LiveOutRegs.emplace_back (VirtRegOrUnit (Unit),
2288+ LaneBitmask::getNone ());
22622289 }
22632290 }
22642291 RPTracker.addLiveRegs (LiveOutRegs);
0 commit comments