summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2008-07-11 07:18:52 +0000
committerBill Wendling <isanbard@gmail.com>2008-07-11 07:18:52 +0000
commit71ca353ae686ce9249eb333a48f12c1e4d47a319 (patch)
tree6a021684acf671671866acb72a8fcb2fe705ff7f
parentd01bee71705d11078b7db19a8e56503b974c8899 (diff)
downloadllvm-71ca353ae686ce9249eb333a48f12c1e4d47a319.tar.gz
llvm-71ca353ae686ce9249eb333a48f12c1e4d47a319.tar.bz2
llvm-71ca353ae686ce9249eb333a48f12c1e4d47a319.tar.xz
The frame address on an x86-64 box needs to be offset by -8, not -4.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53450 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp2
-rw-r--r--test/CodeGen/X86/x86-64-frameaddr.ll11
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 958f7425cd..5dd0116726 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -5348,7 +5348,7 @@ SDOperand X86TargetLowering::LowerFRAMEADDR(SDOperand Op, SelectionDAG &DAG) {
SDOperand RetAddrFI = getReturnAddressFrameIndex(DAG);
return DAG.getNode(ISD::SUB, getPointerTy(), RetAddrFI,
- DAG.getIntPtrConstant(4));
+ DAG.getIntPtrConstant(!Subtarget->is64Bit() ? 4 : 8));
}
SDOperand X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDOperand Op,
diff --git a/test/CodeGen/X86/x86-64-frameaddr.ll b/test/CodeGen/X86/x86-64-frameaddr.ll
new file mode 100644
index 0000000000..86a238f6ab
--- /dev/null
+++ b/test/CodeGen/X86/x86-64-frameaddr.ll
@@ -0,0 +1,11 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | grep {leaq -8(%rsp), %rax}
+@llvm.noinline = appending global [1 x i8*] [ i8* bitcast (i64* ()* @stack_end_address to i8*) ], section "llvm.metadata"
+
+define internal i64* @stack_end_address() nounwind {
+entry:
+ tail call i8* @llvm.frameaddress( i32 0 )
+ bitcast i8* %0 to i64*
+ ret i64* %1
+}
+
+declare i8* @llvm.frameaddress(i32) nounwind readnone