If target decides to create an emergency spill slot, make sure it's closest to SP or frame pointer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34965 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2007-03-06 10:02:38 +00:00
parent b74a3e6fda
commit 87f8bf65dd

View File

@ -39,6 +39,9 @@ namespace {
/// frame indexes with appropriate references. /// frame indexes with appropriate references.
/// ///
bool runOnMachineFunction(MachineFunction &Fn) { bool runOnMachineFunction(MachineFunction &Fn) {
const MRegisterInfo *MRI = Fn.getTarget().getRegisterInfo();
RS = MRI->requiresRegisterScavenging(Fn) ? new RegScavenger() : NULL;
// Get MachineModuleInfo so that we can track the construction of the // Get MachineModuleInfo so that we can track the construction of the
// frame. // frame.
if (MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>()) { if (MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>()) {
@ -47,8 +50,7 @@ namespace {
// Allow the target machine to make some adjustments to the function // Allow the target machine to make some adjustments to the function
// e.g. UsedPhysRegs before calculateCalleeSavedRegisters. // e.g. UsedPhysRegs before calculateCalleeSavedRegisters.
Fn.getTarget().getRegisterInfo() MRI->processFunctionBeforeCalleeSavedScan(Fn, RS);
->processFunctionBeforeCalleeSavedScan(Fn);
// Scan the function for modified callee saved registers and insert spill // Scan the function for modified callee saved registers and insert spill
// code for any callee saved registers that are modified. Also calculate // code for any callee saved registers that are modified. Also calculate
@ -78,10 +80,13 @@ namespace {
// //
replaceFrameIndices(Fn); replaceFrameIndices(Fn);
delete RS;
return true; return true;
} }
private: private:
RegScavenger *RS;
// MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved
// stack frame indexes. // stack frame indexes.
unsigned MinCSFrameIndex, MaxCSFrameIndex; unsigned MinCSFrameIndex, MaxCSFrameIndex;
@ -363,11 +368,37 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
} }
} }
// Make sure the special register scavenging spill slot is closest to the
// frame pointer if a frame pointer is required.
const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
if (RS && RegInfo->hasFP(Fn)) {
int SFI = RS->getScavengingFrameIndex();
if (SFI >= 0) {
// If stack grows down, we need to add size of find the lowest
// address of the object.
if (StackGrowsDown)
Offset += FFI->getObjectSize(SFI);
unsigned Align = FFI->getObjectAlignment(SFI);
// Adjust to alignment boundary
Offset = (Offset+Align-1)/Align*Align;
if (StackGrowsDown) {
FFI->setObjectOffset(SFI, -Offset); // Set the computed offset
} else {
FFI->setObjectOffset(SFI, Offset);
Offset += FFI->getObjectSize(SFI);
}
}
}
// Then assign frame offsets to stack objects that are not used to spill // Then assign frame offsets to stack objects that are not used to spill
// callee saved registers. // callee saved registers.
for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) { for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
if (i >= MinCSFrameIndex && i <= MaxCSFrameIndex) if (i >= MinCSFrameIndex && i <= MaxCSFrameIndex)
continue; continue;
if (RS && (int)i == RS->getScavengingFrameIndex())
continue;
// If stack grows down, we need to add size of find the lowest // If stack grows down, we need to add size of find the lowest
// address of the object. // address of the object.
@ -389,10 +420,32 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
} }
} }
// Make sure the special register scavenging spill slot is closest to the
// stack pointer.
if (RS) {
int SFI = RS->getScavengingFrameIndex();
if (SFI >= 0) {
// If stack grows down, we need to add size of find the lowest
// address of the object.
if (StackGrowsDown)
Offset += FFI->getObjectSize(SFI);
unsigned Align = FFI->getObjectAlignment(SFI);
// Adjust to alignment boundary
Offset = (Offset+Align-1)/Align*Align;
if (StackGrowsDown) {
FFI->setObjectOffset(SFI, -Offset); // Set the computed offset
} else {
FFI->setObjectOffset(SFI, Offset);
Offset += FFI->getObjectSize(SFI);
}
}
}
// Round up the size to a multiple of the alignment, but only if there are // Round up the size to a multiple of the alignment, but only if there are
// calls or alloca's in the function. This ensures that any calls to // calls or alloca's in the function. This ensures that any calls to
// subroutines have their stack frames suitable aligned. // subroutines have their stack frames suitable aligned.
const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
if (!RegInfo->targetHandlesStackFrameRounding() && if (!RegInfo->targetHandlesStackFrameRounding() &&
(FFI->hasCalls() || FFI->hasVarSizedObjects())) { (FFI->hasCalls() || FFI->hasVarSizedObjects())) {
// When we have no frame pointer, we reserve argument space for call sites // When we have no frame pointer, we reserve argument space for call sites
@ -442,7 +495,6 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
const TargetMachine &TM = Fn.getTarget(); const TargetMachine &TM = Fn.getTarget();
assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!"); assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
const MRegisterInfo &MRI = *TM.getRegisterInfo(); const MRegisterInfo &MRI = *TM.getRegisterInfo();
RegScavenger *RS=MRI.requiresRegisterScavenging(Fn) ? new RegScavenger():NULL;
for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
if (RS) RS->enterBasicBlock(BB); if (RS) RS->enterBasicBlock(BB);
@ -458,7 +510,4 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
if (RS) RS->forward(I); if (RS) RS->forward(I);
} }
} }
delete RS;
} }