1// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin10 < %s | FileCheck %s 2 3struct Test1S { 4 long NumDecls; 5 long X; 6 long Y; 7}; 8struct Test2S { 9 long NumDecls; 10 long X; 11}; 12 13// Make sure we don't generate extra memcpy for lvalues 14void test1a(struct Test1S, struct Test2S); 15// CHECK: define void @test1( 16// CHECK-NOT: memcpy 17// CHECK: call void @test1a 18void test1(struct Test1S *A, struct Test2S *B) { 19 test1a(*A, *B); 20} 21 22// The above gets tricker when the byval argument requires higher alignment 23// than the natural alignment of the type in question. 24// rdar://9483886 25 26// Make sure we do generate a memcpy when we cannot guarantee alignment. 27struct Test3S { 28 int a,b,c,d,e,f,g,h,i,j,k,l; 29}; 30void test2a(struct Test3S q); 31// CHECK: define void @test2( 32// CHECK: alloca %struct.Test3S, align 8 33// CHECK: memcpy 34// CHECK: call void @test2a 35void test2(struct Test3S *q) { 36 test2a(*q); 37} 38 39// But make sure we don't generate a memcpy when we can guarantee alignment. 40void fooey(void); 41// CHECK: define void @test3( 42// CHECK: alloca %struct.Test3S, align 8 43// CHECK: call void @fooey 44// CHECK-NOT: memcpy 45// CHECK: call void @test2a 46// CHECK-NOT: memcpy 47// CHECK: call void @test2a 48void test3(struct Test3S a) { 49 struct Test3S b = a; 50 fooey(); 51 test2a(a); 52 test2a(b); 53} 54