@@ -266,6 +266,7 @@ class TransferTracker {
266
266
267
267
const TargetRegisterInfo &TRI;
268
268
const BitVector &CalleeSavedRegs;
269
+ unsigned NumRegs = 0 ;
269
270
270
271
TransferTracker (const TargetInstrInfo *TII, MLocTracker *MTracker,
271
272
MachineFunction &MF, const DebugVariableMap &DVMap,
@@ -276,13 +277,15 @@ class TransferTracker {
276
277
TLI = MF.getSubtarget ().getTargetLowering ();
277
278
auto &TM = TPC.getTM <TargetMachine>();
278
279
ShouldEmitDebugEntryValues = TM.Options .ShouldEmitDebugEntryValues ();
280
+ NumRegs = TRI.getNumSupportedRegs (MF);
279
281
}
280
282
281
283
bool isCalleeSaved (LocIdx L) const {
282
284
unsigned Reg = MTracker->LocIdxToLocID [L];
283
285
if (Reg >= MTracker->NumRegs )
284
286
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)
286
289
if (CalleeSavedRegs.test (*RAI))
287
290
return true ;
288
291
return false ;
@@ -1022,7 +1025,7 @@ MLocTracker::MLocTracker(MachineFunction &MF, const TargetInstrInfo &TII,
1022
1025
const TargetLowering &TLI)
1023
1026
: MF(MF), TII(TII), TRI(TRI), TLI(TLI),
1024
1027
LocIdxToIDNum (ValueIDNum::EmptyValue), LocIdxToLocID(0 ) {
1025
- NumRegs = TRI.getNumRegs ( );
1028
+ NumRegs = TRI.getNumSupportedRegs (MF );
1026
1029
reset ();
1027
1030
LocIDToLocIdx.resize (NumRegs, LocIdx::MakeIllegalLoc ());
1028
1031
assert (NumRegs < (1u << NUM_LOC_BITS)); // Detect bit packing failure
@@ -1035,7 +1038,8 @@ MLocTracker::MLocTracker(MachineFunction &MF, const TargetInstrInfo &TII,
1035
1038
unsigned ID = getLocID (SP);
1036
1039
(void )lookupOrTrackRegister (ID);
1037
1040
1038
- for (MCRegAliasIterator RAI (SP, &TRI, true ); RAI.isValid (); ++RAI)
1041
+ for (MCRegAliasIterator RAI (SP, &TRI, true );
1042
+ RAI.isValid () && *RAI < NumRegs; ++RAI)
1039
1043
SPAliases.insert (*RAI);
1040
1044
}
1041
1045
@@ -1344,7 +1348,8 @@ bool InstrRefBasedLDV::isCalleeSaved(LocIdx L) const {
1344
1348
return isCalleeSavedReg (Reg);
1345
1349
}
1346
1350
bool 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)
1348
1353
if (CalleeSavedRegs.test (*RAI))
1349
1354
return true ;
1350
1355
return false ;
@@ -1787,7 +1792,8 @@ bool InstrRefBasedLDV::transferDebugPHI(MachineInstr &MI) {
1787
1792
DebugPHINumToValue.push_back (PHIRec);
1788
1793
1789
1794
// 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)
1791
1797
MTracker->lookupOrTrackRegister (*RAI);
1792
1798
} else if (MO.isFI ()) {
1793
1799
// The value is whatever's in this stack slot.
@@ -1878,7 +1884,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
1878
1884
if (MO.isReg () && MO.isDef () && MO.getReg () && MO.getReg ().isPhysical () &&
1879
1885
!IgnoreSPAlias (MO.getReg ())) {
1880
1886
// 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)
1882
1889
// FIXME: Can we break out of this loop early if no insertion occurs?
1883
1890
DeadRegs.insert (*RAI);
1884
1891
} else if (MO.isRegMask ()) {
@@ -1952,7 +1959,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
1952
1959
1953
1960
void InstrRefBasedLDV::performCopy (Register SrcRegNum, Register DstRegNum) {
1954
1961
// 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)
1956
1964
MTracker->defReg (*RAI, CurBB, CurInst);
1957
1965
1958
1966
ValueIDNum SrcValue = MTracker->readReg (SrcRegNum);
@@ -2117,7 +2125,8 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
2117
2125
// stack slot.
2118
2126
2119
2127
// 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)
2121
2130
MTracker->defReg (*RAI, CurBB, CurInst);
2122
2131
2123
2132
// Now find subregisters within the destination register, and load values
@@ -2178,7 +2187,8 @@ bool InstrRefBasedLDV::transferRegisterCopy(MachineInstr &MI) {
2178
2187
// potentially clobbered variables.
2179
2188
DenseMap<LocIdx, ValueIDNum> ClobberedLocs;
2180
2189
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) {
2182
2192
LocIdx ClobberedLoc = MTracker->getRegMLoc (*RAI);
2183
2193
auto MLocIt = TTracker->ActiveMLocs .find (ClobberedLoc);
2184
2194
// If ActiveMLocs isn't tracking this location or there are no variables
@@ -2302,11 +2312,12 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
2302
2312
// appropriate clobbers.
2303
2313
SmallVector<BitVector, 32 > BlockMasks;
2304
2314
BlockMasks.resize (MaxNumBlocks);
2315
+ NumRegs = TRI->getNumSupportedRegs (MF);
2305
2316
2306
2317
// Reserve one bit per register for the masks described above.
2307
- unsigned BVWords = MachineOperand::getRegMaskSize (TRI-> getNumRegs () );
2318
+ unsigned BVWords = MachineOperand::getRegMaskSize (NumRegs );
2308
2319
for (auto &BV : BlockMasks)
2309
- BV.resize (TRI-> getNumRegs () , true );
2320
+ BV.resize (NumRegs , true );
2310
2321
2311
2322
// Step through all instructions and inhale the transfer function.
2312
2323
for (auto &MBB : MF) {
@@ -2370,11 +2381,11 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
2370
2381
}
2371
2382
2372
2383
// Compute a bitvector of all the registers that are tracked in this block.
2373
- BitVector UsedRegs (TRI-> getNumRegs () );
2384
+ BitVector UsedRegs (NumRegs );
2374
2385
for (auto Location : MTracker->locations ()) {
2375
2386
unsigned ID = MTracker->LocIdxToLocID [Location.Idx ];
2376
2387
// 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))
2378
2389
continue ;
2379
2390
UsedRegs.set (ID);
2380
2391
}
@@ -2635,7 +2646,8 @@ void InstrRefBasedLDV::placeMLocPHIs(
2635
2646
InstallPHIsAtLoc (L);
2636
2647
2637
2648
// 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) {
2639
2651
// Super-registers that are "above" the largest register read/written by
2640
2652
// the function will alias, but will not be tracked.
2641
2653
if (!MTracker->isRegisterTracked (*RAI))
0 commit comments