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