summaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/pr11468.ll
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-07-16 06:54:09 +0000
committerAlexey Samsonov <samsonov@google.com>2012-07-16 06:54:09 +0000
commit99a92f269d4ea6f13a9858bb883e13382d021120 (patch)
treeb158cfaac30e00e48d05b2fa0151950bd0df773b /test/CodeGen/X86/pr11468.ll
parent38f488e46292e38c776dd6ec3e3a0b8c57952fcb (diff)
downloadllvm-99a92f269d4ea6f13a9858bb883e13382d021120.tar.gz
llvm-99a92f269d4ea6f13a9858bb883e13382d021120.tar.bz2
llvm-99a92f269d4ea6f13a9858bb883e13382d021120.tar.xz
This CL changes the function prologue and epilogue emitted on X86 when stack needs realignment.
It is intended to fix PR11468. Old prologue and epilogue looked like this: push %rbp mov %rsp, %rbp and $alignment, %rsp push %r14 push %r15 ... pop %r15 pop %r14 mov %rbp, %rsp pop %rbp The problem was to reference the locations of callee-saved registers in exception handling: locations of callee-saved had to be re-calculated regarding the stack alignment operation. It would take some effort to implement this in LLVM, as currently MachineLocation can only have the form "Register + Offset". Funciton prologue and epilogue are now changed to: push %rbp mov %rsp, %rbp push %14 push %15 and $alignment, %rsp ... lea -$size_of_saved_registers(%rbp), %rsp pop %r15 pop %r14 pop %rbp Reviewed by Chad Rosier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160248 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86/pr11468.ll')
-rw-r--r--test/CodeGen/X86/pr11468.ll33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/CodeGen/X86/pr11468.ll b/test/CodeGen/X86/pr11468.ll
new file mode 100644
index 0000000000..f7e9adb4a2
--- /dev/null
+++ b/test/CodeGen/X86/pr11468.ll
@@ -0,0 +1,33 @@
+; RUN: llc < %s -force-align-stack -stack-alignment=32 -march=x86-64 -mattr=+avx -mtriple=i686-apple-darwin10 | FileCheck %s
+; PR11468
+
+define void @f(i64 %sz) uwtable {
+entry:
+ %a = alloca i32, align 32
+ store volatile i32 0, i32* %a, align 32
+ ; force to push r14 on stack
+ call void asm sideeffect "nop", "~{r14},~{dirflag},~{fpsr},~{flags}"() nounwind, !srcloc !0
+ ret void
+
+; CHECK: _f
+; CHECK: pushq %rbp
+; CHECK: .cfi_offset %rbp, -16
+; CHECK: movq %rsp, %rbp
+; CHECK: .cfi_def_cfa_register %rbp
+
+; We first push register on stack, and then realign it, so that
+; .cfi_offset value is correct
+; CHECK: pushq %r14
+; CHECK: andq $-32, %rsp
+; CHECK: .cfi_offset %r14, -24
+
+; Restore %rsp from %rbp and subtract the total size of saved regsiters.
+; CHECK: leaq -8(%rbp), %rsp
+
+; Pop saved registers.
+; CHECK: popq %r14
+; CHECK: popq %rbp
+}
+
+!0 = metadata !{i32 125}
+