219 lines · c
1// RUN: %clang_cc1 -triple=aarch64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s -check-prefix CHECK -check-prefixes CHECK-IT,CHECK-IT-ARM2// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s -check-prefix CHECK -check-prefixes CHECK-IT,CHECK-IT-OTHER3// RUN: %clang_cc1 -triple=%ms_abi_triple -emit-llvm < %s | FileCheck %s -check-prefix CHECK -check-prefix CHECK-MS4 5int S;6volatile int vS;7 8int* pS;9volatile int* pvS;10 11int A[10];12volatile int vA[10];13 14struct { int x; } F;15struct { volatile int x; } vF;16 17struct { int x; } F2;18volatile struct { int x; } vF2;19volatile struct { int x; } *vpF2;20 21struct { struct { int y; } x; } F3;22volatile struct { struct { int y; } x; } vF3;23 24struct { int x:3; } BF;25struct { volatile int x:3; } vBF;26 27typedef int v4si __attribute__ ((vector_size (16)));28v4si V;29volatile v4si vV;30 31typedef __attribute__(( ext_vector_type(4) )) int extv4;32extv4 VE;33volatile extv4 vVE;34 35volatile struct {int x;} aggFct(void);36 37typedef volatile int volatile_int;38volatile_int vtS;39 40int main(void) {41 int i;42// CHECK: [[I:%[a-zA-Z0-9_.]+]] = alloca i3243 // load44 i=S;45// CHECK: load i32, ptr @S46// CHECK: store i32 {{.*}}, ptr [[I]]47 i=vS;48// CHECK: load volatile i32, ptr @vS49// CHECK: store i32 {{.*}}, ptr [[I]]50 i=*pS;51// CHECK: [[PS_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @pS52// CHECK: load i32, ptr [[PS_VAL]]53// CHECK: store i32 {{.*}}, ptr [[I]]54 i=*pvS;55// CHECK: [[PVS_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @pvS56// CHECK: load volatile i32, ptr [[PVS_VAL]]57// CHECK: store i32 {{.*}}, ptr [[I]]58 i=A[2];59// CHECK: load i32, ptr getelementptr {{.*}} @A60// CHECK: store i32 {{.*}}, ptr [[I]]61 i=vA[2];62// CHECK: load volatile i32, ptr getelementptr {{.*}} @vA63// CHECK: store i32 {{.*}}, ptr [[I]]64 i=F.x;65// CHECK: load i32, ptr @F66// CHECK: store i32 {{.*}}, ptr [[I]]67 i=vF.x;68// CHECK: load volatile i32, ptr @vF69// CHECK: store i32 {{.*}}, ptr [[I]]70 i=F2.x;71// CHECK: load i32, ptr @F272// CHECK: store i32 {{.*}}, ptr [[I]]73 i=vF2.x;74// CHECK: load volatile i32, ptr @vF275// CHECK: store i32 {{.*}}, ptr [[I]]76 i=vpF2->x;77// CHECK: [[VPF2_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @vpF278// CHECK: [[ELT:%[a-zA-Z0-9_.]+]] = getelementptr {{.*}} [[VPF2_VAL]]79// CHECK: load volatile i32, ptr [[ELT]]80// CHECK: store i32 {{.*}}, ptr [[I]]81 i=F3.x.y;82// CHECK: load i32, ptr @F383// CHECK: store i32 {{.*}}, ptr [[I]]84 i=vF3.x.y;85// CHECK: load volatile i32, ptr @vF386// CHECK: store i32 {{.*}}, ptr [[I]]87 i=BF.x;88// CHECK-IT: load i8, ptr @BF89// CHECK-MS: load i32, ptr @BF90// CHECK: store i32 {{.*}}, ptr [[I]]91 i=vBF.x;92// CHECK-IT-OTHER: load volatile i8, ptr @vBF93// CHECK-IT-ARM: load volatile i32, ptr @vBF94// CHECK-MS: load volatile i32, ptr @vBF95// CHECK: store i32 {{.*}}, ptr [[I]]96 i=V[3];97// CHECK: load <4 x i32>, ptr @V98// CHECK: store i32 {{.*}}, ptr [[I]]99 i=vV[3];100// CHECK: load volatile <4 x i32>, ptr @vV101// CHECK: store i32 {{.*}}, ptr [[I]]102 i=VE.yx[1];103// CHECK: load <4 x i32>, ptr @VE104// CHECK: store i32 {{.*}}, ptr [[I]]105 i=vVE.zy[1];106// CHECK: load volatile <4 x i32>, ptr @vVE107// CHECK: store i32 {{.*}}, ptr [[I]]108 i = aggFct().x; // Note: not volatile109 // N.b. Aggregate return is extremely target specific, all we can110 // really say here is that there probably shouldn't be a volatile111 // load.112// CHECK-NOT: load volatile113// CHECK: store i32 {{.*}}, ptr [[I]]114 i=vtS;115// CHECK: load volatile i32, ptr @vtS116// CHECK: store i32 {{.*}}, ptr [[I]]117 118 119 // store120 S=i;121// CHECK: load i32, ptr [[I]]122// CHECK: store i32 {{.*}}, ptr @S123 vS=i;124// CHECK: load i32, ptr [[I]]125// CHECK: store volatile i32 {{.*}}, ptr @vS126 *pS=i;127// CHECK: load i32, ptr [[I]]128// CHECK: [[PS_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @pS129// CHECK: store i32 {{.*}}, ptr [[PS_VAL]]130 *pvS=i;131// CHECK: load i32, ptr [[I]]132// CHECK: [[PVS_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @pvS133// CHECK: store volatile i32 {{.*}}, ptr [[PVS_VAL]]134 A[2]=i;135// CHECK: load i32, ptr [[I]]136// CHECK: store i32 {{.*}}, ptr getelementptr {{.*}} @A137 vA[2]=i;138// CHECK: load i32, ptr [[I]]139// CHECK: store volatile i32 {{.*}}, ptr getelementptr {{.*}} @vA140 F.x=i;141// CHECK: load i32, ptr [[I]]142// CHECK: store i32 {{.*}}, ptr @F143 vF.x=i;144// CHECK: load i32, ptr [[I]]145// CHECK: store volatile i32 {{.*}}, ptr @vF146 F2.x=i;147// CHECK: load i32, ptr [[I]]148// CHECK: store i32 {{.*}}, ptr @F2149 vF2.x=i;150// CHECK: load i32, ptr [[I]]151// CHECK: store volatile i32 {{.*}}, ptr @vF2152 vpF2->x=i;153// CHECK: load i32, ptr [[I]]154// CHECK: [[VPF2_VAL:%[a-zA-Z0-9_.]+]] = load ptr, ptr @vpF2155// CHECK: [[ELT:%[a-zA-Z0-9_.]+]] = getelementptr {{.*}} [[VPF2_VAL]]156// CHECK: store volatile i32 {{.*}}, ptr [[ELT]]157 vF3.x.y=i;158// CHECK: load i32, ptr [[I]]159// CHECK: store volatile i32 {{.*}}, ptr @vF3160 BF.x=i;161// CHECK: load i32, ptr [[I]]162// CHECK-IT: load i8, ptr @BF163// CHECK-MS: load i32, ptr @BF164// CHECK-IT: store i8 {{.*}}, ptr @BF165// CHECK-MS: store i32 {{.*}}, ptr @BF166 vBF.x=i;167// CHECK: load i32, ptr [[I]]168// CHECK-IT-OTHER: load volatile i8, ptr @vBF169// CHECK-IT-ARM: load volatile i32, ptr @vBF170// CHECK-MS: load volatile i32, ptr @vBF171// CHECK-IT-OTHER: store volatile i8 {{.*}}, ptr @vBF172// CHECK-IT-ARM: store volatile i32 {{.*}}, ptr @vBF173// CHECK-MS: store volatile i32 {{.*}}, ptr @vBF174 V[3]=i;175// CHECK: load i32, ptr [[I]]176// CHECK: load <4 x i32>, ptr @V177// CHECK: store <4 x i32> {{.*}}, ptr @V178 vV[3]=i;179// CHECK: load i32, ptr [[I]]180// CHECK: load volatile <4 x i32>, ptr @vV181// CHECK: store volatile <4 x i32> {{.*}}, ptr @vV182 vtS=i;183// CHECK: load i32, ptr [[I]]184// CHECK: store volatile i32 {{.*}}, ptr @vtS185 186 // other ops:187 ++S;188// CHECK: load i32, ptr @S189// CHECK: store i32 {{.*}}, ptr @S190 ++vS;191// CHECK: load volatile i32, ptr @vS192// CHECK: store volatile i32 {{.*}}, ptr @vS193 i+=S;194// CHECK: load i32, ptr @S195// CHECK: load i32, ptr [[I]]196// CHECK: store i32 {{.*}}, ptr [[I]]197 i+=vS;198// CHECK: load volatile i32, ptr @vS199// CHECK: load i32, ptr [[I]]200// CHECK: store i32 {{.*}}, ptr [[I]]201 ++vtS;202// CHECK: load volatile i32, ptr @vtS203// CHECK: store volatile i32 {{.*}}, ptr @vtS204 (void)vF2;205 // From vF2 to a temporary206// CHECK: call void @llvm.memcpy.{{.*}}(ptr align {{[0-9]+}} %{{.*}}, ptr {{.*}} @vF2, {{.*}}, i1 true)207 vF2 = vF2;208 // vF2 to itself209// CHECK: call void @llvm.memcpy.{{.*}}(ptr {{.*@vF2.*}}, ptr {{.*@vF2.*}}, i1 true)210 vF2 = vF2 = vF2;211 // vF2 to itself twice212// CHECK: call void @llvm.memcpy.{{.*}}(ptr {{.*@vF2.*}}, ptr {{.*@vF2.*}}, i1 true)213// CHECK: call void @llvm.memcpy.{{.*}}(ptr {{.*@vF2.*}}, ptr {{.*@vF2.*}}, i1 true)214 vF2 = (vF2, vF2);215 // vF2 to a temporary, then vF2 to itself216// CHECK: call void @llvm.memcpy.{{.*}}(ptr align {{[0-9]+}} %{{.*}}, ptr {{.*@vF2.*}}, i1 true)217// CHECK: call void @llvm.memcpy.{{.*}}(ptr {{.*@vF2.*}}, ptr {{.*@vF2.*}}, i1 true)218}219