summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/stack-align.ll
diff options
context:
space:
mode:
authorCharles Davis <cdavis5x@gmail.com>2016-04-09 23:34:42 +0000
committerCharles Davis <cdavis5x@gmail.com>2016-04-09 23:34:42 +0000
commit2f65f35c271f39454b3490238b0eb69e57cb5f65 (patch)
tree286130f9c0a4875346e96ef511f3d6caff1ad719 /llvm/test/CodeGen/X86/stack-align.ll
parenteeae124faf3be90af5248b18f734072d071aa776 (diff)
downloadbcm5719-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.ll28
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" }
OpenPOWER on IntegriCloud