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