1 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8 
9 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck --check-prefixes=CHECK,CHECK-51 %s
10 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
11 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck --check-prefixes=CHECK,CHECK-51 %s
12 
13 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck --check-prefixes=CHECK,CHECK-51 %s
14 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s
15 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck --check-prefixes=CHECK,CHECK-51 %s
16 // expected-no-diagnostics
17 
18 #ifndef HEADER
19 #define HEADER
20 
21 template <class T>
foo(T argc)22 T foo(T argc) {
23   T v = T();
24   T c = T();
25   T b = T();
26   T a = T();
27 #pragma omp atomic
28   a++;
29 #pragma omp atomic read
30   a = argc;
31 #pragma omp atomic write
32   a = argc + argc;
33 #pragma omp atomic update
34   a = a + argc;
35 #pragma omp atomic capture
36   a = b++;
37 #pragma omp atomic capture
38   {
39     a = b;
40     b++;
41   }
42 #ifdef OMP51
43 #pragma omp atomic compare
44   { a = a > b ? b : a; }
45 #pragma omp atomic compare
46   { a = a < b ? b : a; }
47 #pragma omp atomic compare
48   { a = a == b ? c : a; }
49 #pragma omp atomic compare capture
50   { v = a; if (a > b) { a = b; } }
51 #pragma omp atomic compare capture
52   { v = a; if (a < b) { a = b; } }
53 #pragma omp atomic compare capture
54   { v = a == b; if (v) a = c; }
55 #endif
56 #pragma omp atomic seq_cst
57   a++;
58 #pragma omp atomic read seq_cst
59   a = argc;
60 #pragma omp atomic seq_cst write
61   a = argc + argc;
62 #pragma omp atomic update seq_cst
63   a = a + argc;
64 #pragma omp atomic seq_cst capture
65   a = b++;
66 #pragma omp atomic capture seq_cst
67   {
68     a = b;
69     b++;
70   }
71 #ifdef OMP51
72 #pragma omp atomic compare seq_cst
73   { a = a > b ? b : a; }
74 #pragma omp atomic seq_cst compare
75   { a = a < b ? b : a; }
76 #pragma omp atomic compare seq_cst
77   { a = a == b ? c : a; }
78 #pragma omp atomic compare capture seq_cst
79   { v = a; if (a > b) { a = b; } }
80 #pragma omp atomic compare seq_cst capture
81   { v = a; if (a < b) { a = b; } }
82 #pragma omp atomic compare capture seq_cst
83   { v = a == b; if (v) a = c; }
84 #endif
85 #pragma omp atomic
86   a++;
87 #pragma omp atomic read
88   a = argc;
89 #pragma omp atomic write
90   a = argc + argc;
91 #pragma omp atomic update
92   a = a + argc;
93 #pragma omp atomic acq_rel capture
94   a = b++;
95 #pragma omp atomic capture acq_rel
96   {
97     a = b;
98     b++;
99   }
100 #ifdef OMP51
101 #pragma omp atomic compare acq_rel
102   { a = a > b ? b : a; }
103 #pragma omp atomic acq_rel compare
104   { a = a < b ? b : a; }
105 #pragma omp atomic compare acq_rel
106   { a = a == b ? c : a; }
107 #pragma omp atomic compare capture acq_rel
108   { v = a; if (a > b) { a = b; } }
109 #pragma omp atomic compare acq_rel capture
110   { v = a; if (a < b) { a = b; } }
111 #pragma omp atomic compare capture acq_rel
112   { v = a == b; if (v) a = c; }
113 #endif
114 #pragma omp atomic
115   a++;
116 #pragma omp atomic read acquire
117   a = argc;
118 #pragma omp atomic write
119   a = argc + argc;
120 #pragma omp atomic update
121   a = a + argc;
122 #pragma omp atomic acquire capture
123   a = b++;
124 #pragma omp atomic capture acquire
125   {
126     a = b;
127     b++;
128   }
129 #ifdef OMP51
130 #pragma omp atomic compare acquire
131   { a = a > b ? b : a; }
132 #pragma omp atomic acquire compare
133   { a = a < b ? b : a; }
134 #pragma omp atomic compare acquire
135   { a = a == b ? c : a; }
136 #pragma omp atomic compare capture acquire
137   { v = a; if (a > b) { a = b; } }
138 #pragma omp atomic compare acquire capture
139   { v = a; if (a < b) { a = b; } }
140 #pragma omp atomic compare capture acquire
141   { v = a == b; if (v) a = c; }
142 #endif
143 #pragma omp atomic release
144   a++;
145 #pragma omp atomic read
146   a = argc;
147 #pragma omp atomic release write
148   a = argc + argc;
149 #pragma omp atomic update release
150   a = a + argc;
151 #pragma omp atomic release capture
152   a = b++;
153 #pragma omp atomic capture release
154   {
155     a = b;
156     b++;
157   }
158 #ifdef OMP51
159 #pragma omp atomic compare release
160   { a = a > b ? b : a; }
161 #pragma omp atomic release compare
162   { a = a < b ? b : a; }
163 #pragma omp atomic compare release
164   { a = a == b ? c : a; }
165 #pragma omp atomic compare capture release
166   { v = a; if (a > b) { a = b; } }
167 #pragma omp atomic compare release capture
168   { v = a; if (a < b) { a = b; } }
169 #pragma omp atomic compare capture release
170   { v = a == b; if (v) a = c; }
171 #endif
172 #pragma omp atomic relaxed
173   a++;
174 #pragma omp atomic read
175   a = argc;
176 #pragma omp atomic relaxed write
177   a = argc + argc;
178 #pragma omp atomic update relaxed
179   a = a + argc;
180 #pragma omp atomic relaxed capture
181   a = b++;
182 #pragma omp atomic capture relaxed
183   {
184     a = b;
185     b++;
186   }
187 #ifdef OMP51
188 #pragma omp atomic compare relaxed
189   { a = a > b ? b : a; }
190 #pragma omp atomic relaxed compare
191   { a = a < b ? b : a; }
192 #pragma omp atomic compare relaxed
193   { a = a == b ? c : a; }
194 #pragma omp atomic compare capture relaxed
195   { v = a; if (a > b) { a = b; } }
196 #pragma omp atomic compare relaxed capture
197   { v = a; if (a < b) { a = b; } }
198 #pragma omp atomic compare capture relaxed
199   { v = a == b; if (v) a = c; }
200 #endif
201 #pragma omp atomic hint(6)
202   a++;
203 #pragma omp atomic read hint(6)
204   a = argc;
205 #pragma omp atomic hint(6) write
206   a = argc + argc;
207 #pragma omp atomic update hint(6)
208   a = a + argc;
209 #pragma omp atomic hint(6) capture
210   a = b++;
211 #pragma omp atomic capture hint(6)
212   {
213     a = b;
214     b++;
215   }
216 #ifdef OMP51
217 #pragma omp atomic compare hint(6)
218   { a = a > b ? b : a; }
219 #pragma omp atomic hint(6) compare
220   { a = a < b ? b : a; }
221 #pragma omp atomic compare hint(6)
222   { a = a == b ? c : a; }
223 #pragma omp atomic compare capture hint(6)
224   { v = a; if (a > b) { a = b; } }
225 #pragma omp atomic compare hint(6) capture
226   { v = a; if (a < b) { a = b; } }
227 #pragma omp atomic compare capture hint(6)
228   { v = a == b; if (v) a = c; }
229 #endif
230   return T();
231 }
232 
233 // CHECK: T a = T();
234 // CHECK-NEXT: #pragma omp atomic{{$}}
235 // CHECK-NEXT: a++;
236 // CHECK-NEXT: #pragma omp atomic read
237 // CHECK-NEXT: a = argc;
238 // CHECK-NEXT: #pragma omp atomic write
239 // CHECK-NEXT: a = argc + argc;
240 // CHECK-NEXT: #pragma omp atomic update
241 // CHECK-NEXT: a = a + argc;
242 // CHECK-NEXT: #pragma omp atomic capture
243 // CHECK-NEXT: a = b++;
244 // CHECK-NEXT: #pragma omp atomic capture
245 // CHECK-NEXT: {
246 // CHECK-NEXT: a = b;
247 // CHECK-NEXT: b++;
248 // CHECK-NEXT: }
249 // CHECK-51-NEXT: #pragma omp atomic compare
250 // CHECK-51-NEXT: {
251 // CHECK-51-NEXT: a = a > b ? b : a;
252 // CHECK-51-NEXT: }
253 // CHECK-51-NEXT: #pragma omp atomic compare
254 // CHECK-51-NEXT: {
255 // CHECK-51-NEXT: a = a < b ? b : a;
256 // CHECK-51-NEXT: }
257 // CHECK-51-NEXT: #pragma omp atomic compare
258 // CHECK-51-NEXT: {
259 // CHECK-51-NEXT: a = a == b ? c : a;
260 // CHECK-51-NEXT: }
261 // CHECK-51-NEXT: #pragma omp atomic compare capture
262 // CHECK-51-NEXT: {
263 // CHECK-51-NEXT: v = a;
264 // CHECK-51-NEXT: if (a > b) {
265 // CHECK-51-NEXT: a = b;
266 // CHECK-51-NEXT: }
267 // CHECK-51-NEXT: }
268 // CHECK-51-NEXT: #pragma omp atomic compare capture
269 // CHECK-51-NEXT: {
270 // CHECK-51-NEXT: v = a;
271 // CHECK-51-NEXT: if (a < b) {
272 // CHECK-51-NEXT: a = b;
273 // CHECK-51-NEXT: }
274 // CHECK-51-NEXT: }
275 // CHECK-51-NEXT: #pragma omp atomic compare capture
276 // CHECK-51-NEXT: {
277 // CHECK-51-NEXT: v = a == b;
278 // CHECK-51-NEXT: if (v)
279 // CHECK-51-NEXT: a = c;
280 // CHECK-51-NEXT: }
281 // CHECK-NEXT: #pragma omp atomic seq_cst
282 // CHECK-NEXT: a++;
283 // CHECK-NEXT: #pragma omp atomic read seq_cst
284 // CHECK-NEXT: a = argc;
285 // CHECK-NEXT: #pragma omp atomic seq_cst write
286 // CHECK-NEXT: a = argc + argc;
287 // CHECK-NEXT: #pragma omp atomic update seq_cst
288 // CHECK-NEXT: a = a + argc;
289 // CHECK-NEXT: #pragma omp atomic seq_cst capture
290 // CHECK-NEXT: a = b++;
291 // CHECK-NEXT: #pragma omp atomic capture seq_cst
292 // CHECK-NEXT: {
293 // CHECK-NEXT: a = b;
294 // CHECK-NEXT: b++;
295 // CHECK-NEXT: }
296 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
297 // CHECK-51-NEXT: {
298 // CHECK-51-NEXT: a = a > b ? b : a;
299 // CHECK-51-NEXT: }
300 // CHECK-51-NEXT: #pragma omp atomic seq_cst compare
301 // CHECK-51-NEXT: {
302 // CHECK-51-NEXT: a = a < b ? b : a;
303 // CHECK-51-NEXT: }
304 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
305 // CHECK-51-NEXT: {
306 // CHECK-51-NEXT: a = a == b ? c : a;
307 // CHECK-51-NEXT: }
308 // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
309 // CHECK-51-NEXT: {
310 // CHECK-51-NEXT: v = a;
311 // CHECK-51-NEXT: if (a > b) {
312 // CHECK-51-NEXT: a = b;
313 // CHECK-51-NEXT: }
314 // CHECK-51-NEXT: }
315 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst capture
316 // CHECK-51-NEXT: {
317 // CHECK-51-NEXT: v = a;
318 // CHECK-51-NEXT: if (a < b) {
319 // CHECK-51-NEXT: a = b;
320 // CHECK-51-NEXT: }
321 // CHECK-51-NEXT: }
322 // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
323 // CHECK-51-NEXT: {
324 // CHECK-51-NEXT: v = a == b;
325 // CHECK-51-NEXT: if (v)
326 // CHECK-51-NEXT: a = c;
327 // CHECK-51-NEXT: }
328 // CHECK-NEXT: #pragma omp atomic
329 // CHECK-NEXT: a++;
330 // CHECK-NEXT: #pragma omp atomic read
331 // CHECK-NEXT: a = argc;
332 // CHECK-NEXT: #pragma omp atomic write
333 // CHECK-NEXT: a = argc + argc;
334 // CHECK-NEXT: #pragma omp atomic update
335 // CHECK-NEXT: a = a + argc;
336 // CHECK-NEXT: #pragma omp atomic acq_rel capture
337 // CHECK-NEXT: a = b++;
338 // CHECK-NEXT: #pragma omp atomic capture acq_rel
339 // CHECK-NEXT: {
340 // CHECK-NEXT: a = b;
341 // CHECK-NEXT: b++;
342 // CHECK-NEXT: }
343 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
344 // CHECK-51-NEXT: {
345 // CHECK-51-NEXT: a = a > b ? b : a;
346 // CHECK-51-NEXT: }
347 // CHECK-51-NEXT: #pragma omp atomic acq_rel compare
348 // CHECK-51-NEXT: {
349 // CHECK-51-NEXT: a = a < b ? b : a;
350 // CHECK-51-NEXT: }
351 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
352 // CHECK-51-NEXT: {
353 // CHECK-51-NEXT: a = a == b ? c : a;
354 // CHECK-51-NEXT: }
355 // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
356 // CHECK-51-NEXT: {
357 // CHECK-51-NEXT: v = a;
358 // CHECK-51-NEXT: if (a > b) {
359 // CHECK-51-NEXT: a = b;
360 // CHECK-51-NEXT: }
361 // CHECK-51-NEXT: }
362 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel capture
363 // CHECK-51-NEXT: {
364 // CHECK-51-NEXT: v = a;
365 // CHECK-51-NEXT: if (a < b) {
366 // CHECK-51-NEXT: a = b;
367 // CHECK-51-NEXT: }
368 // CHECK-51-NEXT: }
369 // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
370 // CHECK-51-NEXT: {
371 // CHECK-51-NEXT: v = a == b;
372 // CHECK-51-NEXT: if (v)
373 // CHECK-51-NEXT: a = c;
374 // CHECK-51-NEXT: }
375 // CHECK-NEXT: #pragma omp atomic
376 // CHECK-NEXT: a++;
377 // CHECK-NEXT: #pragma omp atomic read acquire
378 // CHECK-NEXT: a = argc;
379 // CHECK-NEXT: #pragma omp atomic write
380 // CHECK-NEXT: a = argc + argc;
381 // CHECK-NEXT: #pragma omp atomic update
382 // CHECK-NEXT: a = a + argc;
383 // CHECK-NEXT: #pragma omp atomic acquire capture
384 // CHECK-NEXT: a = b++;
385 // CHECK-NEXT: #pragma omp atomic capture acquire
386 // CHECK-NEXT: {
387 // CHECK-NEXT: a = b;
388 // CHECK-NEXT: b++;
389 // CHECK-NEXT: }
390 // CHECK-51-NEXT: #pragma omp atomic compare acquire
391 // CHECK-51-NEXT: {
392 // CHECK-51-NEXT: a = a > b ? b : a;
393 // CHECK-51-NEXT: }
394 // CHECK-51-NEXT: #pragma omp atomic acquire compare
395 // CHECK-51-NEXT: {
396 // CHECK-51-NEXT: a = a < b ? b : a;
397 // CHECK-51-NEXT: }
398 // CHECK-51-NEXT: #pragma omp atomic compare acquire
399 // CHECK-51-NEXT: {
400 // CHECK-51-NEXT: a = a == b ? c : a;
401 // CHECK-51-NEXT: }
402 // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
403 // CHECK-51-NEXT: {
404 // CHECK-51-NEXT: v = a;
405 // CHECK-51-NEXT: if (a > b) {
406 // CHECK-51-NEXT: a = b;
407 // CHECK-51-NEXT: }
408 // CHECK-51-NEXT: }
409 // CHECK-51-NEXT: #pragma omp atomic compare acquire capture
410 // CHECK-51-NEXT: {
411 // CHECK-51-NEXT: v = a;
412 // CHECK-51-NEXT: if (a < b) {
413 // CHECK-51-NEXT: a = b;
414 // CHECK-51-NEXT: }
415 // CHECK-51-NEXT: }
416 // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
417 // CHECK-51-NEXT: {
418 // CHECK-51-NEXT: v = a == b;
419 // CHECK-51-NEXT: if (v)
420 // CHECK-51-NEXT: a = c;
421 // CHECK-51-NEXT: }
422 // CHECK-NEXT: #pragma omp atomic release
423 // CHECK-NEXT: a++;
424 // CHECK-NEXT: #pragma omp atomic read
425 // CHECK-NEXT: a = argc;
426 // CHECK-NEXT: #pragma omp atomic release write
427 // CHECK-NEXT: a = argc + argc;
428 // CHECK-NEXT: #pragma omp atomic update release
429 // CHECK-NEXT: a = a + argc;
430 // CHECK-NEXT: #pragma omp atomic release capture
431 // CHECK-NEXT: a = b++;
432 // CHECK-NEXT: #pragma omp atomic capture release
433 // CHECK-NEXT: {
434 // CHECK-NEXT: a = b;
435 // CHECK-NEXT: b++;
436 // CHECK-NEXT: }
437 // CHECK-51-NEXT: #pragma omp atomic compare release
438 // CHECK-51-NEXT: {
439 // CHECK-51-NEXT: a = a > b ? b : a;
440 // CHECK-51-NEXT: }
441 // CHECK-51-NEXT: #pragma omp atomic release compare
442 // CHECK-51-NEXT: {
443 // CHECK-51-NEXT: a = a < b ? b : a;
444 // CHECK-51-NEXT: }
445 // CHECK-51-NEXT: #pragma omp atomic compare release
446 // CHECK-51-NEXT: {
447 // CHECK-51-NEXT: a = a == b ? c : a;
448 // CHECK-51-NEXT: }
449 // CHECK-51-NEXT: #pragma omp atomic compare capture release
450 // CHECK-51-NEXT: {
451 // CHECK-51-NEXT: v = a;
452 // CHECK-51-NEXT: if (a > b) {
453 // CHECK-51-NEXT: a = b;
454 // CHECK-51-NEXT: }
455 // CHECK-51-NEXT: }
456 // CHECK-51-NEXT: #pragma omp atomic compare release capture
457 // CHECK-51-NEXT: {
458 // CHECK-51-NEXT: v = a;
459 // CHECK-51-NEXT: if (a < b) {
460 // CHECK-51-NEXT: a = b;
461 // CHECK-51-NEXT: }
462 // CHECK-51-NEXT: }
463 // CHECK-51-NEXT: #pragma omp atomic compare capture release
464 // CHECK-51-NEXT: {
465 // CHECK-51-NEXT: v = a == b;
466 // CHECK-51-NEXT: if (v)
467 // CHECK-51-NEXT: a = c;
468 // CHECK-51-NEXT: }
469 // CHECK-NEXT: #pragma omp atomic relaxed
470 // CHECK-NEXT: a++;
471 // CHECK-NEXT: #pragma omp atomic read
472 // CHECK-NEXT: a = argc;
473 // CHECK-NEXT: #pragma omp atomic relaxed write
474 // CHECK-NEXT: a = argc + argc;
475 // CHECK-NEXT: #pragma omp atomic update relaxed
476 // CHECK-NEXT: a = a + argc;
477 // CHECK-NEXT: #pragma omp atomic relaxed capture
478 // CHECK-NEXT: a = b++;
479 // CHECK-NEXT: #pragma omp atomic capture relaxed
480 // CHECK-NEXT: {
481 // CHECK-NEXT: a = b;
482 // CHECK-NEXT: b++;
483 // CHECK-NEXT: }
484 // CHECK-51-NEXT: #pragma omp atomic compare relaxed
485 // CHECK-51-NEXT: {
486 // CHECK-51-NEXT: a = a > b ? b : a;
487 // CHECK-51-NEXT: }
488 // CHECK-51-NEXT: #pragma omp atomic relaxed compare
489 // CHECK-51-NEXT: {
490 // CHECK-51-NEXT: a = a < b ? b : a;
491 // CHECK-51-NEXT: }
492 // CHECK-51-NEXT: #pragma omp atomic compare relaxed
493 // CHECK-51-NEXT: {
494 // CHECK-51-NEXT: a = a == b ? c : a;
495 // CHECK-51-NEXT: }
496 // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
497 // CHECK-51-NEXT: {
498 // CHECK-51-NEXT: v = a;
499 // CHECK-51-NEXT: if (a > b) {
500 // CHECK-51-NEXT: a = b;
501 // CHECK-51-NEXT: }
502 // CHECK-51-NEXT: }
503 // CHECK-51-NEXT: #pragma omp atomic compare relaxed capture
504 // CHECK-51-NEXT: {
505 // CHECK-51-NEXT: v = a;
506 // CHECK-51-NEXT: if (a < b) {
507 // CHECK-51-NEXT: a = b;
508 // CHECK-51-NEXT: }
509 // CHECK-51-NEXT: }
510 // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
511 // CHECK-51-NEXT: {
512 // CHECK-51-NEXT: v = a == b;
513 // CHECK-51-NEXT: if (v)
514 // CHECK-51-NEXT: a = c;
515 // CHECK-51-NEXT: }
516 // CHECK-NEXT: #pragma omp atomic hint(6)
517 // CHECK-NEXT: a++;
518 // CHECK-NEXT: #pragma omp atomic read hint(6)
519 // CHECK-NEXT: a = argc;
520 // CHECK-NEXT: #pragma omp atomic hint(6) write
521 // CHECK-NEXT: a = argc + argc;
522 // CHECK-NEXT: #pragma omp atomic update hint(6)
523 // CHECK-NEXT: a = a + argc;
524 // CHECK-NEXT: #pragma omp atomic hint(6) capture
525 // CHECK-NEXT: a = b++;
526 // CHECK-NEXT: #pragma omp atomic capture hint(6)
527 // CHECK-NEXT: {
528 // CHECK-NEXT: a = b;
529 // CHECK-NEXT: b++;
530 // CHECK-NEXT: }
531 // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
532 // CHECK-51-NEXT: {
533 // CHECK-51-NEXT: a = a > b ? b : a;
534 // CHECK-51-NEXT: }
535 // CHECK-51-NEXT: #pragma omp atomic hint(6) compare
536 // CHECK-51-NEXT: {
537 // CHECK-51-NEXT: a = a < b ? b : a;
538 // CHECK-51-NEXT: }
539 // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
540 // CHECK-51-NEXT: {
541 // CHECK-51-NEXT: a = a == b ? c : a;
542 // CHECK-51-NEXT: }
543 // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
544 // CHECK-51-NEXT: {
545 // CHECK-51-NEXT: v = a;
546 // CHECK-51-NEXT: if (a > b) {
547 // CHECK-51-NEXT: a = b;
548 // CHECK-51-NEXT: }
549 // CHECK-51-NEXT: }
550 // CHECK-51-NEXT: #pragma omp atomic compare hint(6) capture
551 // CHECK-51-NEXT: {
552 // CHECK-51-NEXT: v = a;
553 // CHECK-51-NEXT: if (a < b) {
554 // CHECK-51-NEXT: a = b;
555 // CHECK-51-NEXT: }
556 // CHECK-51-NEXT: }
557 // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
558 // CHECK-51-NEXT: {
559 // CHECK-51-NEXT: v = a == b;
560 // CHECK-51-NEXT: if (v)
561 // CHECK-51-NEXT: a = c;
562 // CHECK-51-NEXT: }
563 // CHECK: int a = int();
564 // CHECK-NEXT: #pragma omp atomic
565 // CHECK-NEXT: a++;
566 // CHECK-NEXT: #pragma omp atomic read
567 // CHECK-NEXT: a = argc;
568 // CHECK-NEXT: #pragma omp atomic write
569 // CHECK-NEXT: a = argc + argc;
570 // CHECK-NEXT: #pragma omp atomic update
571 // CHECK-NEXT: a = a + argc;
572 // CHECK-NEXT: #pragma omp atomic capture
573 // CHECK-NEXT: a = b++;
574 // CHECK-NEXT: #pragma omp atomic capture
575 // CHECK-NEXT: {
576 // CHECK-NEXT: a = b;
577 // CHECK-NEXT: b++;
578 // CHECK-NEXT: }
579 // CHECK-51-NEXT: #pragma omp atomic compare
580 // CHECK-51-NEXT: {
581 // CHECK-51-NEXT: a = a > b ? b : a;
582 // CHECK-51-NEXT: }
583 // CHECK-51-NEXT: #pragma omp atomic compare
584 // CHECK-51-NEXT: {
585 // CHECK-51-NEXT: a = a < b ? b : a;
586 // CHECK-51-NEXT: }
587 // CHECK-51-NEXT: #pragma omp atomic compare
588 // CHECK-51-NEXT: {
589 // CHECK-51-NEXT: a = a == b ? c : a;
590 // CHECK-51-NEXT: }
591 // CHECK-51-NEXT: #pragma omp atomic compare capture
592 // CHECK-51-NEXT: {
593 // CHECK-51-NEXT: v = a;
594 // CHECK-51-NEXT: if (a > b) {
595 // CHECK-51-NEXT: a = b;
596 // CHECK-51-NEXT: }
597 // CHECK-51-NEXT: }
598 // CHECK-51-NEXT: #pragma omp atomic compare capture
599 // CHECK-51-NEXT: {
600 // CHECK-51-NEXT: v = a;
601 // CHECK-51-NEXT: if (a < b) {
602 // CHECK-51-NEXT: a = b;
603 // CHECK-51-NEXT: }
604 // CHECK-51-NEXT: }
605 // CHECK-51-NEXT: #pragma omp atomic compare capture
606 // CHECK-51-NEXT: {
607 // CHECK-51-NEXT: v = a == b;
608 // CHECK-51-NEXT: if (v)
609 // CHECK-51-NEXT: a = c;
610 // CHECK-51-NEXT: }
611 // CHECK-NEXT: #pragma omp atomic seq_cst
612 // CHECK-NEXT: a++;
613 // CHECK-NEXT: #pragma omp atomic read seq_cst
614 // CHECK-NEXT: a = argc;
615 // CHECK-NEXT: #pragma omp atomic seq_cst write
616 // CHECK-NEXT: a = argc + argc;
617 // CHECK-NEXT: #pragma omp atomic update seq_cst
618 // CHECK-NEXT: a = a + argc;
619 // CHECK-NEXT: #pragma omp atomic seq_cst capture
620 // CHECK-NEXT: a = b++;
621 // CHECK-NEXT: #pragma omp atomic capture seq_cst
622 // CHECK-NEXT: {
623 // CHECK-NEXT: a = b;
624 // CHECK-NEXT: b++;
625 // CHECK-NEXT: }
626 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
627 // CHECK-51-NEXT: {
628 // CHECK-51-NEXT: a = a > b ? b : a;
629 // CHECK-51-NEXT: }
630 // CHECK-51-NEXT: #pragma omp atomic seq_cst compare
631 // CHECK-51-NEXT: {
632 // CHECK-51-NEXT: a = a < b ? b : a;
633 // CHECK-51-NEXT: }
634 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
635 // CHECK-51-NEXT: {
636 // CHECK-51-NEXT: a = a == b ? c : a;
637 // CHECK-51-NEXT: }
638 // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
639 // CHECK-51-NEXT: {
640 // CHECK-51-NEXT: v = a;
641 // CHECK-51-NEXT: if (a > b) {
642 // CHECK-51-NEXT: a = b;
643 // CHECK-51-NEXT: }
644 // CHECK-51-NEXT: }
645 // CHECK-51-NEXT: #pragma omp atomic compare seq_cst capture
646 // CHECK-51-NEXT: {
647 // CHECK-51-NEXT: v = a;
648 // CHECK-51-NEXT: if (a < b) {
649 // CHECK-51-NEXT: a = b;
650 // CHECK-51-NEXT: }
651 // CHECK-51-NEXT: }
652 // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
653 // CHECK-51-NEXT: {
654 // CHECK-51-NEXT: v = a == b;
655 // CHECK-51-NEXT: if (v)
656 // CHECK-51-NEXT: a = c;
657 // CHECK-51-NEXT: }
658 // CHECK-NEXT: #pragma omp atomic
659 // CHECK-NEXT: a++;
660 // CHECK-NEXT: #pragma omp atomic read
661 // CHECK-NEXT: a = argc;
662 // CHECK-NEXT: #pragma omp atomic write
663 // CHECK-NEXT: a = argc + argc;
664 // CHECK-NEXT: #pragma omp atomic update
665 // CHECK-NEXT: a = a + argc;
666 // CHECK-NEXT: #pragma omp atomic acq_rel capture
667 // CHECK-NEXT: a = b++;
668 // CHECK-NEXT: #pragma omp atomic capture acq_rel
669 // CHECK-NEXT: {
670 // CHECK-NEXT: a = b;
671 // CHECK-NEXT: b++;
672 // CHECK-NEXT: }
673 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
674 // CHECK-51-NEXT: {
675 // CHECK-51-NEXT: a = a > b ? b : a;
676 // CHECK-51-NEXT: }
677 // CHECK-51-NEXT: #pragma omp atomic acq_rel compare
678 // CHECK-51-NEXT: {
679 // CHECK-51-NEXT: a = a < b ? b : a;
680 // CHECK-51-NEXT: }
681 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
682 // CHECK-51-NEXT: {
683 // CHECK-51-NEXT: a = a == b ? c : a;
684 // CHECK-51-NEXT: }
685 // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
686 // CHECK-51-NEXT: {
687 // CHECK-51-NEXT: v = a;
688 // CHECK-51-NEXT: if (a > b) {
689 // CHECK-51-NEXT: a = b;
690 // CHECK-51-NEXT: }
691 // CHECK-51-NEXT: }
692 // CHECK-51-NEXT: #pragma omp atomic compare acq_rel capture
693 // CHECK-51-NEXT: {
694 // CHECK-51-NEXT: v = a;
695 // CHECK-51-NEXT: if (a < b) {
696 // CHECK-51-NEXT: a = b;
697 // CHECK-51-NEXT: }
698 // CHECK-51-NEXT: }
699 // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
700 // CHECK-51-NEXT: {
701 // CHECK-51-NEXT: v = a == b;
702 // CHECK-51-NEXT: if (v)
703 // CHECK-51-NEXT: a = c;
704 // CHECK-51-NEXT: }
705 // CHECK-NEXT: #pragma omp atomic
706 // CHECK-NEXT: a++;
707 // CHECK-NEXT: #pragma omp atomic read acquire
708 // CHECK-NEXT: a = argc;
709 // CHECK-NEXT: #pragma omp atomic write
710 // CHECK-NEXT: a = argc + argc;
711 // CHECK-NEXT: #pragma omp atomic update
712 // CHECK-NEXT: a = a + argc;
713 // CHECK-NEXT: #pragma omp atomic acquire capture
714 // CHECK-NEXT: a = b++;
715 // CHECK-NEXT: #pragma omp atomic capture acquire
716 // CHECK-NEXT: {
717 // CHECK-NEXT: a = b;
718 // CHECK-NEXT: b++;
719 // CHECK-NEXT: }
720 // CHECK-51-NEXT: #pragma omp atomic compare acquire
721 // CHECK-51-NEXT: {
722 // CHECK-51-NEXT: a = a > b ? b : a;
723 // CHECK-51-NEXT: }
724 // CHECK-51-NEXT: #pragma omp atomic acquire compare
725 // CHECK-51-NEXT: {
726 // CHECK-51-NEXT: a = a < b ? b : a;
727 // CHECK-51-NEXT: }
728 // CHECK-51-NEXT: #pragma omp atomic compare acquire
729 // CHECK-51-NEXT: {
730 // CHECK-51-NEXT: a = a == b ? c : a;
731 // CHECK-51-NEXT: }
732 // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
733 // CHECK-51-NEXT: {
734 // CHECK-51-NEXT: v = a;
735 // CHECK-51-NEXT: if (a > b) {
736 // CHECK-51-NEXT: a = b;
737 // CHECK-51-NEXT: }
738 // CHECK-51-NEXT: }
739 // CHECK-51-NEXT: #pragma omp atomic compare acquire capture
740 // CHECK-51-NEXT: {
741 // CHECK-51-NEXT: v = a;
742 // CHECK-51-NEXT: if (a < b) {
743 // CHECK-51-NEXT: a = b;
744 // CHECK-51-NEXT: }
745 // CHECK-51-NEXT: }
746 // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
747 // CHECK-51-NEXT: {
748 // CHECK-51-NEXT: v = a == b;
749 // CHECK-51-NEXT: if (v)
750 // CHECK-51-NEXT: a = c;
751 // CHECK-51-NEXT: }
752 // CHECK-NEXT: #pragma omp atomic release
753 // CHECK-NEXT: a++;
754 // CHECK-NEXT: #pragma omp atomic read
755 // CHECK-NEXT: a = argc;
756 // CHECK-NEXT: #pragma omp atomic release write
757 // CHECK-NEXT: a = argc + argc;
758 // CHECK-NEXT: #pragma omp atomic update release
759 // CHECK-NEXT: a = a + argc;
760 // CHECK-NEXT: #pragma omp atomic release capture
761 // CHECK-NEXT: a = b++;
762 // CHECK-NEXT: #pragma omp atomic capture release
763 // CHECK-NEXT: {
764 // CHECK-NEXT: a = b;
765 // CHECK-NEXT: b++;
766 // CHECK-NEXT: }
767 // CHECK-51-NEXT: #pragma omp atomic compare release
768 // CHECK-51-NEXT: {
769 // CHECK-51-NEXT: a = a > b ? b : a;
770 // CHECK-51-NEXT: }
771 // CHECK-51-NEXT: #pragma omp atomic release compare
772 // CHECK-51-NEXT: {
773 // CHECK-51-NEXT: a = a < b ? b : a;
774 // CHECK-51-NEXT: }
775 // CHECK-51-NEXT: #pragma omp atomic compare release
776 // CHECK-51-NEXT: {
777 // CHECK-51-NEXT: a = a == b ? c : a;
778 // CHECK-51-NEXT: }
779 // CHECK-51-NEXT: #pragma omp atomic compare capture release
780 // CHECK-51-NEXT: {
781 // CHECK-51-NEXT: v = a;
782 // CHECK-51-NEXT: if (a > b) {
783 // CHECK-51-NEXT: a = b;
784 // CHECK-51-NEXT: }
785 // CHECK-51-NEXT: }
786 // CHECK-51-NEXT: #pragma omp atomic compare release capture
787 // CHECK-51-NEXT: {
788 // CHECK-51-NEXT: v = a;
789 // CHECK-51-NEXT: if (a < b) {
790 // CHECK-51-NEXT: a = b;
791 // CHECK-51-NEXT: }
792 // CHECK-51-NEXT: }
793 // CHECK-51-NEXT: #pragma omp atomic compare capture release
794 // CHECK-51-NEXT: {
795 // CHECK-51-NEXT: v = a == b;
796 // CHECK-51-NEXT: if (v)
797 // CHECK-51-NEXT: a = c;
798 // CHECK-51-NEXT: }
799 // CHECK-NEXT: #pragma omp atomic relaxed
800 // CHECK-NEXT: a++;
801 // CHECK-NEXT: #pragma omp atomic read
802 // CHECK-NEXT: a = argc;
803 // CHECK-NEXT: #pragma omp atomic relaxed write
804 // CHECK-NEXT: a = argc + argc;
805 // CHECK-NEXT: #pragma omp atomic update relaxed
806 // CHECK-NEXT: a = a + argc;
807 // CHECK-NEXT: #pragma omp atomic relaxed capture
808 // CHECK-NEXT: a = b++;
809 // CHECK-NEXT: #pragma omp atomic capture relaxed
810 // CHECK-NEXT: {
811 // CHECK-NEXT: a = b;
812 // CHECK-NEXT: b++;
813 // CHECK-NEXT: }
814 // CHECK-51-NEXT: #pragma omp atomic compare relaxed
815 // CHECK-51-NEXT: {
816 // CHECK-51-NEXT: a = a > b ? b : a;
817 // CHECK-51-NEXT: }
818 // CHECK-51-NEXT: #pragma omp atomic relaxed compare
819 // CHECK-51-NEXT: {
820 // CHECK-51-NEXT: a = a < b ? b : a;
821 // CHECK-51-NEXT: }
822 // CHECK-51-NEXT: #pragma omp atomic compare relaxed
823 // CHECK-51-NEXT: {
824 // CHECK-51-NEXT: a = a == b ? c : a;
825 // CHECK-51-NEXT: }
826 // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
827 // CHECK-51-NEXT: {
828 // CHECK-51-NEXT: v = a;
829 // CHECK-51-NEXT: if (a > b) {
830 // CHECK-51-NEXT: a = b;
831 // CHECK-51-NEXT: }
832 // CHECK-51-NEXT: }
833 // CHECK-51-NEXT: #pragma omp atomic compare relaxed capture
834 // CHECK-51-NEXT: {
835 // CHECK-51-NEXT: v = a;
836 // CHECK-51-NEXT: if (a < b) {
837 // CHECK-51-NEXT: a = b;
838 // CHECK-51-NEXT: }
839 // CHECK-51-NEXT: }
840 // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
841 // CHECK-51-NEXT: {
842 // CHECK-51-NEXT: v = a == b;
843 // CHECK-51-NEXT: if (v)
844 // CHECK-51-NEXT: a = c;
845 // CHECK-51-NEXT: }
846 // CHECK-NEXT: #pragma omp atomic hint(6)
847 // CHECK-NEXT: a++;
848 // CHECK-NEXT: #pragma omp atomic read hint(6)
849 // CHECK-NEXT: a = argc;
850 // CHECK-NEXT: #pragma omp atomic hint(6) write
851 // CHECK-NEXT: a = argc + argc;
852 // CHECK-NEXT: #pragma omp atomic update hint(6)
853 // CHECK-NEXT: a = a + argc;
854 // CHECK-NEXT: #pragma omp atomic hint(6) capture
855 // CHECK-NEXT: a = b++;
856 // CHECK-NEXT: #pragma omp atomic capture hint(6)
857 // CHECK-NEXT: {
858 // CHECK-NEXT: a = b;
859 // CHECK-NEXT: b++;
860 // CHECK-NEXT: }
861 // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
862 // CHECK-51-NEXT: {
863 // CHECK-51-NEXT: a = a > b ? b : a;
864 // CHECK-51-NEXT: }
865 // CHECK-51-NEXT: #pragma omp atomic hint(6) compare
866 // CHECK-51-NEXT: {
867 // CHECK-51-NEXT: a = a < b ? b : a;
868 // CHECK-51-NEXT: }
869 // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
870 // CHECK-51-NEXT: {
871 // CHECK-51-NEXT: a = a == b ? c : a;
872 // CHECK-51-NEXT: }
873 // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
874 // CHECK-51-NEXT: {
875 // CHECK-51-NEXT: v = a;
876 // CHECK-51-NEXT: if (a > b) {
877 // CHECK-51-NEXT: a = b;
878 // CHECK-51-NEXT: }
879 // CHECK-51-NEXT: }
880 // CHECK-51-NEXT: #pragma omp atomic compare hint(6) capture
881 // CHECK-51-NEXT: {
882 // CHECK-51-NEXT: v = a;
883 // CHECK-51-NEXT: if (a < b) {
884 // CHECK-51-NEXT: a = b;
885 // CHECK-51-NEXT: }
886 // CHECK-51-NEXT: }
887 // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
888 // CHECK-51-NEXT: {
889 // CHECK-51-NEXT: v = a == b;
890 // CHECK-51-NEXT: if (v)
891 // CHECK-51-NEXT: a = c;
892 // CHECK-51-NEXT: }
893 
main(int argc,char ** argv)894 int main(int argc, char **argv) {
895   int v = 0;
896   int c = 0;
897   int b = 0;
898   int a = 0;
899 // CHECK: int a = 0;
900 #pragma omp atomic
901   a++;
902 #pragma omp atomic read
903   a = argc;
904 #pragma omp atomic write
905   a = argc + argc;
906 #pragma omp atomic update
907   a = a + argc;
908 #pragma omp atomic capture
909   a = b++;
910 #pragma omp atomic capture
911   {
912     a = b;
913     b++;
914   }
915 #ifdef OMP51
916 #pragma omp atomic compare
917   { a = a > b ? b : a; }
918 #pragma omp atomic compare
919   { a = a < b ? b : a; }
920 #pragma omp atomic compare
921   { a = a == b ? c : a; }
922 #pragma omp atomic compare capture
923   { v = a; if (a > b) { a = b; } }
924 #pragma omp atomic compare capture
925   { v = a; if (a < b) { a = b; } }
926 #pragma omp atomic compare capture
927   { v = a == b; if (v) a = c; }
928 #endif
929 #pragma omp atomic seq_cst
930   a++;
931 #pragma omp atomic read seq_cst
932   a = argc;
933 #pragma omp atomic seq_cst write
934   a = argc + argc;
935 #pragma omp atomic update seq_cst
936   a = a + argc;
937 #pragma omp atomic seq_cst capture
938   a = b++;
939 #pragma omp atomic capture seq_cst
940   {
941     a = b;
942     b++;
943   }
944 #ifdef OMP51
945 #pragma omp atomic compare seq_cst
946   { a = a > b ? b : a; }
947 #pragma omp atomic seq_cst compare
948   { a = a < b ? b : a; }
949 #pragma omp atomic compare seq_cst
950   { a = a == b ? c : a; }
951 #pragma omp atomic compare capture seq_cst
952   { v = a; if (a > b) { a = b; } }
953 #pragma omp atomic compare seq_cst capture
954   { v = a; if (a < b) { a = b; } }
955 #pragma omp atomic compare capture seq_cst
956   { v = a == b; if (v) a = c; }
957 #endif
958 #pragma omp atomic
959   a++;
960 #pragma omp atomic read
961   a = argc;
962 #pragma omp atomic write
963   a = argc + argc;
964 #pragma omp atomic update
965   a = a + argc;
966 #pragma omp atomic acq_rel capture
967   a = b++;
968 #pragma omp atomic capture acq_rel
969   {
970     a = b;
971     b++;
972   }
973 #ifdef OMP51
974 #pragma omp atomic compare acq_rel
975   { a = a > b ? b : a; }
976 #pragma omp atomic acq_rel compare
977   { a = a < b ? b : a; }
978 #pragma omp atomic compare acq_rel
979   { a = a == b ? c : a; }
980 #pragma omp atomic compare capture acq_rel
981   { v = a; if (a > b) { a = b; } }
982 #pragma omp atomic compare acq_rel capture
983   { v = a; if (a < b) { a = b; } }
984 #pragma omp atomic compare capture acq_rel
985   { v = a == b; if (v) a = c; }
986 #endif
987 #pragma omp atomic
988   a++;
989 #pragma omp atomic read acquire
990   a = argc;
991 #pragma omp atomic write
992   a = argc + argc;
993 #pragma omp atomic update
994   a = a + argc;
995 #pragma omp atomic acquire capture
996   a = b++;
997 #pragma omp atomic capture acquire
998   {
999     a = b;
1000     b++;
1001   }
1002 #ifdef OMP51
1003 #pragma omp atomic compare acquire
1004   { a = a > b ? b : a; }
1005 #pragma omp atomic acquire compare
1006   { a = a < b ? b : a; }
1007 #pragma omp atomic compare acquire
1008   { a = a == b ? c : a; }
1009 #pragma omp atomic compare capture acquire
1010   { v = a; if (a > b) { a = b; } }
1011 #pragma omp atomic compare acquire capture
1012   { v = a; if (a < b) { a = b; } }
1013 #pragma omp atomic compare capture acquire
1014   { v = a == b; if (v) a = c; }
1015 #endif
1016 #pragma omp atomic release
1017   a++;
1018 #pragma omp atomic read
1019   a = argc;
1020 #pragma omp atomic release write
1021   a = argc + argc;
1022 #pragma omp atomic update release
1023   a = a + argc;
1024 #pragma omp atomic release capture
1025   a = b++;
1026 #pragma omp atomic capture release
1027   {
1028     a = b;
1029     b++;
1030   }
1031 #ifdef OMP51
1032 #pragma omp atomic compare release
1033   { a = a > b ? b : a; }
1034 #pragma omp atomic release compare
1035   { a = a < b ? b : a; }
1036 #pragma omp atomic compare release
1037   { a = a == b ? c : a; }
1038 #pragma omp atomic compare capture release
1039   { v = a; if (a > b) { a = b; } }
1040 #pragma omp atomic compare release capture
1041   { v = a; if (a < b) { a = b; } }
1042 #pragma omp atomic compare capture release
1043   { v = a == b; if (v) a = c; }
1044 #endif
1045 #pragma omp atomic relaxed
1046   a++;
1047 #pragma omp atomic read
1048   a = argc;
1049 #pragma omp atomic relaxed write
1050   a = argc + argc;
1051 #pragma omp atomic update relaxed
1052   a = a + argc;
1053 #pragma omp atomic relaxed capture
1054   a = b++;
1055 #pragma omp atomic capture relaxed
1056   {
1057     a = b;
1058     b++;
1059   }
1060 #ifdef OMP51
1061 #pragma omp atomic compare relaxed
1062   { a = a > b ? b : a; }
1063 #pragma omp atomic relaxed compare
1064   { a = a < b ? b : a; }
1065 #pragma omp atomic compare relaxed
1066   { a = a == b ? c : a; }
1067 #pragma omp atomic compare capture relaxed
1068   { v = a; if (a > b) { a = b; } }
1069 #pragma omp atomic compare relaxed capture
1070   { v = a; if (a < b) { a = b; } }
1071 #pragma omp atomic compare capture relaxed
1072   { v = a == b; if (v) a = c; }
1073 #endif
1074 #pragma omp atomic hint(6)
1075   a++;
1076 #pragma omp atomic read hint(6)
1077   a = argc;
1078 #pragma omp atomic hint(6) write
1079   a = argc + argc;
1080 #pragma omp atomic update hint(6)
1081   a = a + argc;
1082 #pragma omp atomic hint(6) capture
1083   a = b++;
1084 #pragma omp atomic capture hint(6)
1085   {
1086     a = b;
1087     b++;
1088   }
1089 #ifdef OMP51
1090 #pragma omp atomic compare hint(6)
1091   { a = a > b ? b : a; }
1092 #pragma omp atomic hint(6) compare
1093   { a = a < b ? b : a; }
1094 #pragma omp atomic compare hint(6)
1095   { a = a == b ? c : a; }
1096 #pragma omp atomic compare capture hint(6)
1097   { v = a; if (a > b) { a = b; } }
1098 #pragma omp atomic compare hint(6) capture
1099   { v = a; if (a < b) { a = b; } }
1100 #pragma omp atomic compare capture hint(6)
1101   { v = a == b; if (v) a = c; }
1102 #endif
1103   // CHECK-NEXT: #pragma omp atomic
1104   // CHECK-NEXT: a++;
1105   // CHECK-NEXT: #pragma omp atomic read
1106   // CHECK-NEXT: a = argc;
1107   // CHECK-NEXT: #pragma omp atomic write
1108   // CHECK-NEXT: a = argc + argc;
1109   // CHECK-NEXT: #pragma omp atomic update
1110   // CHECK-NEXT: a = a + argc;
1111   // CHECK-NEXT: #pragma omp atomic capture
1112   // CHECK-NEXT: a = b++;
1113   // CHECK-NEXT: #pragma omp atomic capture
1114   // CHECK-NEXT: {
1115   // CHECK-NEXT: a = b;
1116   // CHECK-NEXT: b++;
1117   // CHECK-NEXT: }
1118   // CHECK-51-NEXT: #pragma omp atomic compare
1119   // CHECK-51-NEXT: {
1120   // CHECK-51-NEXT: a = a > b ? b : a;
1121   // CHECK-51-NEXT: }
1122   // CHECK-51-NEXT: #pragma omp atomic compare
1123   // CHECK-51-NEXT: {
1124   // CHECK-51-NEXT: a = a < b ? b : a;
1125   // CHECK-51-NEXT: }
1126   // CHECK-51-NEXT: #pragma omp atomic compare
1127   // CHECK-51-NEXT: {
1128   // CHECK-51-NEXT: a = a == b ? c : a;
1129   // CHECK-51-NEXT: }
1130   // CHECK-51-NEXT: #pragma omp atomic compare capture
1131   // CHECK-51-NEXT: {
1132   // CHECK-51-NEXT: v = a;
1133   // CHECK-51-NEXT: if (a > b) {
1134   // CHECK-51-NEXT: a = b;
1135   // CHECK-51-NEXT: }
1136   // CHECK-51-NEXT: }
1137   // CHECK-51-NEXT: #pragma omp atomic compare capture
1138   // CHECK-51-NEXT: {
1139   // CHECK-51-NEXT: v = a;
1140   // CHECK-51-NEXT: if (a < b) {
1141   // CHECK-51-NEXT: a = b;
1142   // CHECK-51-NEXT: }
1143   // CHECK-51-NEXT: }
1144   // CHECK-51-NEXT: #pragma omp atomic compare capture
1145   // CHECK-51-NEXT: {
1146   // CHECK-51-NEXT: v = a == b;
1147   // CHECK-51-NEXT: if (v)
1148   // CHECK-51-NEXT: a = c;
1149   // CHECK-51-NEXT: }
1150   // CHECK-NEXT: #pragma omp atomic seq_cst
1151   // CHECK-NEXT: a++;
1152   // CHECK-NEXT: #pragma omp atomic read seq_cst
1153   // CHECK-NEXT: a = argc;
1154   // CHECK-NEXT: #pragma omp atomic seq_cst write
1155   // CHECK-NEXT: a = argc + argc;
1156   // CHECK-NEXT: #pragma omp atomic update seq_cst
1157   // CHECK-NEXT: a = a + argc;
1158   // CHECK-NEXT: #pragma omp atomic seq_cst capture
1159   // CHECK-NEXT: a = b++;
1160   // CHECK-NEXT: #pragma omp atomic capture seq_cst
1161   // CHECK-NEXT: {
1162   // CHECK-NEXT: a = b;
1163   // CHECK-NEXT: b++;
1164   // CHECK-NEXT: }
1165   // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
1166   // CHECK-51-NEXT: {
1167   // CHECK-51-NEXT: a = a > b ? b : a;
1168   // CHECK-51-NEXT: }
1169   // CHECK-51-NEXT: #pragma omp atomic seq_cst compare
1170   // CHECK-51-NEXT: {
1171   // CHECK-51-NEXT: a = a < b ? b : a;
1172   // CHECK-51-NEXT: }
1173   // CHECK-51-NEXT: #pragma omp atomic compare seq_cst
1174   // CHECK-51-NEXT: {
1175   // CHECK-51-NEXT: a = a == b ? c : a;
1176   // CHECK-51-NEXT: }
1177   // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
1178   // CHECK-51-NEXT: {
1179   // CHECK-51-NEXT: v = a;
1180   // CHECK-51-NEXT: if (a > b) {
1181   // CHECK-51-NEXT: a = b;
1182   // CHECK-51-NEXT: }
1183   // CHECK-51-NEXT: }
1184   // CHECK-51-NEXT: #pragma omp atomic compare seq_cst capture
1185   // CHECK-51-NEXT: {
1186   // CHECK-51-NEXT: v = a;
1187   // CHECK-51-NEXT: if (a < b) {
1188   // CHECK-51-NEXT: a = b;
1189   // CHECK-51-NEXT: }
1190   // CHECK-51-NEXT: }
1191   // CHECK-51-NEXT: #pragma omp atomic compare capture seq_cst
1192   // CHECK-51-NEXT: {
1193   // CHECK-51-NEXT: v = a == b;
1194   // CHECK-51-NEXT: if (v)
1195   // CHECK-51-NEXT: a = c;
1196   // CHECK-51-NEXT: }
1197   // CHECK-NEXT: #pragma omp atomic
1198   // CHECK-NEXT: a++;
1199   // CHECK-NEXT: #pragma omp atomic read
1200   // CHECK-NEXT: a = argc;
1201   // CHECK-NEXT: #pragma omp atomic write
1202   // CHECK-NEXT: a = argc + argc;
1203   // CHECK-NEXT: #pragma omp atomic update
1204   // CHECK-NEXT: a = a + argc;
1205   // CHECK-NEXT: #pragma omp atomic acq_rel capture
1206   // CHECK-NEXT: a = b++;
1207   // CHECK-NEXT: #pragma omp atomic capture acq_rel
1208   // CHECK-NEXT: {
1209   // CHECK-NEXT: a = b;
1210   // CHECK-NEXT: b++;
1211   // CHECK-NEXT: }
1212   // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
1213   // CHECK-51-NEXT: {
1214   // CHECK-51-NEXT: a = a > b ? b : a;
1215   // CHECK-51-NEXT: }
1216   // CHECK-51-NEXT: #pragma omp atomic acq_rel compare
1217   // CHECK-51-NEXT: {
1218   // CHECK-51-NEXT: a = a < b ? b : a;
1219   // CHECK-51-NEXT: }
1220   // CHECK-51-NEXT: #pragma omp atomic compare acq_rel
1221   // CHECK-51-NEXT: {
1222   // CHECK-51-NEXT: a = a == b ? c : a;
1223   // CHECK-51-NEXT: }
1224   // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
1225   // CHECK-51-NEXT: {
1226   // CHECK-51-NEXT: v = a;
1227   // CHECK-51-NEXT: if (a > b) {
1228   // CHECK-51-NEXT: a = b;
1229   // CHECK-51-NEXT: }
1230   // CHECK-51-NEXT: }
1231   // CHECK-51-NEXT: #pragma omp atomic compare acq_rel capture
1232   // CHECK-51-NEXT: {
1233   // CHECK-51-NEXT: v = a;
1234   // CHECK-51-NEXT: if (a < b) {
1235   // CHECK-51-NEXT: a = b;
1236   // CHECK-51-NEXT: }
1237   // CHECK-51-NEXT: }
1238   // CHECK-51-NEXT: #pragma omp atomic compare capture acq_rel
1239   // CHECK-51-NEXT: {
1240   // CHECK-51-NEXT: v = a == b;
1241   // CHECK-51-NEXT: if (v)
1242   // CHECK-51-NEXT: a = c;
1243   // CHECK-51-NEXT: }
1244   // CHECK-NEXT: #pragma omp atomic
1245   // CHECK-NEXT: a++;
1246   // CHECK-NEXT: #pragma omp atomic read acquire
1247   // CHECK-NEXT: a = argc;
1248   // CHECK-NEXT: #pragma omp atomic write
1249   // CHECK-NEXT: a = argc + argc;
1250   // CHECK-NEXT: #pragma omp atomic update
1251   // CHECK-NEXT: a = a + argc;
1252   // CHECK-NEXT: #pragma omp atomic acquire capture
1253   // CHECK-NEXT: a = b++;
1254   // CHECK-NEXT: #pragma omp atomic capture acquire
1255   // CHECK-NEXT: {
1256   // CHECK-NEXT: a = b;
1257   // CHECK-NEXT: b++;
1258   // CHECK-NEXT: }
1259   // CHECK-51-NEXT: #pragma omp atomic compare acquire
1260   // CHECK-51-NEXT: {
1261   // CHECK-51-NEXT: a = a > b ? b : a;
1262   // CHECK-51-NEXT: }
1263   // CHECK-51-NEXT: #pragma omp atomic acquire compare
1264   // CHECK-51-NEXT: {
1265   // CHECK-51-NEXT: a = a < b ? b : a;
1266   // CHECK-51-NEXT: }
1267   // CHECK-51-NEXT: #pragma omp atomic compare acquire
1268   // CHECK-51-NEXT: {
1269   // CHECK-51-NEXT: a = a == b ? c : a;
1270   // CHECK-51-NEXT: }
1271   // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
1272   // CHECK-51-NEXT: {
1273   // CHECK-51-NEXT: v = a;
1274   // CHECK-51-NEXT: if (a > b) {
1275   // CHECK-51-NEXT: a = b;
1276   // CHECK-51-NEXT: }
1277   // CHECK-51-NEXT: }
1278   // CHECK-51-NEXT: #pragma omp atomic compare acquire capture
1279   // CHECK-51-NEXT: {
1280   // CHECK-51-NEXT: v = a;
1281   // CHECK-51-NEXT: if (a < b) {
1282   // CHECK-51-NEXT: a = b;
1283   // CHECK-51-NEXT: }
1284   // CHECK-51-NEXT: }
1285   // CHECK-51-NEXT: #pragma omp atomic compare capture acquire
1286   // CHECK-51-NEXT: {
1287   // CHECK-51-NEXT: v = a == b;
1288   // CHECK-51-NEXT: if (v)
1289   // CHECK-51-NEXT: a = c;
1290   // CHECK-51-NEXT: }
1291   // CHECK-NEXT: #pragma omp atomic release
1292   // CHECK-NEXT: a++;
1293   // CHECK-NEXT: #pragma omp atomic read
1294   // CHECK-NEXT: a = argc;
1295   // CHECK-NEXT: #pragma omp atomic release write
1296   // CHECK-NEXT: a = argc + argc;
1297   // CHECK-NEXT: #pragma omp atomic update release
1298   // CHECK-NEXT: a = a + argc;
1299   // CHECK-NEXT: #pragma omp atomic release capture
1300   // CHECK-NEXT: a = b++;
1301   // CHECK-NEXT: #pragma omp atomic capture release
1302   // CHECK-NEXT: {
1303   // CHECK-NEXT: a = b;
1304   // CHECK-NEXT: b++;
1305   // CHECK-NEXT: }
1306   // CHECK-51-NEXT: #pragma omp atomic compare release
1307   // CHECK-51-NEXT: {
1308   // CHECK-51-NEXT: a = a > b ? b : a;
1309   // CHECK-51-NEXT: }
1310   // CHECK-51-NEXT: #pragma omp atomic release compare
1311   // CHECK-51-NEXT: {
1312   // CHECK-51-NEXT: a = a < b ? b : a;
1313   // CHECK-51-NEXT: }
1314   // CHECK-51-NEXT: #pragma omp atomic compare release
1315   // CHECK-51-NEXT: {
1316   // CHECK-51-NEXT: a = a == b ? c : a;
1317   // CHECK-51-NEXT: }
1318   // CHECK-51-NEXT: #pragma omp atomic compare capture release
1319   // CHECK-51-NEXT: {
1320   // CHECK-51-NEXT: v = a;
1321   // CHECK-51-NEXT: if (a > b) {
1322   // CHECK-51-NEXT: a = b;
1323   // CHECK-51-NEXT: }
1324   // CHECK-51-NEXT: }
1325   // CHECK-51-NEXT: #pragma omp atomic compare release capture
1326   // CHECK-51-NEXT: {
1327   // CHECK-51-NEXT: v = a;
1328   // CHECK-51-NEXT: if (a < b) {
1329   // CHECK-51-NEXT: a = b;
1330   // CHECK-51-NEXT: }
1331   // CHECK-51-NEXT: }
1332   // CHECK-51-NEXT: #pragma omp atomic compare capture release
1333   // CHECK-51-NEXT: {
1334   // CHECK-51-NEXT: v = a == b;
1335   // CHECK-51-NEXT: if (v)
1336   // CHECK-51-NEXT: a = c;
1337   // CHECK-51-NEXT: }
1338   // CHECK-NEXT: #pragma omp atomic relaxed
1339   // CHECK-NEXT: a++;
1340   // CHECK-NEXT: #pragma omp atomic read
1341   // CHECK-NEXT: a = argc;
1342   // CHECK-NEXT: #pragma omp atomic relaxed write
1343   // CHECK-NEXT: a = argc + argc;
1344   // CHECK-NEXT: #pragma omp atomic update relaxed
1345   // CHECK-NEXT: a = a + argc;
1346   // CHECK-NEXT: #pragma omp atomic relaxed capture
1347   // CHECK-NEXT: a = b++;
1348   // CHECK-NEXT: #pragma omp atomic capture relaxed
1349   // CHECK-NEXT: {
1350   // CHECK-NEXT: a = b;
1351   // CHECK-NEXT: b++;
1352   // CHECK-NEXT: }
1353   // CHECK-51-NEXT: #pragma omp atomic compare relaxed
1354   // CHECK-51-NEXT: {
1355   // CHECK-51-NEXT: a = a > b ? b : a;
1356   // CHECK-51-NEXT: }
1357   // CHECK-51-NEXT: #pragma omp atomic relaxed compare
1358   // CHECK-51-NEXT: {
1359   // CHECK-51-NEXT: a = a < b ? b : a;
1360   // CHECK-51-NEXT: }
1361   // CHECK-51-NEXT: #pragma omp atomic compare relaxed
1362   // CHECK-51-NEXT: {
1363   // CHECK-51-NEXT: a = a == b ? c : a;
1364   // CHECK-51-NEXT: }
1365   // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
1366   // CHECK-51-NEXT: {
1367   // CHECK-51-NEXT: v = a;
1368   // CHECK-51-NEXT: if (a > b) {
1369   // CHECK-51-NEXT: a = b;
1370   // CHECK-51-NEXT: }
1371   // CHECK-51-NEXT: }
1372   // CHECK-51-NEXT: #pragma omp atomic compare relaxed capture
1373   // CHECK-51-NEXT: {
1374   // CHECK-51-NEXT: v = a;
1375   // CHECK-51-NEXT: if (a < b) {
1376   // CHECK-51-NEXT: a = b;
1377   // CHECK-51-NEXT: }
1378   // CHECK-51-NEXT: }
1379   // CHECK-51-NEXT: #pragma omp atomic compare capture relaxed
1380   // CHECK-51-NEXT: {
1381   // CHECK-51-NEXT: v = a == b;
1382   // CHECK-51-NEXT: if (v)
1383   // CHECK-51-NEXT: a = c;
1384   // CHECK-51-NEXT: }
1385   // CHECK-NEXT: #pragma omp atomic hint(6)
1386   // CHECK-NEXT: a++;
1387   // CHECK-NEXT: #pragma omp atomic read hint(6)
1388   // CHECK-NEXT: a = argc;
1389   // CHECK-NEXT: #pragma omp atomic hint(6) write
1390   // CHECK-NEXT: a = argc + argc;
1391   // CHECK-NEXT: #pragma omp atomic update hint(6)
1392   // CHECK-NEXT: a = a + argc;
1393   // CHECK-NEXT: #pragma omp atomic hint(6) capture
1394   // CHECK-NEXT: a = b++;
1395   // CHECK-NEXT: #pragma omp atomic capture hint(6)
1396   // CHECK-NEXT: {
1397   // CHECK-NEXT: a = b;
1398   // CHECK-NEXT: b++;
1399   // CHECK-NEXT: }
1400   // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
1401   // CHECK-51-NEXT: {
1402   // CHECK-51-NEXT: a = a > b ? b : a;
1403   // CHECK-51-NEXT: }
1404   // CHECK-51-NEXT: #pragma omp atomic hint(6) compare
1405   // CHECK-51-NEXT: {
1406   // CHECK-51-NEXT: a = a < b ? b : a;
1407   // CHECK-51-NEXT: }
1408   // CHECK-51-NEXT: #pragma omp atomic compare hint(6)
1409   // CHECK-51-NEXT: {
1410   // CHECK-51-NEXT: a = a == b ? c : a;
1411   // CHECK-51-NEXT: }
1412   // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
1413   // CHECK-51-NEXT: {
1414   // CHECK-51-NEXT: v = a;
1415   // CHECK-51-NEXT: if (a > b) {
1416   // CHECK-51-NEXT: a = b;
1417   // CHECK-51-NEXT: }
1418   // CHECK-51-NEXT: }
1419   // CHECK-51-NEXT: #pragma omp atomic compare hint(6) capture
1420   // CHECK-51-NEXT: {
1421   // CHECK-51-NEXT: v = a;
1422   // CHECK-51-NEXT: if (a < b) {
1423   // CHECK-51-NEXT: a = b;
1424   // CHECK-51-NEXT: }
1425   // CHECK-51-NEXT: }
1426   // CHECK-51-NEXT: #pragma omp atomic compare capture hint(6)
1427   // CHECK-51-NEXT: {
1428   // CHECK-51-NEXT: v = a == b;
1429   // CHECK-51-NEXT: if (v)
1430   // CHECK-51-NEXT: a = c;
1431   // CHECK-51-NEXT: }
1432   // expect-note@+1 {{in instantiation of function template specialization 'foo<int>' requested here}}
1433   return foo(a);
1434 }
1435 
1436 #endif
1437