1f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall// RUN: %clang_cc1 -Wno-return-type -Wno-unused-value -emit-llvm %s -o - | FileCheck %s 27f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 3b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall// CHECK: @i = common global [[INT:i[0-9]+]] 0 47f79f9be5916c51c35da4f126b7c12596a101607Mike Stumpvolatile int i, j, k; 57f79f9be5916c51c35da4f126b7c12596a101607Mike Stumpvolatile int ar[5]; 67f79f9be5916c51c35da4f126b7c12596a101607Mike Stumpvolatile char c; 79cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK: @ci = common global [[CINT:.*]] zeroinitializer 87f79f9be5916c51c35da4f126b7c12596a101607Mike Stumpvolatile _Complex int ci; 97f79f9be5916c51c35da4f126b7c12596a101607Mike Stumpvolatile struct S { 107f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#ifdef __cplusplus 117f79f9be5916c51c35da4f126b7c12596a101607Mike Stump void operator =(volatile struct S&o) volatile; 127f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#endif 137f79f9be5916c51c35da4f126b7c12596a101607Mike Stump int i; 147f79f9be5916c51c35da4f126b7c12596a101607Mike Stump} a, b; 157f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 167f79f9be5916c51c35da4f126b7c12596a101607Mike Stump//void operator =(volatile struct S&o1, volatile struct S&o2) volatile; 1723afaad895486d4a9ea672f497b63ebc4c588955Daniel Dunbarint printf(const char *, ...); 187f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 19b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall 20b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall// Note that these test results are very much specific to C! 21b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall// Assignments in C++ yield l-values, not r-values, and the situations 22b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall// that do implicit lvalue-to-rvalue conversion are substantially 23b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall// reduced. 24b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall 25a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: define {{.*}}void @test() 26b418d74c11498b7e1044103131e2e3be4d63512eJohn McCallvoid test() { 273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: load volatile [[INT]], [[INT]]* @i 287f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i; 293ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 31b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sitofp [[INT]] 327f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (float)(ci); 333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 357f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)ci; 36b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: bitcast 37b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: memcpy 387f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)a; 393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 437f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)(ci=ci); 443ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[T:%.*]] = load volatile [[INT]], [[INT]]* @j 45a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* @i 467f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)(i=j); 473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R1:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I1:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 51b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // Not sure why they're ordered this way. 52b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: [[R:%.*]] = add [[INT]] [[R2]], [[R1]] 53b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: [[I:%.*]] = add [[INT]] [[I2]], [[I1]] 543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 567f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ci+=ci; 57b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall 583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R1:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I1:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 62b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: [[R:%.*]] = add [[INT]] [[R2]], [[R1]] 63b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: [[I:%.*]] = add [[INT]] [[I2]], [[I1]] 643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[R]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[I]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[R2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 0), align 4 673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[I2:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1), align 4 68b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // These additions can be elided 69b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add [[INT]] [[R]], [[R2]] 70b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add [[INT]] [[I]], [[I2]] 717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (ci += ci) + ci; 72b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void asm 737f79f9be5916c51c35da4f126b7c12596a101607Mike Stump asm("nop"); 74a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 75a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 76b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add nsw [[INT]] 77a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 78a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 79b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add nsw [[INT]] 807f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i += j) + k; 81b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void asm 827f79f9be5916c51c35da4f126b7c12596a101607Mike Stump asm("nop"); 83a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 84a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 85b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add nsw [[INT]] 86a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 87b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add nsw [[INT]] 887f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i += j) + 1; 89b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void asm 907f79f9be5916c51c35da4f126b7c12596a101607Mike Stump asm("nop"); 91a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 92a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 93a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 94a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 95b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add [[INT]] 96b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add [[INT]] 977f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ci+ci; 98b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall 99a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1007f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __real i; 101a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 102a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1037f79f9be5916c51c35da4f126b7c12596a101607Mike Stump +ci; 104b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void asm 1057f79f9be5916c51c35da4f126b7c12596a101607Mike Stump asm("nop"); 106a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 107a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1087f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)(i=i); 109a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 110a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 111b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sitofp 1127f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (float)(i=i); 113a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1147f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)i; 115a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 116a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1177f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i=i; 118a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 119a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 120a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1217f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i=i=i; 1227f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#ifndef __cplusplus 123a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 124a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1257f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)__builtin_choose_expr(0, i=i, j=j); 1267f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#endif 127a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 128b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: icmp 129b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: br i1 130a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK: load volatile 131a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 132b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: br label 133a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK: load volatile 134a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 135b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: br label 1367f79f9be5916c51c35da4f126b7c12596a101607Mike Stump k ? (i=i) : (j=j); 137b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK: phi 138a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 139a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 140a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1417f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (void)(i,(i=i)); 142a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 143a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 144a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1457f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i=i,i; 146a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 147a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 148a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 149a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1507f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i=j,k=j); 151a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 152a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 153a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1547f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i=j,k); 155a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 156a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1577f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i,j); 158a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 159b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: trunc 160a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 161b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sext 162a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1637f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i=c=k; 164a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 165a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 166b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add nsw [[INT]] 167a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1687f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i+=k; 169a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 170a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ci; 1727f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#ifndef __cplusplus 173a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 174a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 1757f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (int)ci; 176a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 177a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 178b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: icmp ne 179b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: icmp ne 180b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: or i1 1817f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (_Bool)ci; 1827f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#endif 183a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 184a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 185a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 186a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1877f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ci=ci; 188a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 189a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 190a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 191a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 192a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 193a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 1947f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ci=ci=ci; 1953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[T:%.*]] = load volatile [[INT]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1) 1963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1) 1973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: store volatile [[INT]] [[T]], [[INT]]* getelementptr inbounds ([[CINT]], [[CINT]]* @ci, i32 0, i32 1) 1987f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __imag ci = __imag ci = __imag ci; 199a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 200a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2017f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __real (i = j); 202a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 2037f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __imag i; 2047f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2057f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // ============================================================ 20646cd81ffe22ca376062faf4dac37cc9de42348d3Mike Stump // FIXME: Test cases we get wrong. 2077f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2082d3b36e302c81119eb49bcaf40a74bdaa185d04dMike Stump // A use. We load all of a into a copy of a, then load i. gcc forgets to do 2092d3b36e302c81119eb49bcaf40a74bdaa185d04dMike Stump // the assignment. 21046cd81ffe22ca376062faf4dac37cc9de42348d3Mike Stump // (a = a).i; 2112d3b36e302c81119eb49bcaf40a74bdaa185d04dMike Stump 2127f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // ============================================================ 2137f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // Test cases where we intentionally differ from gcc, due to suspected bugs in 2147f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // gcc. 2157f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2167f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // Not a use. gcc forgets to do the assignment. 217b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void @llvm.memcpy{{.*}}, i1 true 218b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: bitcast 219b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: call void @llvm.memcpy{{.*}}, i1 true 2207f79f9be5916c51c35da4f126b7c12596a101607Mike Stump ((a=a),a); 2217f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2227f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // Not a use. gcc gets this wrong, it doesn't emit the copy! 2237f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // (void)(a=a); 2247f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2257f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // Not a use. gcc got this wrong in 4.2 and omitted the side effects 2267f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // entirely, but it is fixed in 4.4.0. 227a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 228a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2297f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __imag (i = j); 2307f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2317f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#ifndef __cplusplus 2327f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use of the real part 233a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 234a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 235a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 236a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 237b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sitofp 2387f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (float)(ci=ci); 2397f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // Not a use, bug? gcc treats this as not a use, that's probably a bug due to 2407f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // tree folding ignoring volatile. 241a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 242a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 243a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 244a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2457f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (int)(ci=ci); 2467f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#endif 2477f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2487f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. 249a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 250a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 251b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sitofp 2527f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (float)(i=i); 2537f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. gcc treats this as not a use, that's probably a bug due to tree 2547f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // folding ignoring volatile. 255a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 256a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2577f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (int)(i=i); 2587f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2597f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. 260a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 261a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 262b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: sub 2637f79f9be5916c51c35da4f126b7c12596a101607Mike Stump -(i=j); 2647f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. gcc treats this a not a use, that's probably a bug due to tree 2657f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // folding ignoring volatile. 266a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 267a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2687f79f9be5916c51c35da4f126b7c12596a101607Mike Stump +(i=k); 2697f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2707f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. gcc treats this a not a use, that's probably a bug due to tree 2717f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // folding ignoring volatile. 272a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 273a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 274a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 275a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 2767f79f9be5916c51c35da4f126b7c12596a101607Mike Stump __real (ci=ci); 2777f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2787f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. 279a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 280b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add 2817f79f9be5916c51c35da4f126b7c12596a101607Mike Stump i + 0; 2827f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. 283a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 284a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 285a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 286b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add 2877f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i=j) + i; 2887f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // A use. gcc treats this as not a use, that's probably a bug due to tree 2897f79f9be5916c51c35da4f126b7c12596a101607Mike Stump // folding ignoring volatile. 290a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: load volatile 291a40b7f2c4a968a0f35f088cd009d671389b09ac2Eli Friedman // CHECK-NEXT: store volatile 292b418d74c11498b7e1044103131e2e3be4d63512eJohn McCall // CHECK-NEXT: add 2937f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i=j) + 0; 2947f79f9be5916c51c35da4f126b7c12596a101607Mike Stump 2957f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#ifdef __cplusplus 2967f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (i,j)=k; 2977f79f9be5916c51c35da4f126b7c12596a101607Mike Stump (j=k,i)=i; 2987f79f9be5916c51c35da4f126b7c12596a101607Mike Stump struct { int x; } s, s1; 2997f79f9be5916c51c35da4f126b7c12596a101607Mike Stump printf("s is at %p\n", &s); 3007f79f9be5916c51c35da4f126b7c12596a101607Mike Stump printf("s is at %p\n", &(s = s1)); 3017f79f9be5916c51c35da4f126b7c12596a101607Mike Stump printf("s.x is at %p\n", &((s = s1).x)); 3027f79f9be5916c51c35da4f126b7c12596a101607Mike Stump#endif 3037f79f9be5916c51c35da4f126b7c12596a101607Mike Stump} 304f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall 305f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallextern volatile enum X x; 306a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// CHECK-LABEL: define {{.*}}void @test1() 307f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallvoid test1() { 3083144b72a54fd18c5dfb01e322e8b8aed20a9fb90John McCall extern void test1_helper(void); 3093144b72a54fd18c5dfb01e322e8b8aed20a9fb90John McCall test1_helper(); 310a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // CHECK: call {{.*}}void @test1_helper() 311f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall // CHECK-NEXT: ret void 312f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall x; 313f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall (void) x; 314f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall return x; 315f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall} 3160934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman 31700f86f9cb58e798a43ecbcce033e69ee649c28d4Eli Friedman// CHECK: define {{.*}} @test2() 3180934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedmanint test2() { 3193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: load volatile i32, i32* 3203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile i32, i32* 3213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: load volatile i32, i32* 3220934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman // CHECK-NEXT: add i32 3230934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman // CHECK-NEXT: add i32 3240934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman // CHECK-NEXT: store volatile i32 3250934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman // CHECK-NEXT: ret i32 3260934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman return i += ci; 3270934e18b620ecaa6c7ec18ba5c4286b6122d6fb8Eli Friedman} 328