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