1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wno-unused-value -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s 283ce9d4a552987d34cbd500e983db8d770232379John McCall 383ce9d4a552987d34cbd500e983db8d770232379John McCall// CHECK: @i = global [[INT:i[0-9]+]] 0 483ce9d4a552987d34cbd500e983db8d770232379John McCallvolatile int i, j, k; 583ce9d4a552987d34cbd500e983db8d770232379John McCallvolatile int ar[5]; 683ce9d4a552987d34cbd500e983db8d770232379John McCallvolatile char c; 79cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK: @ci = global [[CINT:.*]] zeroinitializer 883ce9d4a552987d34cbd500e983db8d770232379John McCallvolatile _Complex int ci; 983ce9d4a552987d34cbd500e983db8d770232379John McCallvolatile struct S { 1083ce9d4a552987d34cbd500e983db8d770232379John McCall#ifdef __cplusplus 1183ce9d4a552987d34cbd500e983db8d770232379John McCall void operator =(volatile struct S&o) volatile; 1283ce9d4a552987d34cbd500e983db8d770232379John McCall#endif 1383ce9d4a552987d34cbd500e983db8d770232379John McCall int i; 1483ce9d4a552987d34cbd500e983db8d770232379John McCall} a, b; 1583ce9d4a552987d34cbd500e983db8d770232379John McCall 1683ce9d4a552987d34cbd500e983db8d770232379John McCall//void operator =(volatile struct S&o1, volatile struct S&o2) volatile; 1783ce9d4a552987d34cbd500e983db8d770232379John McCallint printf(const char *, ...); 1883ce9d4a552987d34cbd500e983db8d770232379John McCall 1983ce9d4a552987d34cbd500e983db8d770232379John McCall 2083ce9d4a552987d34cbd500e983db8d770232379John McCall// CHECK: define void @{{.*}}test 2183ce9d4a552987d34cbd500e983db8d770232379John McCallvoid test() { 2283ce9d4a552987d34cbd500e983db8d770232379John McCall 2383ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK: call void asm 2483ce9d4a552987d34cbd500e983db8d770232379John McCall 252a41637a995affa1563f4d82a8b026e326a2faa0John McCall // should not load 2683ce9d4a552987d34cbd500e983db8d770232379John McCall i; 2783ce9d4a552987d34cbd500e983db8d770232379John McCall 2883ce9d4a552987d34cbd500e983db8d770232379John McCall (float)(ci); 29a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 30a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 3183ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sitofp [[INT]] 3283ce9d4a552987d34cbd500e983db8d770232379John McCall 3383ce9d4a552987d34cbd500e983db8d770232379John McCall // These are not uses in C++: 3483ce9d4a552987d34cbd500e983db8d770232379John McCall // [expr.static.cast]p6: 3583ce9d4a552987d34cbd500e983db8d770232379John McCall // The lvalue-to-rvalue . . . conversions are not applied to the expression. 3683ce9d4a552987d34cbd500e983db8d770232379John McCall (void)ci; 3783ce9d4a552987d34cbd500e983db8d770232379John McCall (void)a; 3883ce9d4a552987d34cbd500e983db8d770232379John McCall 3983ce9d4a552987d34cbd500e983db8d770232379John McCall (void)(ci=ci); 40a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 41a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 42a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 43a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 4483ce9d4a552987d34cbd500e983db8d770232379John McCall 4583ce9d4a552987d34cbd500e983db8d770232379John McCall (void)(i=j); 46a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[T:%.*]] = load volatile [[INT]]* @j 47a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* @i 4883ce9d4a552987d34cbd500e983db8d770232379John McCall 4983ce9d4a552987d34cbd500e983db8d770232379John McCall ci+=ci; 50a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 51a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 52a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 53a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 5483ce9d4a552987d34cbd500e983db8d770232379John McCall // Not sure why they're ordered this way. 5583ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: [[R:%.*]] = add [[INT]] [[R2]], [[R1]] 5683ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: [[I:%.*]] = add [[INT]] [[I2]], [[I1]] 57a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 58a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 5983ce9d4a552987d34cbd500e983db8d770232379John McCall 60a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // Note that C++ requires an extra load volatile over C from the LHS of the '+'. 6183ce9d4a552987d34cbd500e983db8d770232379John McCall (ci += ci) + ci; 62a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 63a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 64a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 65a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 6683ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: [[R:%.*]] = add [[INT]] [[R2]], [[R1]] 6783ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: [[I:%.*]] = add [[INT]] [[I2]], [[I1]] 68a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 69a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 70a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 71a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I1:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 72a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 0) 73a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 7483ce9d4a552987d34cbd500e983db8d770232379John McCall // These additions can be elided. 7583ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add [[INT]] [[R1]], [[R2]] 7683ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add [[INT]] [[I1]], [[I2]] 7783ce9d4a552987d34cbd500e983db8d770232379John McCall 7883ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 7983ce9d4a552987d34cbd500e983db8d770232379John McCall 80a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // Extra load volatile in C++. 8183ce9d4a552987d34cbd500e983db8d770232379John McCall (i += j) + k; 82a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 83a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 8483ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add nsw [[INT]] 85a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 86a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 87a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 8883ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add nsw [[INT]] 8983ce9d4a552987d34cbd500e983db8d770232379John McCall 9083ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 9183ce9d4a552987d34cbd500e983db8d770232379John McCall 92a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // Extra load volatile in C++. 9383ce9d4a552987d34cbd500e983db8d770232379John McCall (i += j) + 1; 94a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 95a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 9683ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add nsw [[INT]] 97a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 98a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 9983ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add nsw [[INT]] 10083ce9d4a552987d34cbd500e983db8d770232379John McCall 10183ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 10283ce9d4a552987d34cbd500e983db8d770232379John McCall 10383ce9d4a552987d34cbd500e983db8d770232379John McCall ci+ci; 104a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 105a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 106a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 107a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 10883ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add [[INT]] 10983ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add [[INT]] 11083ce9d4a552987d34cbd500e983db8d770232379John McCall 11183ce9d4a552987d34cbd500e983db8d770232379John McCall __real i; 11283ce9d4a552987d34cbd500e983db8d770232379John McCall 11383ce9d4a552987d34cbd500e983db8d770232379John McCall +ci; 114a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 115a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 11683ce9d4a552987d34cbd500e983db8d770232379John McCall 11783ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 11883ce9d4a552987d34cbd500e983db8d770232379John McCall 11983ce9d4a552987d34cbd500e983db8d770232379John McCall (void)(i=i); 120a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 121a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 12283ce9d4a552987d34cbd500e983db8d770232379John McCall 12383ce9d4a552987d34cbd500e983db8d770232379John McCall (float)(i=i); 124a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 125a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 126a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 12783ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sitofp 12883ce9d4a552987d34cbd500e983db8d770232379John McCall 12983ce9d4a552987d34cbd500e983db8d770232379John McCall (void)i; 13083ce9d4a552987d34cbd500e983db8d770232379John McCall 13183ce9d4a552987d34cbd500e983db8d770232379John McCall i=i; 132a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 133a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 13483ce9d4a552987d34cbd500e983db8d770232379John McCall 135a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // Extra load volatile in C++. 13683ce9d4a552987d34cbd500e983db8d770232379John McCall i=i=i; 137a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 138a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 139a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 140a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 14183ce9d4a552987d34cbd500e983db8d770232379John McCall 14283ce9d4a552987d34cbd500e983db8d770232379John McCall (void)__builtin_choose_expr(0, i=i, j=j); 143a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 144a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 14583ce9d4a552987d34cbd500e983db8d770232379John McCall 14683ce9d4a552987d34cbd500e983db8d770232379John McCall k ? (i=i) : (j=j); 147a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 14883ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: icmp 14983ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: br i1 150a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK: load volatile 151a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 15283ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: br label 153a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK: load volatile 154a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 15583ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: br label 156150b462afc7a713edd19bcbbbb22381fe060d4f5John McCall // CHECK: phi 15783ce9d4a552987d34cbd500e983db8d770232379John McCall 15883ce9d4a552987d34cbd500e983db8d770232379John McCall (void)(i,(i=i)); 159a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 160a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 16183ce9d4a552987d34cbd500e983db8d770232379John McCall 16283ce9d4a552987d34cbd500e983db8d770232379John McCall i=i,k; 163a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @i 164a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @i 16583ce9d4a552987d34cbd500e983db8d770232379John McCall 16683ce9d4a552987d34cbd500e983db8d770232379John McCall (i=j,k=j); 167a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @j 168a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @i 169a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @j 170a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @k 17183ce9d4a552987d34cbd500e983db8d770232379John McCall 17283ce9d4a552987d34cbd500e983db8d770232379John McCall (i=j,k); 173a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @j 174a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @i 17583ce9d4a552987d34cbd500e983db8d770232379John McCall 17683ce9d4a552987d34cbd500e983db8d770232379John McCall (i,j); 17783ce9d4a552987d34cbd500e983db8d770232379John McCall 17883ce9d4a552987d34cbd500e983db8d770232379John McCall // Extra load in C++. 17983ce9d4a552987d34cbd500e983db8d770232379John McCall i=c=k; 180a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 18183ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: trunc 182a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 183a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 18483ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sext 185a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 18683ce9d4a552987d34cbd500e983db8d770232379John McCall 18783ce9d4a552987d34cbd500e983db8d770232379John McCall i+=k; 188a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 189a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 19083ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add nsw [[INT]] 191a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 19283ce9d4a552987d34cbd500e983db8d770232379John McCall 19383ce9d4a552987d34cbd500e983db8d770232379John McCall ci; 19483ce9d4a552987d34cbd500e983db8d770232379John McCall 19583ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 19683ce9d4a552987d34cbd500e983db8d770232379John McCall 19783ce9d4a552987d34cbd500e983db8d770232379John McCall (int)ci; 198a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile {{.*}} @ci, i32 0, i32 0 199a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile {{.*}} @ci, i32 0, i32 1 20083ce9d4a552987d34cbd500e983db8d770232379John McCall 20183ce9d4a552987d34cbd500e983db8d770232379John McCall (bool)ci; 202a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile {{.*}} @ci, i32 0, i32 0 203a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile {{.*}} @ci, i32 0, i32 1 20483ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: icmp ne 20583ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: icmp ne 20683ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: or i1 20783ce9d4a552987d34cbd500e983db8d770232379John McCall 20883ce9d4a552987d34cbd500e983db8d770232379John McCall ci=ci; 209a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 210a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 211a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 212a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 21383ce9d4a552987d34cbd500e983db8d770232379John McCall 21483ce9d4a552987d34cbd500e983db8d770232379John McCall asm("nop"); // CHECK-NEXT: call void asm 21583ce9d4a552987d34cbd500e983db8d770232379John McCall 21683ce9d4a552987d34cbd500e983db8d770232379John McCall // Extra load in C++. 21783ce9d4a552987d34cbd500e983db8d770232379John McCall ci=ci=ci; 218a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 219a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 220a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 221a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 222a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 223a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 224a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 225a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 22683ce9d4a552987d34cbd500e983db8d770232379John McCall 22783ce9d4a552987d34cbd500e983db8d770232379John McCall __imag ci = __imag ci = __imag ci; 228a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[T:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 229a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 230a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: [[T:%.*]] = load volatile [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 231a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* getelementptr inbounds ([[CINT]]* @ci, i32 0, i32 1) 23283ce9d4a552987d34cbd500e983db8d770232379John McCall 23383ce9d4a552987d34cbd500e983db8d770232379John McCall __real (i = j); 234a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 235a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 23683ce9d4a552987d34cbd500e983db8d770232379John McCall 23783ce9d4a552987d34cbd500e983db8d770232379John McCall __imag i; 23883ce9d4a552987d34cbd500e983db8d770232379John McCall 23983ce9d4a552987d34cbd500e983db8d770232379John McCall // ============================================================ 24083ce9d4a552987d34cbd500e983db8d770232379John McCall // FIXME: Test cases we get wrong. 24183ce9d4a552987d34cbd500e983db8d770232379John McCall 24283ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. We load all of a into a copy of a, then load i. gcc forgets to do 24383ce9d4a552987d34cbd500e983db8d770232379John McCall // the assignment. 24483ce9d4a552987d34cbd500e983db8d770232379John McCall // (a = a).i; 24583ce9d4a552987d34cbd500e983db8d770232379John McCall 24683ce9d4a552987d34cbd500e983db8d770232379John McCall // ============================================================ 24783ce9d4a552987d34cbd500e983db8d770232379John McCall // Test cases where we intentionally differ from gcc, due to suspected bugs in 24883ce9d4a552987d34cbd500e983db8d770232379John McCall // gcc. 24983ce9d4a552987d34cbd500e983db8d770232379John McCall 25083ce9d4a552987d34cbd500e983db8d770232379John McCall // Not a use. gcc forgets to do the assignment. 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: call {{.*}}void 25283ce9d4a552987d34cbd500e983db8d770232379John McCall ((a=a),a); 25383ce9d4a552987d34cbd500e983db8d770232379John McCall 25483ce9d4a552987d34cbd500e983db8d770232379John McCall // Not a use. gcc gets this wrong, it doesn't emit the copy! 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: call {{.*}}void 25683ce9d4a552987d34cbd500e983db8d770232379John McCall (void)(a=a); 25783ce9d4a552987d34cbd500e983db8d770232379John McCall 25883ce9d4a552987d34cbd500e983db8d770232379John McCall // Not a use. gcc got this wrong in 4.2 and omitted the side effects 25983ce9d4a552987d34cbd500e983db8d770232379John McCall // entirely, but it is fixed in 4.4.0. 26083ce9d4a552987d34cbd500e983db8d770232379John McCall __imag (i = j); 261a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 262a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 26383ce9d4a552987d34cbd500e983db8d770232379John McCall 26483ce9d4a552987d34cbd500e983db8d770232379John McCall // C++ does an extra load here. Note that we have to do full loads. 26583ce9d4a552987d34cbd500e983db8d770232379John McCall (float)(ci=ci); 266a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 267a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 268a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 269a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 270a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 271a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 27283ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sitofp 27383ce9d4a552987d34cbd500e983db8d770232379John McCall 27483ce9d4a552987d34cbd500e983db8d770232379John McCall // Not a use, bug? gcc treats this as not a use, that's probably a 27583ce9d4a552987d34cbd500e983db8d770232379John McCall // bug due to tree folding ignoring volatile. 27683ce9d4a552987d34cbd500e983db8d770232379John McCall (int)(ci=ci); 277a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 278a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 279a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 280a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 281a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 282a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 28383ce9d4a552987d34cbd500e983db8d770232379John McCall 28483ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. 28583ce9d4a552987d34cbd500e983db8d770232379John McCall (float)(i=i); 286a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 287a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 288a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 28983ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sitofp 29083ce9d4a552987d34cbd500e983db8d770232379John McCall 29183ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. gcc treats this as not a use, that's probably a bug due to tree 29283ce9d4a552987d34cbd500e983db8d770232379John McCall // folding ignoring volatile. 29383ce9d4a552987d34cbd500e983db8d770232379John McCall (int)(i=i); 294a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 295a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 296a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 29783ce9d4a552987d34cbd500e983db8d770232379John McCall 29883ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. 29983ce9d4a552987d34cbd500e983db8d770232379John McCall -(i=j); 300a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 301a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 302a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 30383ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: sub 30483ce9d4a552987d34cbd500e983db8d770232379John McCall 30583ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. gcc treats this a not a use, that's probably a bug due to tree 30683ce9d4a552987d34cbd500e983db8d770232379John McCall // folding ignoring volatile. 30783ce9d4a552987d34cbd500e983db8d770232379John McCall +(i=k); 308a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 309a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 310a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 31183ce9d4a552987d34cbd500e983db8d770232379John McCall 31283ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. gcc treats this a not a use, that's probably a bug due to tree 31383ce9d4a552987d34cbd500e983db8d770232379John McCall // folding ignoring volatile. 31483ce9d4a552987d34cbd500e983db8d770232379John McCall __real (ci=ci); 315a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 316a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 317a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 318a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 31983ce9d4a552987d34cbd500e983db8d770232379John McCall 32083ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. 32183ce9d4a552987d34cbd500e983db8d770232379John McCall i + 0; 322a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 32383ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add 32483ce9d4a552987d34cbd500e983db8d770232379John McCall 32583ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. 32683ce9d4a552987d34cbd500e983db8d770232379John McCall (i=j) + i; 327a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 328a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 329a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 330a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 33183ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add 33283ce9d4a552987d34cbd500e983db8d770232379John McCall 33383ce9d4a552987d34cbd500e983db8d770232379John McCall // A use. gcc treats this as not a use, that's probably a bug due to tree 33483ce9d4a552987d34cbd500e983db8d770232379John McCall // folding ignoring volatile. 33583ce9d4a552987d34cbd500e983db8d770232379John McCall (i=j) + 0; 336a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 337a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 338a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 33983ce9d4a552987d34cbd500e983db8d770232379John McCall // CHECK-NEXT: add 34083ce9d4a552987d34cbd500e983db8d770232379John McCall 34183ce9d4a552987d34cbd500e983db8d770232379John McCall (i,j)=k; 342a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @k 343a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @j 34483ce9d4a552987d34cbd500e983db8d770232379John McCall 34583ce9d4a552987d34cbd500e983db8d770232379John McCall (j=k,i)=i; 346a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @i 347a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile [[INT]]* @k 348a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @j 349a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile {{.*}}, [[INT]]* @i 3502a41637a995affa1563f4d82a8b026e326a2faa0John McCall 3512a41637a995affa1563f4d82a8b026e326a2faa0John McCall // CHECK-NEXT: ret void 35283ce9d4a552987d34cbd500e983db8d770232379John McCall} 353