@@ -1022,7 +1022,7 @@ MLocTracker::MLocTracker(MachineFunction &MF, const TargetInstrInfo &TII,
1022
1022
const TargetLowering &TLI)
1023
1023
: MF(MF), TII(TII), TRI(TRI), TLI(TLI),
1024
1024
LocIdxToIDNum (ValueIDNum::EmptyValue), LocIdxToLocID(0 ) {
1025
- NumRegs = TRI.getNumRegs ( );
1025
+ NumRegs = TRI.getNumSupportedRegs (MF );
1026
1026
reset ();
1027
1027
LocIDToLocIdx.resize (NumRegs, LocIdx::MakeIllegalLoc ());
1028
1028
assert (NumRegs < (1u << NUM_LOC_BITS)); // Detect bit packing failure
@@ -1878,7 +1878,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
1878
1878
if (MO.isReg () && MO.isDef () && MO.getReg () && MO.getReg ().isPhysical () &&
1879
1879
!IgnoreSPAlias (MO.getReg ())) {
1880
1880
// Remove ranges of all aliased registers.
1881
- for (MCRegAliasIterator RAI (MO.getReg (), TRI, true ); RAI.isValid (); ++RAI)
1881
+ for (MCRegAliasIterator RAI (MO.getReg (), TRI, true );
1882
+ RAI.isValid () && *RAI < NumRegs; ++RAI)
1882
1883
// FIXME: Can we break out of this loop early if no insertion occurs?
1883
1884
DeadRegs.insert (*RAI);
1884
1885
} else if (MO.isRegMask ()) {
@@ -1952,7 +1953,8 @@ void InstrRefBasedLDV::transferRegisterDef(MachineInstr &MI) {
1952
1953
1953
1954
void InstrRefBasedLDV::performCopy (Register SrcRegNum, Register DstRegNum) {
1954
1955
// In all circumstances, re-def all aliases. It's definitely a new value now.
1955
- for (MCRegAliasIterator RAI (DstRegNum, TRI, true ); RAI.isValid (); ++RAI)
1956
+ for (MCRegAliasIterator RAI (DstRegNum, TRI, true );
1957
+ RAI.isValid () && *RAI < NumRegs; ++RAI)
1956
1958
MTracker->defReg (*RAI, CurBB, CurInst);
1957
1959
1958
1960
ValueIDNum SrcValue = MTracker->readReg (SrcRegNum);
@@ -2117,7 +2119,8 @@ bool InstrRefBasedLDV::transferSpillOrRestoreInst(MachineInstr &MI) {
2117
2119
// stack slot.
2118
2120
2119
2121
// Def all registers that alias the destination.
2120
- for (MCRegAliasIterator RAI (Reg, TRI, true ); RAI.isValid (); ++RAI)
2122
+ for (MCRegAliasIterator RAI (Reg, TRI, true );
2123
+ RAI.isValid () && *RAI < NumRegs; ++RAI)
2121
2124
MTracker->defReg (*RAI, CurBB, CurInst);
2122
2125
2123
2126
// Now find subregisters within the destination register, and load values
@@ -2302,11 +2305,12 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
2302
2305
// appropriate clobbers.
2303
2306
SmallVector<BitVector, 32 > BlockMasks;
2304
2307
BlockMasks.resize (MaxNumBlocks);
2308
+ NumRegs = TRI->getNumSupportedRegs (MF);
2305
2309
2306
2310
// Reserve one bit per register for the masks described above.
2307
- unsigned BVWords = MachineOperand::getRegMaskSize (TRI-> getNumRegs () );
2311
+ unsigned BVWords = MachineOperand::getRegMaskSize (NumRegs );
2308
2312
for (auto &BV : BlockMasks)
2309
- BV.resize (TRI-> getNumRegs () , true );
2313
+ BV.resize (NumRegs , true );
2310
2314
2311
2315
// Step through all instructions and inhale the transfer function.
2312
2316
for (auto &MBB : MF) {
@@ -2370,11 +2374,11 @@ void InstrRefBasedLDV::produceMLocTransferFunction(
2370
2374
}
2371
2375
2372
2376
// Compute a bitvector of all the registers that are tracked in this block.
2373
- BitVector UsedRegs (TRI-> getNumRegs () );
2377
+ BitVector UsedRegs (NumRegs );
2374
2378
for (auto Location : MTracker->locations ()) {
2375
2379
unsigned ID = MTracker->LocIdxToLocID [Location.Idx ];
2376
2380
// Ignore stack slots, and aliases of the stack pointer.
2377
- if (ID >= TRI-> getNumRegs () || MTracker->SPAliases .count (ID))
2381
+ if (ID >= NumRegs || MTracker->SPAliases .count (ID))
2378
2382
continue ;
2379
2383
UsedRegs.set (ID);
2380
2384
}
0 commit comments