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 3 4 int S; 5 volatile int vS; 6 7 int* pS; 8 volatile int* pvS; 9 10 int A[10]; 11 volatile int vA[10]; 12 13 struct { int x; } F; 14 struct { volatile int x; } vF; 15 16 struct { int x; } F2; 17 volatile struct { int x; } vF2; 18 volatile struct { int x; } *vpF2; 19 20 struct { struct { int y; } x; } F3; 21 volatile struct { struct { int y; } x; } vF3; 22 23 struct { int x:3; } BF; 24 struct { volatile int x:3; } vBF; 25 26 typedef int v4si __attribute__ ((vector_size (16))); 27 v4si V; 28 volatile v4si vV; 29 30 typedef __attribute__(( ext_vector_type(4) )) int extv4; 31 extv4 VE; 32 volatile extv4 vVE; 33 34 volatile struct {int x;} aggFct(void); 35 36 typedef volatile int volatile_int; 37 volatile_int vtS; 38 39 int main() { 40 int i; 41 // CHECK: [[I:%[a-zA-Z0-9_.]+]] = alloca i32 42 // load 43 i=S; 44 // CHECK: load i32, i32* @S 45 // CHECK: store i32 {{.*}}, i32* [[I]] 46 i=vS; 47 // CHECK: load volatile i32, i32* @vS 48 // CHECK: store i32 {{.*}}, i32* [[I]] 49 i=*pS; 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]] 53 i=*pvS; 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]] 57 i=A[2]; 58 // CHECK: load i32, i32* getelementptr {{.*}} @A 59 // CHECK: store i32 {{.*}}, i32* [[I]] 60 i=vA[2]; 61 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vA 62 // CHECK: store i32 {{.*}}, i32* [[I]] 63 i=F.x; 64 // CHECK: load i32, i32* getelementptr {{.*}} @F 65 // CHECK: store i32 {{.*}}, i32* [[I]] 66 i=vF.x; 67 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF 68 // CHECK: store i32 {{.*}}, i32* [[I]] 69 i=F2.x; 70 // CHECK: load i32, i32* getelementptr {{.*}} @F2 71 // CHECK: store i32 {{.*}}, i32* [[I]] 72 i=vF2.x; 73 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF2 74 // CHECK: store i32 {{.*}}, i32* [[I]] 75 i=vpF2->x; 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]] 80 i=F3.x.y; 81 // CHECK: load i32, i32* getelementptr {{.*}} @F3 82 // CHECK: store i32 {{.*}}, i32* [[I]] 83 i=vF3.x.y; 84 // CHECK: load volatile i32, i32* getelementptr {{.*}} @vF3 85 // CHECK: store i32 {{.*}}, i32* [[I]] 86 i=BF.x; 87 // CHECK-IT: load i8, i8* getelementptr {{.*}} @BF 88 // CHECK-MS: load i32, i32* getelementptr {{.*}} @BF 89 // CHECK: store i32 {{.*}}, i32* [[I]] 90 i=vBF.x; 91 // CHECK-IT: load volatile i8, i8* getelementptr {{.*}} @vBF 92 // CHECK-MS: load volatile i32, i32* getelementptr {{.*}} @vBF 93 // CHECK: store i32 {{.*}}, i32* [[I]] 94 i=V[3]; 95 // CHECK: load <4 x i32>, <4 x i32>* @V 96 // CHECK: store i32 {{.*}}, i32* [[I]] 97 i=vV[3]; 98 // CHECK: load volatile <4 x i32>, <4 x i32>* @vV 99 // CHECK: store i32 {{.*}}, i32* [[I]] 100 i=VE.yx[1]; 101 // CHECK: load <4 x i32>, <4 x i32>* @VE 102 // CHECK: store i32 {{.*}}, i32* [[I]] 103 i=vVE.zy[1]; 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 109 // load. 110 // CHECK-NOT: load volatile 111 // CHECK: store i32 {{.*}}, i32* [[I]] 112 i=vtS; 113 // CHECK: load volatile i32, i32* @vtS 114 // CHECK: store i32 {{.*}}, i32* [[I]] 115 116 117 // store 118 S=i; 119 // CHECK: load i32, i32* [[I]] 120 // CHECK: store i32 {{.*}}, i32* @S 121 vS=i; 122 // CHECK: load i32, i32* [[I]] 123 // CHECK: store volatile i32 {{.*}}, i32* @vS 124 *pS=i; 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]] 128 *pvS=i; 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]] 132 A[2]=i; 133 // CHECK: load i32, i32* [[I]] 134 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @A 135 vA[2]=i; 136 // CHECK: load i32, i32* [[I]] 137 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vA 138 F.x=i; 139 // CHECK: load i32, i32* [[I]] 140 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @F 141 vF.x=i; 142 // CHECK: load i32, i32* [[I]] 143 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF 144 F2.x=i; 145 // CHECK: load i32, i32* [[I]] 146 // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @F2 147 vF2.x=i; 148 // CHECK: load i32, i32* [[I]] 149 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF2 150 vpF2->x=i; 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]] 155 vF3.x.y=i; 156 // CHECK: load i32, i32* [[I]] 157 // CHECK: store volatile i32 {{.*}}, i32* getelementptr {{.*}} @vF3 158 BF.x=i; 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 164 vBF.x=i; 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 170 V[3]=i; 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 174 vV[3]=i; 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 178 vtS=i; 179 // CHECK: load i32, i32* [[I]] 180 // CHECK: store volatile i32 {{.*}}, i32* @vtS 181 182 // other ops: 183 ++S; 184 // CHECK: load i32, i32* @S 185 // CHECK: store i32 {{.*}}, i32* @S 186 ++vS; 187 // CHECK: load volatile i32, i32* @vS 188 // CHECK: store volatile i32 {{.*}}, i32* @vS 189 i+=S; 190 // CHECK: load i32, i32* @S 191 // CHECK: load i32, i32* [[I]] 192 // CHECK: store i32 {{.*}}, i32* [[I]] 193 i+=vS; 194 // CHECK: load volatile i32, i32* @vS 195 // CHECK: load i32, i32* [[I]] 196 // CHECK: store i32 {{.*}}, i32* [[I]] 197 ++vtS; 198 // CHECK: load volatile i32, i32* @vtS 199 // CHECK: store volatile i32 {{.*}}, i32* @vtS 200 (void)vF2; 201 // From vF2 to a temporary 202 // CHECK: call void @llvm.memcpy.{{.*}}(i8* %{{.*}}, i8* {{.*}} @vF2 {{.*}}, i1 true) 203 vF2 = vF2; 204 // vF2 to itself 205 // CHECK: call void @llvm.memcpy.{{.*}}(i8* {{.*@vF2.*}}, i8* {{.*@vF2.*}}, i1 true) 206 vF2 = vF2 = vF2; 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) 210 vF2 = (vF2, vF2); 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) 214 } 215