1 /* PR middle-end/45423 */
2 /* { dg-do compile } */
3 /* { dg-options "-fopenmp -fdump-tree-gimple -g0 -Wno-deprecated" } */
4 /* atomicvar should never be referenced in between the barrier and
5    following #pragma omp atomic_load.  */
6 /* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
7 /* { dg-skip-if "invalid in C++17" { c++17 } } */
8 
9 #ifdef __cplusplus
10 bool atomicvar, c;
11 #else
12 _Bool atomicvar, c;
13 #endif
14 int i, atomicvar2, c2;
15 
16 int
foo(void)17 foo (void)
18 {
19   #pragma omp barrier
20   #pragma omp atomic
21     atomicvar |= -1;
22   #pragma omp barrier
23   #pragma omp atomic
24     atomicvar |= 0;
25   #pragma omp barrier
26   #pragma omp atomic
27     atomicvar |= 1;
28   #pragma omp barrier
29   #pragma omp atomic
30     atomicvar |= 2;
31   #pragma omp barrier
32   #pragma omp atomic
33     atomicvar |= c;
34   #pragma omp barrier
35   #pragma omp atomic
36     atomicvar ^= -1;
37   #pragma omp barrier
38   #pragma omp atomic
39     atomicvar ^= 0;
40   #pragma omp barrier
41   #pragma omp atomic
42     atomicvar ^= 1;
43   #pragma omp barrier
44   #pragma omp atomic
45     atomicvar ^= 2;
46   #pragma omp barrier
47   #pragma omp atomic
48     atomicvar ^= c;
49   #pragma omp barrier
50   #pragma omp atomic
51     atomicvar &= -1;
52   #pragma omp barrier
53   #pragma omp atomic
54     atomicvar &= 0;
55   #pragma omp barrier
56   #pragma omp atomic
57     atomicvar &= 1;
58   #pragma omp barrier
59   #pragma omp atomic
60     atomicvar &= 2;
61   #pragma omp barrier
62   #pragma omp atomic
63     atomicvar &= c;
64   #pragma omp barrier
65   #pragma omp atomic
66     atomicvar += -1;
67   #pragma omp barrier
68   #pragma omp atomic
69     atomicvar += 0;
70   #pragma omp barrier
71   #pragma omp atomic
72     atomicvar += 1;
73   #pragma omp barrier
74   #pragma omp atomic
75     atomicvar += 2;
76   #pragma omp barrier
77   #pragma omp atomic
78     atomicvar += c;
79   #pragma omp barrier
80   #pragma omp atomic
81     atomicvar -= -1;
82   #pragma omp barrier
83   #pragma omp atomic
84     atomicvar -= 0;
85   #pragma omp barrier
86   #pragma omp atomic
87     atomicvar -= 1;
88   #pragma omp barrier
89   #pragma omp atomic
90     atomicvar -= 2;
91   #pragma omp barrier
92   #pragma omp atomic
93     atomicvar -= c;
94   #pragma omp barrier
95   #pragma omp atomic
96     atomicvar *= -1;
97   #pragma omp barrier
98   #pragma omp atomic
99     atomicvar *= 0;
100   #pragma omp barrier
101   #pragma omp atomic
102     atomicvar *= 1;
103   #pragma omp barrier
104   #pragma omp atomic
105     atomicvar *= 2;
106   #pragma omp barrier
107   #pragma omp atomic
108     atomicvar *= c;
109   #pragma omp barrier
110   #pragma omp atomic
111     atomicvar /= -1;
112   #pragma omp barrier
113   #pragma omp atomic
114     atomicvar /= 1;
115   #pragma omp barrier
116   #pragma omp atomic
117     atomicvar /= 2;
118   #pragma omp barrier
119   #pragma omp atomic
120     atomicvar /= c;
121   #pragma omp barrier
122   #pragma omp atomic
123     atomicvar <<= 0;
124   #pragma omp barrier
125   #pragma omp atomic
126     atomicvar <<= 1;
127   #pragma omp barrier
128   #pragma omp atomic
129     atomicvar <<= 2;
130   #pragma omp barrier
131   #pragma omp atomic
132     atomicvar <<= i;
133   #pragma omp barrier
134   #pragma omp atomic
135     atomicvar >>= 0;
136   #pragma omp barrier
137   #pragma omp atomic
138     atomicvar >>= 1;
139   #pragma omp barrier
140   #pragma omp atomic
141     atomicvar >>= 2;
142   #pragma omp barrier
143   #pragma omp atomic
144     atomicvar >>= i;
145   #pragma omp barrier
146   #pragma omp atomic
147     atomicvar++;
148   #pragma omp barrier
149   #pragma omp atomic
150     ++atomicvar;
151   #pragma omp barrier
152 #ifndef __cplusplus
153   #pragma omp atomic
154     atomicvar--;
155   #pragma omp barrier
156   #pragma omp atomic
157     --atomicvar;
158   #pragma omp barrier
159 #endif
160   return 0;
161 }
162 
163 int
bar(void)164 bar (void)
165 {
166   #pragma omp barrier
167   #pragma omp atomic
168     atomicvar2 |= -1;
169   #pragma omp barrier
170   #pragma omp atomic
171     atomicvar2 |= 0;
172   #pragma omp barrier
173   #pragma omp atomic
174     atomicvar2 |= 1;
175   #pragma omp barrier
176   #pragma omp atomic
177     atomicvar2 |= 2;
178   #pragma omp barrier
179   #pragma omp atomic
180     atomicvar2 |= c2;
181   #pragma omp barrier
182   #pragma omp atomic
183     atomicvar2 ^= -1;
184   #pragma omp barrier
185   #pragma omp atomic
186     atomicvar2 ^= 0;
187   #pragma omp barrier
188   #pragma omp atomic
189     atomicvar2 ^= 1;
190   #pragma omp barrier
191   #pragma omp atomic
192     atomicvar2 ^= 2;
193   #pragma omp barrier
194   #pragma omp atomic
195     atomicvar2 ^= c2;
196   #pragma omp barrier
197   #pragma omp atomic
198     atomicvar2 &= -1;
199   #pragma omp barrier
200   #pragma omp atomic
201     atomicvar2 &= 0;
202   #pragma omp barrier
203   #pragma omp atomic
204     atomicvar2 &= 1;
205   #pragma omp barrier
206   #pragma omp atomic
207     atomicvar2 &= 2;
208   #pragma omp barrier
209   #pragma omp atomic
210     atomicvar2 &= c2;
211   #pragma omp barrier
212   #pragma omp atomic
213     atomicvar2 += -1;
214   #pragma omp barrier
215   #pragma omp atomic
216     atomicvar2 += 0;
217   #pragma omp barrier
218   #pragma omp atomic
219     atomicvar2 += 1;
220   #pragma omp barrier
221   #pragma omp atomic
222     atomicvar2 += 2;
223   #pragma omp barrier
224   #pragma omp atomic
225     atomicvar2 += c2;
226   #pragma omp barrier
227   #pragma omp atomic
228     atomicvar2 -= -1;
229   #pragma omp barrier
230   #pragma omp atomic
231     atomicvar2 -= 0;
232   #pragma omp barrier
233   #pragma omp atomic
234     atomicvar2 -= 1;
235   #pragma omp barrier
236   #pragma omp atomic
237     atomicvar2 -= 2;
238   #pragma omp barrier
239   #pragma omp atomic
240     atomicvar2 -= c2;
241   #pragma omp barrier
242   #pragma omp atomic
243     atomicvar2 *= -1;
244   #pragma omp barrier
245   #pragma omp atomic
246     atomicvar2 *= 0;
247   #pragma omp barrier
248   #pragma omp atomic
249     atomicvar2 *= 1;
250   #pragma omp barrier
251   #pragma omp atomic
252     atomicvar2 *= 2;
253   #pragma omp barrier
254   #pragma omp atomic
255     atomicvar2 *= c2;
256   #pragma omp barrier
257   #pragma omp atomic
258     atomicvar2 /= -1;
259   #pragma omp barrier
260   #pragma omp atomic
261     atomicvar2 /= 1;
262   #pragma omp barrier
263   #pragma omp atomic
264     atomicvar2 /= 2;
265   #pragma omp barrier
266   #pragma omp atomic
267     atomicvar2 /= c2;
268   #pragma omp barrier
269   #pragma omp atomic
270     atomicvar2 <<= 0;
271   #pragma omp barrier
272   #pragma omp atomic
273     atomicvar2 <<= 1;
274   #pragma omp barrier
275   #pragma omp atomic
276     atomicvar2 <<= 2;
277   #pragma omp barrier
278   #pragma omp atomic
279     atomicvar2 <<= i;
280   #pragma omp barrier
281   #pragma omp atomic
282     atomicvar2 >>= 0;
283   #pragma omp barrier
284   #pragma omp atomic
285     atomicvar2 >>= 1;
286   #pragma omp barrier
287   #pragma omp atomic
288     atomicvar2 >>= 2;
289   #pragma omp barrier
290   #pragma omp atomic
291     atomicvar2 >>= i;
292   #pragma omp barrier
293   #pragma omp atomic
294     atomicvar2++;
295   #pragma omp barrier
296   #pragma omp atomic
297     ++atomicvar2;
298   #pragma omp barrier
299   #pragma omp atomic
300     atomicvar2--;
301   #pragma omp barrier
302   #pragma omp atomic
303     --atomicvar2;
304   #pragma omp barrier
305   return 0;
306 }
307