@@ -266,6 +266,7 @@ class TransferTracker {
266266
267267 const TargetRegisterInfo &TRI;
268268 const BitVector &CalleeSavedRegs;
269+ unsigned NumRegs = 0 ;
269270
270271 TransferTracker (const TargetInstrInfo *TII, MLocTracker *MTracker,
271272 MachineFunction &MF, const DebugVariableMap &DVMap,
@@ -276,13 +277,15 @@ class TransferTracker {
276277 TLI = MF.getSubtarget ().getTargetLowering ();
277278 auto &TM = TPC.getTM <TargetMachine>();
278279 ShouldEmitDebugEntryValues = TM.Options .ShouldEmitDebugEntryValues ();
280+ NumRegs = TRI.getNumSupportedRegs (MF);
279281 }
280282
281283 bool isCalleeSaved (LocIdx L) const {
282284 unsigned Reg = MTracker->LocIdxToLocID [L];
283285 if (Reg >= MTracker->NumRegs )
284286 return false ;
285- for (MCRegAliasIterator RAI (Reg, &TRI, true ); RAI.isValid (); ++RAI)
287+ for (MCRegAliasIterator RAI (Reg, &TRI, true );
288+ RAI.isValid () && *RAI < NumRegs; ++RAI)
286289 if (CalleeSavedRegs.test (*RAI))
287290 return true ;
288291 return false ;
@@ -1022,7 +1025,7 @@ MLocTracker::MLocTracker(MachineFunction &MF, const TargetInstrInfo &TII,
10221025 const TargetLowering &TLI)
10231026 : MF(MF), TII(TII), TRI(TRI), TLI(TLI),
10241027 LocIdxToIDNum (ValueIDNum::EmptyValue), LocIdxToLocID(0 ) {
1025- NumRegs = TRI.getNumRegs ( );
1028+ NumRegs = TRI.getNumSupportedRegs (MF );
10261029 reset ();
10271030 LocIDToLocIdx.resize (NumRegs, LocIdx::MakeIllegalLoc ());
10281031 assert (NumRegs < (1u << NUM_LOC_BITS)); // Detect bit packing failure
@@ -1035,7 +1038,8 @@ MLocTracker::MLocTracker(MachineFunction &MF, const TargetInstrInfo &TII,
10351038 unsigned ID = getLocID (SP);
10361039 (void )lookupOrTrackRegister (ID);
10371040
1038- for (MCRegAliasIterator RAI (SP, &TRI, true ); RAI.isValid (); ++RAI)
1041+ for (MCRegAliasIterator RAI (SP, &TRI, true );
1042+ RAI.isValid () && *RAI < NumRegs; ++RAI)
10391043 SPAliases.insert (*RAI);
10401044 }
10411045
@@ -1344,7 +1348,8 @@ bool InstrRefBasedLDV::isCalleeSaved(LocIdx L) const {
13441348 return isCalleeSavedReg (Reg);
13451349}
13461350bool InstrRefBasedLDV::isCalleeSavedReg (Register R) const {
1347- for (MCRegAliasIterator RAI (R, TRI, true ); RAI.isValid (); ++RAI)
1351+ for (MCRegAliasIterator RAI (R, TRI, true ); RAI.isValid () && *RAI < NumRegs;
1352+ ++RAI)
13481353 if (CalleeSavedRegs.test (*RAI))
13491354 return true ;
13501355 return false ;
@@ -1787,7 +1792,8 @@ bool InstrRefBasedLDV::transferDebugPHI(MachineInstr &MI) {
17871792 DebugPHINumToValue.push_back (PHIRec);
17881793
17891794 // Ensure this register is tracked.
1790- for (MCRegAliasIterator RAI (MO.getReg (), TRI, true ); RAI.isValid (); ++RAI)
1795+ for (MCRegAliasIterator RAI (MO.getReg (), TRI, true );
1796+ RAI.isValid () && *RAI < NumRegs; ++RAI)
17911797 MTracker->lookupOrTrackRegister (*RAI);
17921798 } else if (MO.isFI ()) {
17931799 // The value is whatever's in this stack slot.
@@ -1878,7 +1884,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
18781884 if (MO.isReg () && MO.isDef () && MO.getReg () && MO.getReg ().isPhysical () &&
18791885 !IgnoreSPAlias (MO.getReg ())) {
18801886 // Remove ranges of all aliased registers.
1881- for (MCRegAliasIterator RAI (MO.getReg (), TRI, true ); RAI.isValid (); ++RAI)
1887+ for (MCRegAliasIterator RAI (MO.getReg (), TRI, true );
1888+ RAI.isValid () && *RAI < NumRegs; ++RAI)
18821889 // FIXME: Can we break out of this loop early if no insertion occurs?
18831890 DeadRegs.insert (*RAI);
18841891 } else if (MO.isRegMask ()) {
@@ -1952,7 +1959,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
19521959
19531960void InstrRefBasedLDV::performCopy (Register SrcRegNum, Register DstRegNum) {
19541961 // In all circumstances, re-def all aliases. It's definitely a new value now.
1955- for (MCRegAliasIterator RAI (DstRegNum, TRI, true ); RAI.isValid (); ++RAI)
1962+ for (MCRegAliasIterator RAI (DstRegNum, TRI, true );
1963+ RAI.isValid () && *RAI < NumRegs; ++RAI)
19561964 MTracker->defReg (*RAI, CurBB, CurInst);
19571965
19581966 ValueIDNum SrcValue = MTracker->readReg (SrcRegNum);
@@ -2117,7 +2125,8 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
21172125 // stack slot.
21182126
21192127 // Def all registers that alias the destination.
2120- for (MCRegAliasIterator RAI (Reg, TRI, true ); RAI.isValid (); ++RAI)
2128+ for (MCRegAliasIterator RAI (Reg, TRI, true );
2129+ RAI.isValid () && *RAI < NumRegs; ++RAI)
21212130 MTracker->defReg (*RAI, CurBB, CurInst);
21222131
21232132 // Now find subregisters within the destination register, and load values
@@ -2178,7 +2187,8 @@ bool InstrRefBasedLDV::transferRegisterCopy(MachineInstr &MI) {
21782187 // potentially clobbered variables.
21792188 DenseMap<LocIdx, ValueIDNum> ClobberedLocs;
21802189 if (TTracker) {
2181- for (MCRegAliasIterator RAI (DestReg, TRI, true ); RAI.isValid (); ++RAI) {
2190+ for (MCRegAliasIterator RAI (DestReg, TRI, true );
2191+ RAI.isValid () && *RAI < NumRegs; ++RAI) {
21822192 LocIdx ClobberedLoc = MTracker->getRegMLoc (*RAI);
21832193 auto MLocIt = TTracker->ActiveMLocs .find (ClobberedLoc);
21842194 // If ActiveMLocs isn't tracking this location or there are no variables
@@ -2302,11 +2312,12 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
23022312 // appropriate clobbers.
23032313 SmallVector<BitVector, 32 > BlockMasks;
23042314 BlockMasks.resize (MaxNumBlocks);
2315+ NumRegs = TRI->getNumSupportedRegs (MF);
23052316
23062317 // Reserve one bit per register for the masks described above.
2307- unsigned BVWords = MachineOperand::getRegMaskSize (TRI-> getNumRegs () );
2318+ unsigned BVWords = MachineOperand::getRegMaskSize (NumRegs );
23082319 for (auto &BV : BlockMasks)
2309- BV.resize (TRI-> getNumRegs () , true );
2320+ BV.resize (NumRegs , true );
23102321
23112322 // Step through all instructions and inhale the transfer function.
23122323 for (auto &MBB : MF) {
@@ -2370,11 +2381,11 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
23702381 }
23712382
23722383 // Compute a bitvector of all the registers that are tracked in this block.
2373- BitVector UsedRegs (TRI-> getNumRegs () );
2384+ BitVector UsedRegs (NumRegs );
23742385 for (auto Location : MTracker->locations ()) {
23752386 unsigned ID = MTracker->LocIdxToLocID [Location.Idx ];
23762387 // Ignore stack slots, and aliases of the stack pointer.
2377- if (ID >= TRI-> getNumRegs () || MTracker->SPAliases .count (ID))
2388+ if (ID >= NumRegs || MTracker->SPAliases .count (ID))
23782389 continue ;
23792390 UsedRegs.set (ID);
23802391 }
@@ -2635,7 +2646,8 @@ void InstrRefBasedLDV::placeMLocPHIs(
26352646 InstallPHIsAtLoc (L);
26362647
26372648 // Now find aliases and install PHIs for those.
2638- for (MCRegAliasIterator RAI (R, TRI, true ); RAI.isValid (); ++RAI) {
2649+ for (MCRegAliasIterator RAI (R, TRI, true ); RAI.isValid () && *RAI < NumRegs;
2650+ ++RAI) {
26392651 // Super-registers that are "above" the largest register read/written by
26402652 // the function will alias, but will not be tracked.
26412653 if (!MTracker->isRegisterTracked (*RAI))
0 commit comments