xref: /llvm-project/clang/test/CodeGenCXX/no-opt-volatile-memcpy.cpp (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1 // RUN: %clang_cc1 -triple=x86_64-apple-darwin  -emit-llvm -o - %s | FileCheck %s
2 
3 struct s {
4   char filler [128];
5   volatile int x;
6 };
7 
8 struct s gs;
9 
foo(void)10 void foo (void) {
11   struct s ls;
12   ls = ls;
13   gs = gs;
14   ls = gs;
15 }
16 // CHECK-LABEL: define{{.*}} void @_Z3foov()
17 // CHECK: %[[LS:.*]] = alloca %struct.s, align 4
18 // CHECK-NEXT:  call void @llvm.memcpy.{{.*}}(ptr align 4 %[[LS]], ptr align 4 %[[LS]], i64 132, i1 true)
19 // CHECK-NEXT:  call void @llvm.memcpy.{{.*}}(ptr align 4 @gs, ptr align 4 @gs, i64 132, i1 true)
20 // CHECK-NEXT:  call void @llvm.memcpy.{{.*}}(ptr align 4 %[[LS]], ptr align 4 @gs, i64 132, i1 true)
21 
22 
23 struct s1 {
24   struct s y;
25 };
26 
27 struct s1 s;
28 
fee(void)29 void fee (void) {
30   s = s;
31   s.y = gs;
32 }
33 // CHECK-LABEL: define{{.*}} void @_Z3feev()
34 // CHECK: call void @llvm.memcpy.{{.*}}(ptr align 4 @s, ptr align 4 @s, i64 132, i1 true)
35 // CHECK-NEXT: call void @llvm.memcpy.{{.*}}(ptr align 4 @s, ptr align 4 @gs, i64 132, i1 true)
36 
37 struct d : s1 {
38 };
39 
40 d gd;
41 
gorf(void)42 void gorf(void) {
43   gd = gd;
44 }
45 // CHECK-LABEL: define{{.*}} void @_Z4gorfv()
46 // CHECK:   call void @llvm.memcpy.{{.*}}(ptr align 4 @gd, ptr align 4 @gd, i64 132, i1 true)
47