brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 14e8f1f Raw
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