diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-07-10 17:45:53 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-07-10 17:45:53 +0000 |
commit | 3f0dbab963197cadb32f70e1ee1a106fe35f5c8e (patch) | |
tree | d193668b79f9732c443c51f2080eab246abbf925 /test/CodeGen/X86 | |
parent | 1b8da1d8f14f91b88ff99d3bd5ec4d904cdf21b7 (diff) | |
download | external_llvm-3f0dbab963197cadb32f70e1ee1a106fe35f5c8e.zip external_llvm-3f0dbab963197cadb32f70e1ee1a106fe35f5c8e.tar.gz external_llvm-3f0dbab963197cadb32f70e1ee1a106fe35f5c8e.tar.bz2 |
Add support for dynamic stack realignment in the presence of dynamic allocas on
X86. Basically, this is a reapplication of r158087 with a few fixes.
Specifically, (1) the stack pointer is restored from the base pointer before
popping callee-saved registers and (2) in obscure cases (see comments in patch)
we must cache the value of the original stack adjustment in the prologue and
apply it in the epilogue.
rdar://11496434
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160002 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86')
-rw-r--r-- | test/CodeGen/X86/alloca-align-rounding-32.ll | 1 | ||||
-rw-r--r-- | test/CodeGen/X86/alloca-align-rounding.ll | 1 | ||||
-rw-r--r-- | test/CodeGen/X86/force-align-stack-alloca.ll | 21 |
3 files changed, 18 insertions, 5 deletions
diff --git a/test/CodeGen/X86/alloca-align-rounding-32.ll b/test/CodeGen/X86/alloca-align-rounding-32.ll index 8a8b044..a45284e 100644 --- a/test/CodeGen/X86/alloca-align-rounding-32.ll +++ b/test/CodeGen/X86/alloca-align-rounding-32.ll @@ -15,5 +15,6 @@ define void @foo2(i32 %h) { call void @bar(<2 x i64>* %p) ret void ; CHECK: foo2 +; CHECK: andl $-32, %esp ; CHECK: andl $-32, %eax } diff --git a/test/CodeGen/X86/alloca-align-rounding.ll b/test/CodeGen/X86/alloca-align-rounding.ll index 7bc8806..3d76fb0 100644 --- a/test/CodeGen/X86/alloca-align-rounding.ll +++ b/test/CodeGen/X86/alloca-align-rounding.ll @@ -15,5 +15,6 @@ define void @foo2(i64 %h) { call void @bar(<2 x i64>* %p) ret void ; CHECK: foo2 +; CHECK: andq $-32, %rsp ; CHECK: andq $-32, %rax } diff --git a/test/CodeGen/X86/force-align-stack-alloca.ll b/test/CodeGen/X86/force-align-stack-alloca.ll index 48f963f..ecef781 100644 --- a/test/CodeGen/X86/force-align-stack-alloca.ll +++ b/test/CodeGen/X86/force-align-stack-alloca.ll @@ -17,10 +17,15 @@ entry: define i64 @g(i32 %i) nounwind { ; CHECK: g: -; CHECK: pushl +; CHECK: pushl %ebp ; CHECK-NEXT: movl %esp, %ebp +; CHECK-NEXT: andl $-32, %esp ; CHECK-NEXT: pushl -; CHECK-NEXT: subl $20, %esp +; CHECK-NEXT: pushl +; CHECK-NEXT: subl $24, %esp +; +; Now setup the base pointer (%ebx). +; CHECK-NEXT: movl %esp, %ebx ; CHECK-NOT: {{[^ ,]*}}, %esp ; ; The next adjustment of the stack is due to the alloca. @@ -41,12 +46,18 @@ define i64 @g(i32 %i) nounwind { ; CHECK-NEXT: addl $32, %esp ; CHECK-NOT: {{[^ ,]*}}, %esp ; -; Finally we nede to restore %esp from %ebp, the alloca prevents us from -; restoring it directly. +; Restore %esp from %ebx (base pointer) so we can pop the callee-saved +; registers. This is the state prior to the allocation of VLAs. ; CHECK-NOT: popl -; CHECK: leal -4(%ebp), %esp +; CHECK: movl %ebx, %esp +; CHECK-NEXT: addl $24, %esp ; CHECK-NEXT: popl ; CHECK-NEXT: popl +; +; Finally we need to restore %esp from %ebp due to dynamic stack +; realignment. +; CHECK-NEXT: movl %ebp, %esp +; CHECK-NEXT: popl %ebp ; CHECK-NEXT: ret entry: |