[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