[llvm-branch-commits] [llvm-branch] r102597 - in /llvm/branches/Apple/Morbo: lib/Target/X86/X86RegisterInfo.cpp test/CodeGen/X86/sibcall-2.ll
Evan Cheng
evan.cheng at apple.com
Wed Apr 28 22:18:22 PDT 2010
Author: evancheng
Date: Thu Apr 29 00:18:22 2010
New Revision: 102597
URL: http://llvm.org/viewvc/llvm-project?rev=102597&view=rev
Log:
Merge 102596.
Added:
llvm/branches/Apple/Morbo/test/CodeGen/X86/sibcall-2.ll
- copied unchanged from r102596, llvm/trunk/test/CodeGen/X86/sibcall-2.ll
Modified:
llvm/branches/Apple/Morbo/lib/Target/X86/X86RegisterInfo.cpp
Modified: llvm/branches/Apple/Morbo/lib/Target/X86/X86RegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Morbo/lib/Target/X86/X86RegisterInfo.cpp?rev=102597&r1=102596&r2=102597&view=diff
==============================================================================
--- llvm/branches/Apple/Morbo/lib/Target/X86/X86RegisterInfo.cpp (original)
+++ llvm/branches/Apple/Morbo/lib/Target/X86/X86RegisterInfo.cpp Thu Apr 29 00:18:22 2010
@@ -614,8 +614,12 @@
int FrameIndex = MI.getOperand(i).getIndex();
unsigned BasePtr;
+ unsigned Opc = MI.getOpcode();
+ bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm;
if (needsStackRealignment(MF))
BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
+ else if (AfterFPPop)
+ BasePtr = StackPtr;
else
BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
@@ -624,16 +628,22 @@
MI.getOperand(i).ChangeToRegister(BasePtr, 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 TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
+ const MachineFrameInfo *MFI = MF.getFrameInfo();
+ FIOffset = MFI->getObjectOffset(FrameIndex) - TFI.getOffsetOfLocalArea();
+ } else
+ FIOffset = getFrameIndexOffset(MF, FrameIndex);
+
if (MI.getOperand(i+3).isImm()) {
// Offset is a 32-bit integer.
- int Offset = getFrameIndexOffset(MF, FrameIndex) +
- (int)(MI.getOperand(i + 3).getImm());
-
+ int Offset = FIOffset + (int)(MI.getOperand(i + 3).getImm());
MI.getOperand(i + 3).ChangeToImmediate(Offset);
} else {
// Offset is symbolic. This is extremely rare.
- uint64_t Offset = getFrameIndexOffset(MF, FrameIndex) +
- (uint64_t)MI.getOperand(i+3).getOffset();
+ uint64_t Offset = FIOffset + (uint64_t)MI.getOperand(i+3).getOffset();
MI.getOperand(i+3).setOffset(Offset);
}
return 0;
More information about the llvm-branch-commits
mailing list