forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin10 < %s | FileCheck %s
 | |
| 
 | |
| struct Test1S {
 | |
|  long NumDecls;
 | |
|  long X;
 | |
|  long Y;
 | |
| };
 | |
| struct Test2S {
 | |
|  long NumDecls;
 | |
|  long X;
 | |
| };
 | |
| 
 | |
| // Make sure we don't generate extra memcpy for lvalues
 | |
| void test1a(struct Test1S, struct Test2S);
 | |
| // CHECK-LABEL: define void @test1(
 | |
| // CHECK-NOT: memcpy
 | |
| // CHECK: call void @test1a
 | |
| void test1(struct Test1S *A, struct Test2S *B) {
 | |
|   test1a(*A, *B);
 | |
| }
 | |
| 
 | |
| // The above gets tricker when the byval argument requires higher alignment
 | |
| // than the natural alignment of the type in question.
 | |
| // rdar://9483886
 | |
| 
 | |
| // Make sure we do generate a memcpy when we cannot guarantee alignment.
 | |
| struct Test3S {
 | |
|   int a,b,c,d,e,f,g,h,i,j,k,l;
 | |
| };
 | |
| void test2a(struct Test3S q);
 | |
| // CHECK-LABEL: define void @test2(
 | |
| // CHECK: alloca %struct.Test3S, align 8
 | |
| // CHECK: memcpy
 | |
| // CHECK: call void @test2a
 | |
| void test2(struct Test3S *q) {
 | |
|   test2a(*q);
 | |
| }
 | |
| 
 | |
| // But make sure we don't generate a memcpy when we can guarantee alignment.
 | |
| void fooey(void);
 | |
| // CHECK-LABEL: define void @test3(
 | |
| // CHECK: alloca %struct.Test3S, align 8
 | |
| // CHECK: call void @fooey
 | |
| // CHECK-NOT: memcpy
 | |
| // CHECK: call void @test2a
 | |
| // CHECK-NOT: memcpy
 | |
| // CHECK: call void @test2a
 | |
| void test3(struct Test3S a) {
 | |
|   struct Test3S b = a;
 | |
|   fooey();
 | |
|   test2a(a);
 | |
|   test2a(b);
 | |
| }
 |