diff options
Diffstat (limited to 'test/CodeGen/X86/stack-align.ll')
-rw-r--r-- | test/CodeGen/X86/stack-align.ll | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/test/CodeGen/X86/stack-align.ll b/test/CodeGen/X86/stack-align.ll index 0cff95f266a9e..04bae023984f1 100644 --- a/test/CodeGen/X86/stack-align.ll +++ b/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" } |