1 // RUN: %clang_cc1 -triple=%itanium_abi_triple -emit-llvm < %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-IT
2 // RUN: %clang_cc1 -triple=%ms_abi_triple -emit-llvm < %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-MS
14 struct { volatile int x; } vF;
17 volatile struct { int x; } vF2;
18 volatile struct { int x; } *vpF2;
20 struct { struct { int y; } x; } F3;
21 volatile struct { struct { int y; } x; } vF3;
23 struct { int x:3; } BF;
24 struct { volatile int x:3; } vBF;
26 typedef int v4si __attribute__ ((vector_size (16)));
30 typedef __attribute__(( ext_vector_type(4) )) int extv4;
34 volatile struct {int x;} aggFct(void);
36 typedef volatile int volatile_int;
41 // CHECK: [[I:%[a-zA-Z0-9_.]+]] = alloca i32
44 // CHECK: load i32, i32* @S
45 // CHECK: store i32 {{.*}}, i32* [[I]]
47 // CHECK: load volatile i32, i32* @vS
48 // CHECK: store i32 {{.*}}, i32* [[I]]
50 // CHECK: [[PS_VAL:%[a-zA-Z0-9_.]+]] = load i32*, i32** @pS
51 // CHECK: load i32, i32* [[PS_VAL]]
52 // CHECK: store i32 {{.*}}, i32* [[I]]
54 // CHECK: [[PVS_VAL:%[a-zA-Z0-9_.]+]] = load i32*, i32** @pvS
55 // CHECK: load volatile i32, i32* [[PVS_VAL]]
56 // CHECK: store i32 {{.*}}, i32* [[I]]
58 // CHECK: load i32, i32* getelementptr {{.*}} @A
59 // CHECK: store i32 {{.*}}, i32* [[I]]
61 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vA
62 // CHECK: store i32 {{.*}}, i32* [[I]]
64 // CHECK: load i32, i32* getelementptr {{.*}} @F
65 // CHECK: store i32 {{.*}}, i32* [[I]]
67 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF
68 // CHECK: store i32 {{.*}}, i32* [[I]]
70 // CHECK: load i32, i32* getelementptr {{.*}} @F2
71 // CHECK: store i32 {{.*}}, i32* [[I]]
73 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF2
74 // CHECK: store i32 {{.*}}, i32* [[I]]
76 // CHECK: [[VPF2_VAL:%[a-zA-Z0-9_.]+]] = load {{%[a-zA-Z0-9_.]+}}*, {{%[a-zA-Z0-9_.]+}}** @vpF2
77 // CHECK: [[ELT:%[a-zA-Z0-9_.]+]] = getelementptr {{.*}} [[VPF2_VAL]]
78 // CHECK: load volatile i32, i32* [[ELT]]
79 // CHECK: store i32 {{.*}}, i32* [[I]]
81 // CHECK: load i32, i32* getelementptr {{.*}} @F3
82 // CHECK: store i32 {{.*}}, i32* [[I]]
84 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF3
85 // CHECK: store i32 {{.*}}, i32* [[I]]
87 // CHECK-IT: load i8, i8* getelementptr {{.*}} @BF
88 // CHECK-MS: load i32, i32* getelementptr {{.*}} @BF
89 // CHECK: store i32 {{.*}}, i32* [[I]]
91 // CHECK-IT: load volatile i8, i8* getelementptr {{.*}} @vBF
92 // CHECK-MS: load volatile i32, i32* getelementptr {{.*}} @vBF
93 // CHECK: store i32 {{.*}}, i32* [[I]]
95 // CHECK: load <4 x i32>, <4 x i32>* @V
96 // CHECK: store i32 {{.*}}, i32* [[I]]
98 // CHECK: load volatile <4 x i32>, <4 x i32>* @vV
99 // CHECK: store i32 {{.*}}, i32* [[I]]
101 // CHECK: load <4 x i32>, <4 x i32>* @VE
102 // CHECK: store i32 {{.*}}, i32* [[I]]
104 // CHECK: load volatile <4 x i32>, <4 x i32>* @vVE
105 // CHECK: store i32 {{.*}}, i32* [[I]]
106 i = aggFct().x; // Note: not volatile
107 // N.b. Aggregate return is extremely target specific, all we can
108 // really say here is that there probably shouldn't be a volatile
110 // CHECK-NOT: load volatile
111 // CHECK: store i32 {{.*}}, i32* [[I]]
113 // CHECK: load volatile i32, i32* @vtS
114 // CHECK: store i32 {{.*}}, i32* [[I]]
119 // CHECK: load i32, i32* [[I]]
120 // CHECK: store i32 {{.*}}, i32* @S
122 // CHECK: load i32, i32* [[I]]
123 // CHECK: store volatile i32 {{.*}}, i32* @vS
125 // CHECK: load i32, i32* [[I]]
126 // CHECK: [[PS_VAL:%[a-zA-Z0-9_.]+]] = load i32*, i32** @pS
127 // CHECK: store i32 {{.*}}, i32* [[PS_VAL]]
129 // CHECK: load i32, i32* [[I]]
130 // CHECK: [[PVS_VAL:%[a-zA-Z0-9_.]+]] = load i32*, i32** @pvS
131 // CHECK: store volatile i32 {{.*}}, i32* [[PVS_VAL]]
133 // CHECK: load i32, i32* [[I]]
134 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @A
136 // CHECK: load i32, i32* [[I]]
137 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vA
139 // CHECK: load i32, i32* [[I]]
140 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @F
142 // CHECK: load i32, i32* [[I]]
143 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF
145 // CHECK: load i32, i32* [[I]]
146 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @F2
148 // CHECK: load i32, i32* [[I]]
149 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF2
151 // CHECK: load i32, i32* [[I]]
152 // CHECK: [[VPF2_VAL:%[a-zA-Z0-9_.]+]] = load {{%[a-zA-Z0-9._]+}}*, {{%[a-zA-Z0-9._]+}}** @vpF2
153 // CHECK: [[ELT:%[a-zA-Z0-9_.]+]] = getelementptr {{.*}} [[VPF2_VAL]]
154 // CHECK: store volatile i32 {{.*}}, i32* [[ELT]]
156 // CHECK: load i32, i32* [[I]]
157 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF3
159 // CHECK: load i32, i32* [[I]]
160 // CHECK-IT: load i8, i8* getelementptr {{.*}} @BF
161 // CHECK-MS: load i32, i32* getelementptr {{.*}} @BF
162 // CHECK-IT: store i8 {{.*}}, i8* getelementptr {{.*}} @BF
163 // CHECK-MS: store i32 {{.*}}, i32* getelementptr {{.*}} @BF
165 // CHECK: load i32, i32* [[I]]
166 // CHECK-IT: load volatile i8, i8* getelementptr {{.*}} @vBF
167 // CHECK-MS: load volatile i32, i32* getelementptr {{.*}} @vBF
168 // CHECK-IT: store volatile i8 {{.*}}, i8* getelementptr {{.*}} @vBF
169 // CHECK-MS: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vBF
171 // CHECK: load i32, i32* [[I]]
172 // CHECK: load <4 x i32>, <4 x i32>* @V
173 // CHECK: store <4 x i32> {{.*}}, <4 x i32>* @V
175 // CHECK: load i32, i32* [[I]]
176 // CHECK: load volatile <4 x i32>, <4 x i32>* @vV
177 // CHECK: store volatile <4 x i32> {{.*}}, <4 x i32>* @vV
179 // CHECK: load i32, i32* [[I]]
180 // CHECK: store volatile i32 {{.*}}, i32* @vtS
184 // CHECK: load i32, i32* @S
185 // CHECK: store i32 {{.*}}, i32* @S
187 // CHECK: load volatile i32, i32* @vS
188 // CHECK: store volatile i32 {{.*}}, i32* @vS
190 // CHECK: load i32, i32* @S
191 // CHECK: load i32, i32* [[I]]
192 // CHECK: store i32 {{.*}}, i32* [[I]]
194 // CHECK: load volatile i32, i32* @vS
195 // CHECK: load i32, i32* [[I]]
196 // CHECK: store i32 {{.*}}, i32* [[I]]
198 // CHECK: load volatile i32, i32* @vtS
199 // CHECK: store volatile i32 {{.*}}, i32* @vtS
201 // From vF2 to a temporary
202 // CHECK: call void @llvm.memcpy.{{.*}}(i8* %{{.*}}, i8* {{.*}} @vF2 {{.*}}, i1 true)
205 // CHECK: call void @llvm.memcpy.{{.*}}(i8* {{.*@vF2.*}}, i8* {{.*@vF2.*}}, i1 true)
207 // vF2 to itself twice
208 // CHECK: call void @llvm.memcpy.{{.*}}(i8* {{.*@vF2.*}}, i8* {{.*@vF2.*}}, i1 true)
209 // CHECK: call void @llvm.memcpy.{{.*}}(i8* {{.*@vF2.*}}, i8* {{.*@vF2.*}}, i1 true)
211 // vF2 to a temporary, then vF2 to itself
212 // CHECK: call void @llvm.memcpy.{{.*}}(i8* %{{.*}}, i8* {{.*@vF2.*}}, i1 true)
213 // CHECK: call void @llvm.memcpy.{{.*}}(i8* {{.*@vF2.*}}, i8* {{.*@vF2.*}}, i1 true)