properly check for whether base regs were inserted

llvm-svn: 111646
This commit is contained in:
Jim Grosbach 2010-08-20 16:48:30 +00:00
parent ae8ea1f715
commit 0600691fe6
1 changed files with 7 additions and 4 deletions

View File

@ -48,7 +48,7 @@ namespace {
void AdjustStackOffset(MachineFrameInfo *MFI, int FrameIdx, int64_t &Offset, void AdjustStackOffset(MachineFrameInfo *MFI, int FrameIdx, int64_t &Offset,
unsigned &MaxAlign); unsigned &MaxAlign);
void calculateFrameObjectOffsets(MachineFunction &Fn); void calculateFrameObjectOffsets(MachineFunction &Fn);
void insertFrameReferenceRegisters(MachineFunction &Fn); bool insertFrameReferenceRegisters(MachineFunction &Fn);
public: public:
static char ID; // Pass identification, replacement for typeid static char ID; // Pass identification, replacement for typeid
explicit LocalStackSlotPass() : MachineFunctionPass(ID) { } explicit LocalStackSlotPass() : MachineFunctionPass(ID) { }
@ -87,14 +87,14 @@ bool LocalStackSlotPass::runOnMachineFunction(MachineFunction &MF) {
calculateFrameObjectOffsets(MF); calculateFrameObjectOffsets(MF);
// Insert virtual base registers to resolve frame index references. // Insert virtual base registers to resolve frame index references.
insertFrameReferenceRegisters(MF); bool UsedBaseRegs = insertFrameReferenceRegisters(MF);
// Tell MFI whether any base registers were allocated. PEI will only // Tell MFI whether any base registers were allocated. PEI will only
// want to use the local block allocations from this pass if there were any. // want to use the local block allocations from this pass if there were any.
// Otherwise, PEI can do a bit better job of getting the alignment right // Otherwise, PEI can do a bit better job of getting the alignment right
// without a hole at the start since it knows the alignment of the stack // without a hole at the start since it knows the alignment of the stack
// at the start of local allocation, and this pass doesn't. // at the start of local allocation, and this pass doesn't.
MFI->setUseLocalStackAllocationBlock(NumBaseRegisters > 0); MFI->setUseLocalStackAllocationBlock(UsedBaseRegs);
return true; return true;
} }
@ -188,13 +188,14 @@ lookupCandidateBaseReg(const SmallVector<std::pair<unsigned, int64_t>, 8> &Regs,
return false; return false;
} }
void LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) { bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
// Scan the function's instructions looking for frame index references. // Scan the function's instructions looking for frame index references.
// For each, ask the target if it wants a virtual base register for it // For each, ask the target if it wants a virtual base register for it
// based on what we can tell it about where the local will end up in the // based on what we can tell it about where the local will end up in the
// stack frame. If it wants one, re-use a suitable one we've previously // stack frame. If it wants one, re-use a suitable one we've previously
// allocated, or if there isn't one that fits the bill, allocate a new one // allocated, or if there isn't one that fits the bill, allocate a new one
// and ask the target to create a defining instruction for it. // and ask the target to create a defining instruction for it.
bool UsedBaseReg = false;
MachineFrameInfo *MFI = Fn.getFrameInfo(); MachineFrameInfo *MFI = Fn.getFrameInfo();
const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo(); const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo();
@ -274,6 +275,7 @@ void LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
std::pair<unsigned, int64_t>(BaseReg, std::pair<unsigned, int64_t>(BaseReg,
LocalOffsets[FrameIdx] + InstrOffset)); LocalOffsets[FrameIdx] + InstrOffset));
++NumBaseRegisters; ++NumBaseRegisters;
UsedBaseReg = true;
} }
assert(BaseReg != 0 && "Unable to allocate virtual base register!"); assert(BaseReg != 0 && "Unable to allocate virtual base register!");
@ -288,4 +290,5 @@ void LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
} }
} }
} }
return UsedBaseReg;
} }