mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-21 03:37:47 +00:00
X86RegisterInfo: eliminateFrameIndex: Avoid code duplication; NFC
Re-Commit of r300922 and r300923 with less aggressive assert (see discussion at the end of https://reviews.llvm.org/D32205) X86RegisterInfo::eliminateFrameIndex() and X86FrameLowering::getFrameIndexReference() both had logic to compute the base register. This consolidates the code. Also use MachineInstr::isReturn instead of manually enumerating tail call instructions (return instructions were not included in the previous list because they never reference frame indexes). Differential Revision: https://reviews.llvm.org/D32206 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301211 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fc7e04007e
commit
1a8fba0ab2
@ -1783,6 +1783,14 @@ int X86FrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
|
||||
return Offset + FPDelta;
|
||||
}
|
||||
|
||||
int X86FrameLowering::getFrameIndexReferenceSP(const MachineFunction &MF,
|
||||
int FI, unsigned &FrameReg,
|
||||
int Adjustment) const {
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
FrameReg = TRI->getStackRegister();
|
||||
return MFI.getObjectOffset(FI) - getOffsetOfLocalArea() + Adjustment;
|
||||
}
|
||||
|
||||
int
|
||||
X86FrameLowering::getFrameIndexReferencePreferSP(const MachineFunction &MF,
|
||||
int FI, unsigned &FrameReg,
|
||||
@ -1839,9 +1847,6 @@ X86FrameLowering::getFrameIndexReferencePreferSP(const MachineFunction &MF,
|
||||
assert(MF.getInfo<X86MachineFunctionInfo>()->getTCReturnAddrDelta() >= 0 &&
|
||||
"we don't handle this case!");
|
||||
|
||||
// Fill in FrameReg output argument.
|
||||
FrameReg = TRI->getStackRegister();
|
||||
|
||||
// This is how the math works out:
|
||||
//
|
||||
// %rsp grows (i.e. gets lower) left to right. Each box below is
|
||||
@ -1866,12 +1871,8 @@ X86FrameLowering::getFrameIndexReferencePreferSP(const MachineFunction &MF,
|
||||
// (C - E) == (C - A) - (B - A) + (B - E)
|
||||
// { Using [1], [2] and [3] above }
|
||||
// == getObjectOffset - LocalAreaOffset + StackSize
|
||||
//
|
||||
|
||||
// Get the Offset from the StackPointer
|
||||
int Offset = MFI.getObjectOffset(FI) - getOffsetOfLocalArea();
|
||||
|
||||
return Offset + StackSize;
|
||||
return getFrameIndexReferenceSP(MF, FI, FrameReg, StackSize);
|
||||
}
|
||||
|
||||
bool X86FrameLowering::assignCalleeSavedSpillSlots(
|
||||
|
@ -100,6 +100,8 @@ public:
|
||||
int getFrameIndexReference(const MachineFunction &MF, int FI,
|
||||
unsigned &FrameReg) const override;
|
||||
|
||||
int getFrameIndexReferenceSP(const MachineFunction &MF,
|
||||
int FI, unsigned &SPReg, int Adjustment) const;
|
||||
int getFrameIndexReferencePreferSP(const MachineFunction &MF, int FI,
|
||||
unsigned &FrameReg,
|
||||
bool IgnoreSPUpdates) const override;
|
||||
|
@ -669,32 +669,28 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
MachineFunction &MF = *MI.getParent()->getParent();
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
|
||||
|
||||
// Determine base register and offset.
|
||||
int FIOffset;
|
||||
unsigned BasePtr;
|
||||
|
||||
unsigned Opc = MI.getOpcode();
|
||||
bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm ||
|
||||
Opc == X86::TCRETURNmi || Opc == X86::TCRETURNmi64;
|
||||
|
||||
if (hasBasePointer(MF))
|
||||
BasePtr = (FrameIndex < 0 ? FramePtr : getBaseRegister());
|
||||
else if (needsStackRealignment(MF))
|
||||
BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
|
||||
else if (AfterFPPop)
|
||||
BasePtr = StackPtr;
|
||||
else
|
||||
BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr);
|
||||
if (MI.isReturn()) {
|
||||
assert((!needsStackRealignment(MF) ||
|
||||
MF.getFrameInfo().isFixedObjectIndex(FrameIndex)) &&
|
||||
"Return instruction can only reference SP relative frame objects");
|
||||
FIOffset = TFI->getFrameIndexReferenceSP(MF, FrameIndex, BasePtr, 0);
|
||||
} else {
|
||||
FIOffset = TFI->getFrameIndexReference(MF, FrameIndex, BasePtr);
|
||||
}
|
||||
|
||||
// LOCAL_ESCAPE uses a single offset, with no register. It only works in the
|
||||
// simple FP case, and doesn't work with stack realignment. On 32-bit, the
|
||||
// offset is from the traditional base pointer location. On 64-bit, the
|
||||
// offset is from the SP at the end of the prologue, not the FP location. This
|
||||
// matches the behavior of llvm.frameaddress.
|
||||
unsigned IgnoredFrameReg;
|
||||
unsigned Opc = MI.getOpcode();
|
||||
if (Opc == TargetOpcode::LOCAL_ESCAPE) {
|
||||
MachineOperand &FI = MI.getOperand(FIOperandNum);
|
||||
int Offset;
|
||||
Offset = TFI->getFrameIndexReference(MF, FrameIndex, IgnoredFrameReg);
|
||||
FI.ChangeToImmediate(Offset);
|
||||
FI.ChangeToImmediate(FIOffset);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -710,15 +706,6 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
// FrameIndex with base register. Add an offset to the offset.
|
||||
MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr, false);
|
||||
|
||||
// Now add the frame object offset to the offset from EBP.
|
||||
int FIOffset;
|
||||
if (AfterFPPop) {
|
||||
// Tail call jmp happens after FP is popped.
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
FIOffset = MFI.getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea();
|
||||
} else
|
||||
FIOffset = TFI->getFrameIndexReference(MF, FrameIndex, IgnoredFrameReg);
|
||||
|
||||
if (BasePtr == StackPtr)
|
||||
FIOffset += SPAdj;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user