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