13ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// RUN: %clang_cc1 -O0 -triple=x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s 23ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// rdar://11861085 33ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 43ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianstruct s { 53ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian char filler [128]; 63ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian volatile int x; 73ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian}; 83ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 93ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianstruct s gs; 103ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 113ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianvoid foo (void) { 123ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian struct s ls; 133ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian ls = ls; 143ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian gs = gs; 153ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian ls = gs; 163ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian} 173ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK: define void @foo() 183ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK: %[[LS:.*]] = alloca %struct.s, align 4 193ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: %[[ZERO:.*]] = bitcast %struct.s* %[[LS]] to i8* 203ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: %[[ONE:.*]] = bitcast %struct.s* %[[LS]] to i8* 213ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: call void @llvm.memcpy.{{.*}}(i8* %[[ZERO]], i8* %[[ONE]], i64 132, i32 4, i1 true) 223ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: call void @llvm.memcpy.{{.*}}(i8* getelementptr inbounds (%struct.s* @gs, i32 0, i32 0, i32 0), i8* getelementptr inbounds (%struct.s* @gs, i32 0, i32 0, i32 0), i64 132, i32 4, i1 true) 233ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: %[[TWO:.*]] = bitcast %struct.s* %[[LS]] to i8* 243ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: call void @llvm.memcpy.{{.*}}(i8* %[[TWO]], i8* getelementptr inbounds (%struct.s* @gs, i32 0, i32 0, i32 0), i64 132, i32 4, i1 true) 253ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 263ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 273ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianstruct s1 { 283ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian struct s y; 293ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian}; 303ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 313ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianstruct s1 s; 323ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 333ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanianvoid fee (void) { 343ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian s = s; 353ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian s.y = gs; 363ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian} 373ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK: define void @fee() 383ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK: call void @llvm.memcpy.{{.*}}(i8* getelementptr inbounds (%struct.s1* @s, i32 0, i32 0, i32 0, i32 0), i8* getelementptr inbounds (%struct.s1* @s, i32 0, i32 0, i32 0, i32 0), i64 132, i32 4, i1 true) 393ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian// CHECK-NEXT: call void @llvm.memcpy.{{.*}}(i8* getelementptr inbounds (%struct.s1* @s, i32 0, i32 0, i32 0, i32 0), i8* getelementptr inbounds (%struct.s* @gs, i32 0, i32 0, i32 0), i64 132, i32 4, i1 true) 403ac83d69c61238cd0d38e90fcdd03390530ab2fbFariborz Jahanian 41