diff options
author | Charles Davis <cdavis5x@gmail.com> | 2016-04-09 23:34:42 +0000 |
---|---|---|
committer | Charles Davis <cdavis5x@gmail.com> | 2016-04-09 23:34:42 +0000 |
commit | 2f65f35c271f39454b3490238b0eb69e57cb5f65 (patch) | |
tree | 286130f9c0a4875346e96ef511f3d6caff1ad719 /llvm/test/CodeGen/X86/stack-align.ll | |
parent | eeae124faf3be90af5248b18f734072d071aa776 (diff) | |
download | bcm5719-llvm-2f65f35c271f39454b3490238b0eb69e57cb5f65.tar.gz bcm5719-llvm-2f65f35c271f39454b3490238b0eb69e57cb5f65.zip |
[CodeGen] Don't assume that fixed stack objects are aligned in a stack-realigned function.
Summary:
After we make the adjustment, we can assume that for local allocas, but
not for stack parameters, the return address, or any other fixed stack
object (which has a negative offset and therefore lies prior to the
adjusted SP).
Fixes PR26662.
Reviewers: hfinkel, qcolombet, rnk
Subscribers: rnk, llvm-commits
Differential Revision: http://reviews.llvm.org/D18471
llvm-svn: 265886
Diffstat (limited to 'llvm/test/CodeGen/X86/stack-align.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/stack-align.ll | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/stack-align.ll b/llvm/test/CodeGen/X86/stack-align.ll index 0cff95f266a..04bae023984 100644 --- a/llvm/test/CodeGen/X86/stack-align.ll +++ b/llvm/test/CodeGen/X86/stack-align.ll @@ -61,3 +61,31 @@ entry: ; CHECK-NOT: and ; CHECK: ret } + +%struct.sixteen = type { [16 x i8] } + +; Accessing stack parameters shouldn't assume stack alignment. Here we should +; emit two 8-byte loads, followed by two 8-byte stores. +define x86_stdcallcc void @test5(%struct.sixteen* byval nocapture readonly align 4 %s) #0 { + %d.sroa.0 = alloca [16 x i8], align 1 + %1 = getelementptr inbounds [16 x i8], [16 x i8]* %d.sroa.0, i32 0, i32 0 + call void @llvm.lifetime.start(i64 16, i8* %1) + %2 = getelementptr inbounds %struct.sixteen, %struct.sixteen* %s, i32 0, i32 0, i32 0 + call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %2, i32 16, i32 1, i1 true) + call void @llvm.lifetime.end(i64 16, i8* %1) + ret void +; CHECK-LABEL: test5: +; CHECK: and +; CHECK: movsd +; CHECK-NEXT: movsd +; CHECK-NEXT: movsd +; CHECK-NEXT: movsd +} + +declare void @llvm.lifetime.start(i64, i8* nocapture) argmemonly nounwind + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) argmemonly nounwind + +declare void @llvm.lifetime.end(i64, i8* nocapture) argmemonly nounwind + +attributes #0 = { nounwind alignstack=16 "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" } |