forked from OSchip/llvm-project
Radar 7636153. In the presence of large call frames, it's not sufficient
for ARM to just check if a function has a FP to determine if it's safe to simplify the stack adjustment pseudo ops prior to eliminating frame indices. Allow targets to override the default behavior and does so for ARM and Thumb2. llvm-svn: 96634
This commit is contained in:
parent
2446f57503
commit
aa34003f6f
|
@ -587,6 +587,17 @@ public:
|
|||
return !hasFP(MF);
|
||||
}
|
||||
|
||||
/// canSimplifyCallFramePseudos - When possible, it's best to simplify the
|
||||
/// call frame pseudo ops before doing frame index elimination. This is
|
||||
/// possible only when frame index references between the pseudos won't
|
||||
/// need adjusted for the call frame adjustments. Normally, that's true
|
||||
/// if the function has a reserved call frame or a frame pointer. Some
|
||||
/// targets (Thumb2, for example) may have more complicated criteria,
|
||||
/// however, and can override this behavior.
|
||||
virtual bool canSimplifyCallFramePseudos(MachineFunction &MF) const {
|
||||
return hasReservedCallFrame(MF) || hasFP(MF);
|
||||
}
|
||||
|
||||
/// hasReservedSpillSlot - Return true if target has reserved a spill slot in
|
||||
/// the stack frame of the given function for the specified register. e.g. On
|
||||
/// x86, if the frame register is required, the first fixed stack object is
|
||||
|
|
|
@ -175,9 +175,10 @@ void PEI::calculateCallsInformation(MachineFunction &Fn) {
|
|||
MachineBasicBlock::iterator I = *i;
|
||||
|
||||
// If call frames are not being included as part of the stack frame, and
|
||||
// there is no dynamic allocation (therefore referencing frame slots off
|
||||
// sp), leave the pseudo ops alone. We'll eliminate them later.
|
||||
if (RegInfo->hasReservedCallFrame(Fn) || RegInfo->hasFP(Fn))
|
||||
// the target doesn't indicate otherwise, remove the call frame pseudos
|
||||
// here. The sub/add sp instruction pairs are still inserted, but we don't
|
||||
// need to track the SP adjustment for frame index elimination.
|
||||
if (RegInfo->canSimplifyCallFramePseudos(Fn))
|
||||
RegInfo->eliminateCallFramePseudoInstr(Fn, *I->getParent(), I);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1085,6 +1085,16 @@ hasReservedCallFrame(MachineFunction &MF) const {
|
|||
return !MF.getFrameInfo()->hasVarSizedObjects();
|
||||
}
|
||||
|
||||
// canSimplifyCallFramePseudos - If there is a reserved call frame, the
|
||||
// call frame pseudos can be simplified. Unlike most targets, having a FP
|
||||
// is not sufficient here since we still may reference some objects via SP
|
||||
// even when FP is available in Thumb2 mode.
|
||||
bool ARMBaseRegisterInfo::
|
||||
canSimplifyCallFramePseudos(MachineFunction &MF) const {
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
return hasReservedCallFrame(MF) || (AFI->isThumb1OnlyFunction() && hasFP(MF));
|
||||
}
|
||||
|
||||
static void
|
||||
emitSPUpdate(bool isARM,
|
||||
MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
|
||||
|
@ -1149,7 +1159,6 @@ ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
|||
MachineInstr &MI = *II;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
|
||||
assert(!AFI->isThumb1OnlyFunction() &&
|
||||
"This eliminateFrameIndex does not support Thumb1!");
|
||||
|
@ -1160,12 +1169,12 @@ ARMBaseRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
|||
}
|
||||
|
||||
int FrameIndex = MI.getOperand(i).getIndex();
|
||||
int Offset = MFI->getObjectOffset(FrameIndex) + MFI->getStackSize() + SPAdj;
|
||||
unsigned FrameReg;
|
||||
|
||||
Offset = getFrameIndexReference(MF, FrameIndex, FrameReg);
|
||||
int Offset = getFrameIndexReference(MF, FrameIndex, FrameReg);
|
||||
if (FrameReg != ARM::SP)
|
||||
SPAdj = 0;
|
||||
Offset += SPAdj;
|
||||
|
||||
// Modify MI as necessary to handle as much of 'Offset' as possible
|
||||
bool Done = false;
|
||||
|
|
|
@ -138,6 +138,7 @@ public:
|
|||
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const;
|
||||
|
||||
virtual bool hasReservedCallFrame(MachineFunction &MF) const;
|
||||
virtual bool canSimplifyCallFramePseudos(MachineFunction &MF) const;
|
||||
|
||||
virtual void eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
|
|
Loading…
Reference in New Issue