diff options
Diffstat (limited to 'test/CodeGen')
-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 8a8b044d14..a45284e10c 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 7bc880625c..3d76fb0aa2 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 48f963f58e..ecef781f88 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: |