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