155d484802f3e27930317739efc5f5956b78aac25Eli Friedman// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin10 < %s | FileCheck %s
255d484802f3e27930317739efc5f5956b78aac25Eli Friedman
355d484802f3e27930317739efc5f5956b78aac25Eli Friedmanstruct Test1S {
455d484802f3e27930317739efc5f5956b78aac25Eli Friedman long NumDecls;
555d484802f3e27930317739efc5f5956b78aac25Eli Friedman long X;
655d484802f3e27930317739efc5f5956b78aac25Eli Friedman long Y;
755d484802f3e27930317739efc5f5956b78aac25Eli Friedman};
855d484802f3e27930317739efc5f5956b78aac25Eli Friedmanstruct Test2S {
955d484802f3e27930317739efc5f5956b78aac25Eli Friedman long NumDecls;
1055d484802f3e27930317739efc5f5956b78aac25Eli Friedman long X;
1155d484802f3e27930317739efc5f5956b78aac25Eli Friedman};
1255d484802f3e27930317739efc5f5956b78aac25Eli Friedman
1355d484802f3e27930317739efc5f5956b78aac25Eli Friedman// Make sure we don't generate extra memcpy for lvalues
1455d484802f3e27930317739efc5f5956b78aac25Eli Friedmanvoid test1a(struct Test1S, struct Test2S);
1593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test1(
1655d484802f3e27930317739efc5f5956b78aac25Eli Friedman// CHECK-NOT: memcpy
1755d484802f3e27930317739efc5f5956b78aac25Eli Friedman// CHECK: call void @test1a
1855d484802f3e27930317739efc5f5956b78aac25Eli Friedmanvoid test1(struct Test1S *A, struct Test2S *B) {
1955d484802f3e27930317739efc5f5956b78aac25Eli Friedman  test1a(*A, *B);
2055d484802f3e27930317739efc5f5956b78aac25Eli Friedman}
21ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman
22ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// The above gets tricker when the byval argument requires higher alignment
23ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// than the natural alignment of the type in question.
24ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// rdar://9483886
25ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman
26ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// Make sure we do generate a memcpy when we cannot guarantee alignment.
27ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedmanstruct Test3S {
28ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  int a,b,c,d,e,f,g,h,i,j,k,l;
29ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman};
30ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedmanvoid test2a(struct Test3S q);
3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test2(
32ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: alloca %struct.Test3S, align 8
33ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: memcpy
34ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: call void @test2a
35ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedmanvoid test2(struct Test3S *q) {
36ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  test2a(*q);
37ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman}
38ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman
39ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// But make sure we don't generate a memcpy when we can guarantee alignment.
40ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedmanvoid fooey(void);
4193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test3(
42ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: alloca %struct.Test3S, align 8
43ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: call void @fooey
44ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK-NOT: memcpy
45ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: call void @test2a
46ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK-NOT: memcpy
47ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman// CHECK: call void @test2a
48ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedmanvoid test3(struct Test3S a) {
49ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  struct Test3S b = a;
50ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  fooey();
51ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  test2a(a);
52ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman  test2a(b);
53ea5e4da116aae0eb932d32b73e7cec2f04932248Eli Friedman}
54