1238106Sdes/* PR middle-end/45423 */
2238106Sdes/* { dg-do compile } */
3238106Sdes/* { dg-options "-fopenmp -fdump-tree-gimple -g0" } */
4238106Sdes/* atomicvar should never be referenced in between the barrier and
5238106Sdes   following #pragma omp atomic_load.  */
6238106Sdes/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */
7238106Sdes/* { dg-final { cleanup-tree-dump "gimple" } } */
8238106Sdes
9238106Sdes#ifdef __cplusplus
10238106Sdesbool atomicvar, c;
11238106Sdes#else
12238106Sdes_Bool atomicvar, c;
13238106Sdes#endif
14238106Sdesint i, atomicvar2, c2;
15238106Sdes
16238106Sdesint
17238106Sdesfoo (void)
18238106Sdes{
19238106Sdes  #pragma omp barrier
20238106Sdes  #pragma omp atomic
21238106Sdes    atomicvar |= -1;
22238106Sdes  #pragma omp barrier
23238106Sdes  #pragma omp atomic
24238106Sdes    atomicvar |= 0;
25238106Sdes  #pragma omp barrier
26238106Sdes  #pragma omp atomic
27238106Sdes    atomicvar |= 1;
28238106Sdes  #pragma omp barrier
29238106Sdes  #pragma omp atomic
30238106Sdes    atomicvar |= 2;
31238106Sdes  #pragma omp barrier
32238106Sdes  #pragma omp atomic
33238106Sdes    atomicvar |= c;
34238106Sdes  #pragma omp barrier
35238106Sdes  #pragma omp atomic
36238106Sdes    atomicvar ^= -1;
37238106Sdes  #pragma omp barrier
38238106Sdes  #pragma omp atomic
39238106Sdes    atomicvar ^= 0;
40238106Sdes  #pragma omp barrier
41238106Sdes  #pragma omp atomic
42238106Sdes    atomicvar ^= 1;
43238106Sdes  #pragma omp barrier
44238106Sdes  #pragma omp atomic
45238106Sdes    atomicvar ^= 2;
46238106Sdes  #pragma omp barrier
47238106Sdes  #pragma omp atomic
48238106Sdes    atomicvar ^= c;
49238106Sdes  #pragma omp barrier
50238106Sdes  #pragma omp atomic
51238106Sdes    atomicvar &= -1;
52238106Sdes  #pragma omp barrier
53238106Sdes  #pragma omp atomic
54238106Sdes    atomicvar &= 0;
55238106Sdes  #pragma omp barrier
56238106Sdes  #pragma omp atomic
57238106Sdes    atomicvar &= 1;
58238106Sdes  #pragma omp barrier
59238106Sdes  #pragma omp atomic
60238106Sdes    atomicvar &= 2;
61238106Sdes  #pragma omp barrier
62238106Sdes  #pragma omp atomic
63238106Sdes    atomicvar &= c;
64238106Sdes  #pragma omp barrier
65238106Sdes  #pragma omp atomic
66238106Sdes    atomicvar += -1;
67238106Sdes  #pragma omp barrier
68238106Sdes  #pragma omp atomic
69238106Sdes    atomicvar += 0;
70238106Sdes  #pragma omp barrier
71238106Sdes  #pragma omp atomic
72238106Sdes    atomicvar += 1;
73238106Sdes  #pragma omp barrier
74238106Sdes  #pragma omp atomic
75238106Sdes    atomicvar += 2;
76238106Sdes  #pragma omp barrier
77238106Sdes  #pragma omp atomic
78238106Sdes    atomicvar += c;
79238106Sdes  #pragma omp barrier
80238106Sdes  #pragma omp atomic
81238106Sdes    atomicvar -= -1;
82238106Sdes  #pragma omp barrier
83238106Sdes  #pragma omp atomic
84238106Sdes    atomicvar -= 0;
85238106Sdes  #pragma omp barrier
86238106Sdes  #pragma omp atomic
87238106Sdes    atomicvar -= 1;
88238106Sdes  #pragma omp barrier
89238106Sdes  #pragma omp atomic
90238106Sdes    atomicvar -= 2;
91238106Sdes  #pragma omp barrier
92238106Sdes  #pragma omp atomic
93238106Sdes    atomicvar -= c;
94238106Sdes  #pragma omp barrier
95238106Sdes  #pragma omp atomic
96238106Sdes    atomicvar *= -1;
97238106Sdes  #pragma omp barrier
98238106Sdes  #pragma omp atomic
99238106Sdes    atomicvar *= 0;
100238106Sdes  #pragma omp barrier
101238106Sdes  #pragma omp atomic
102238106Sdes    atomicvar *= 1;
103238106Sdes  #pragma omp barrier
104238106Sdes  #pragma omp atomic
105238106Sdes    atomicvar *= 2;
106238106Sdes  #pragma omp barrier
107238106Sdes  #pragma omp atomic
108238106Sdes    atomicvar *= c;
109238106Sdes  #pragma omp barrier
110238106Sdes  #pragma omp atomic
111238106Sdes    atomicvar /= -1;
112238106Sdes  #pragma omp barrier
113238106Sdes  #pragma omp atomic
114238106Sdes    atomicvar /= 1;
115238106Sdes  #pragma omp barrier
116238106Sdes  #pragma omp atomic
117238106Sdes    atomicvar /= 2;
118238106Sdes  #pragma omp barrier
119238106Sdes  #pragma omp atomic
120238106Sdes    atomicvar /= c;
121238106Sdes  #pragma omp barrier
122238106Sdes  #pragma omp atomic
123238106Sdes    atomicvar <<= 0;
124238106Sdes  #pragma omp barrier
125238106Sdes  #pragma omp atomic
126238106Sdes    atomicvar <<= 1;
127238106Sdes  #pragma omp barrier
128238106Sdes  #pragma omp atomic
129238106Sdes    atomicvar <<= 2;
130238106Sdes  #pragma omp barrier
131238106Sdes  #pragma omp atomic
132238106Sdes    atomicvar <<= i;
133238106Sdes  #pragma omp barrier
134238106Sdes  #pragma omp atomic
135238106Sdes    atomicvar >>= 0;
136238106Sdes  #pragma omp barrier
137238106Sdes  #pragma omp atomic
138238106Sdes    atomicvar >>= 1;
139238106Sdes  #pragma omp barrier
140238106Sdes  #pragma omp atomic
141238106Sdes    atomicvar >>= 2;
142238106Sdes  #pragma omp barrier
143238106Sdes  #pragma omp atomic
144238106Sdes    atomicvar >>= i;
145238106Sdes  #pragma omp barrier
146238106Sdes  #pragma omp atomic
147238106Sdes    atomicvar++;
148238106Sdes  #pragma omp barrier
149238106Sdes  #pragma omp atomic
150238106Sdes    ++atomicvar;
151238106Sdes  #pragma omp barrier
152238106Sdes#ifndef __cplusplus
153238106Sdes  #pragma omp atomic
154238106Sdes    atomicvar--;
155238106Sdes  #pragma omp barrier
156238106Sdes  #pragma omp atomic
157238106Sdes    --atomicvar;
158238106Sdes  #pragma omp barrier
159238106Sdes#endif
160238106Sdes  return 0;
161238106Sdes}
162238106Sdes
163238106Sdesint
164238106Sdesbar (void)
165238106Sdes{
166238106Sdes  #pragma omp barrier
167238106Sdes  #pragma omp atomic
168238106Sdes    atomicvar2 |= -1;
169238106Sdes  #pragma omp barrier
170238106Sdes  #pragma omp atomic
171238106Sdes    atomicvar2 |= 0;
172238106Sdes  #pragma omp barrier
173238106Sdes  #pragma omp atomic
174238106Sdes    atomicvar2 |= 1;
175238106Sdes  #pragma omp barrier
176238106Sdes  #pragma omp atomic
177238106Sdes    atomicvar2 |= 2;
178238106Sdes  #pragma omp barrier
179238106Sdes  #pragma omp atomic
180238106Sdes    atomicvar2 |= c2;
181238106Sdes  #pragma omp barrier
182238106Sdes  #pragma omp atomic
183238106Sdes    atomicvar2 ^= -1;
184238106Sdes  #pragma omp barrier
185238106Sdes  #pragma omp atomic
186238106Sdes    atomicvar2 ^= 0;
187238106Sdes  #pragma omp barrier
188238106Sdes  #pragma omp atomic
189238106Sdes    atomicvar2 ^= 1;
190238106Sdes  #pragma omp barrier
191238106Sdes  #pragma omp atomic
192238106Sdes    atomicvar2 ^= 2;
193238106Sdes  #pragma omp barrier
194238106Sdes  #pragma omp atomic
195238106Sdes    atomicvar2 ^= c2;
196238106Sdes  #pragma omp barrier
197238106Sdes  #pragma omp atomic
198238106Sdes    atomicvar2 &= -1;
199238106Sdes  #pragma omp barrier
200238106Sdes  #pragma omp atomic
201238106Sdes    atomicvar2 &= 0;
202238106Sdes  #pragma omp barrier
203238106Sdes  #pragma omp atomic
204238106Sdes    atomicvar2 &= 1;
205238106Sdes  #pragma omp barrier
206238106Sdes  #pragma omp atomic
207238106Sdes    atomicvar2 &= 2;
208238106Sdes  #pragma omp barrier
209238106Sdes  #pragma omp atomic
210238106Sdes    atomicvar2 &= c2;
211238106Sdes  #pragma omp barrier
212238106Sdes  #pragma omp atomic
213238106Sdes    atomicvar2 += -1;
214238106Sdes  #pragma omp barrier
215238106Sdes  #pragma omp atomic
216238106Sdes    atomicvar2 += 0;
217238106Sdes  #pragma omp barrier
218238106Sdes  #pragma omp atomic
219238106Sdes    atomicvar2 += 1;
220238106Sdes  #pragma omp barrier
221238106Sdes  #pragma omp atomic
222238106Sdes    atomicvar2 += 2;
223238106Sdes  #pragma omp barrier
224238106Sdes  #pragma omp atomic
225238106Sdes    atomicvar2 += c2;
226238106Sdes  #pragma omp barrier
227238106Sdes  #pragma omp atomic
228238106Sdes    atomicvar2 -= -1;
229238106Sdes  #pragma omp barrier
230238106Sdes  #pragma omp atomic
231238106Sdes    atomicvar2 -= 0;
232238106Sdes  #pragma omp barrier
233238106Sdes  #pragma omp atomic
234238106Sdes    atomicvar2 -= 1;
235238106Sdes  #pragma omp barrier
236238106Sdes  #pragma omp atomic
237238106Sdes    atomicvar2 -= 2;
238238106Sdes  #pragma omp barrier
239238106Sdes  #pragma omp atomic
240238106Sdes    atomicvar2 -= c2;
241238106Sdes  #pragma omp barrier
242238106Sdes  #pragma omp atomic
243238106Sdes    atomicvar2 *= -1;
244238106Sdes  #pragma omp barrier
245238106Sdes  #pragma omp atomic
246238106Sdes    atomicvar2 *= 0;
247238106Sdes  #pragma omp barrier
248238106Sdes  #pragma omp atomic
249238106Sdes    atomicvar2 *= 1;
250238106Sdes  #pragma omp barrier
251238106Sdes  #pragma omp atomic
252238106Sdes    atomicvar2 *= 2;
253238106Sdes  #pragma omp barrier
254238106Sdes  #pragma omp atomic
255238106Sdes    atomicvar2 *= c2;
256238106Sdes  #pragma omp barrier
257238106Sdes  #pragma omp atomic
258238106Sdes    atomicvar2 /= -1;
259238106Sdes  #pragma omp barrier
260238106Sdes  #pragma omp atomic
261238106Sdes    atomicvar2 /= 1;
262238106Sdes  #pragma omp barrier
263238106Sdes  #pragma omp atomic
264238106Sdes    atomicvar2 /= 2;
265238106Sdes  #pragma omp barrier
266238106Sdes  #pragma omp atomic
267238106Sdes    atomicvar2 /= c2;
268238106Sdes  #pragma omp barrier
269238106Sdes  #pragma omp atomic
270238106Sdes    atomicvar2 <<= 0;
271238106Sdes  #pragma omp barrier
272238106Sdes  #pragma omp atomic
273238106Sdes    atomicvar2 <<= 1;
274238106Sdes  #pragma omp barrier
275238106Sdes  #pragma omp atomic
276238106Sdes    atomicvar2 <<= 2;
277238106Sdes  #pragma omp barrier
278238106Sdes  #pragma omp atomic
279238106Sdes    atomicvar2 <<= i;
280238106Sdes  #pragma omp barrier
281238106Sdes  #pragma omp atomic
282238106Sdes    atomicvar2 >>= 0;
283238106Sdes  #pragma omp barrier
284238106Sdes  #pragma omp atomic
285238106Sdes    atomicvar2 >>= 1;
286238106Sdes  #pragma omp barrier
287238106Sdes  #pragma omp atomic
288238106Sdes    atomicvar2 >>= 2;
289238106Sdes  #pragma omp barrier
290238106Sdes  #pragma omp atomic
291238106Sdes    atomicvar2 >>= i;
292238106Sdes  #pragma omp barrier
293238106Sdes  #pragma omp atomic
294238106Sdes    atomicvar2++;
295238106Sdes  #pragma omp barrier
296238106Sdes  #pragma omp atomic
297238106Sdes    ++atomicvar2;
298238106Sdes  #pragma omp barrier
299238106Sdes  #pragma omp atomic
300238106Sdes    atomicvar2--;
301238106Sdes  #pragma omp barrier
302238106Sdes  #pragma omp atomic
303238106Sdes    --atomicvar2;
304238106Sdes  #pragma omp barrier
305238106Sdes  return 0;
306238106Sdes}
307238106Sdes