/* { dg-do compile } */ /* { dg-additional-options "-O2 -fdump-tree-ompexp" } */ /* { dg-additional-options "-march=pentium" { target ia32 } } */ /* { dg-final { scan-tree-dump-times "\.ATOMIC_COMPARE_EXCHANGE \\\(\[^\n\r]*, 8, 5, 5\\\);" 1 "ompexp" { target sync_long_long } } } */ /* { dg-final { scan-tree-dump-times "\.ATOMIC_COMPARE_EXCHANGE \\\(\[^\n\r]*, 8, 4, 2\\\);" 1 "ompexp" { target sync_long_long } } } */ /* { dg-final { scan-tree-dump-times "\.ATOMIC_COMPARE_EXCHANGE \\\(\[^\n\r]*, 264, 5, 0\\\);" 1 "ompexp" { target sync_long_long } } } */ /* { dg-final { scan-tree-dump-times "\.ATOMIC_COMPARE_EXCHANGE \\\(\[^\n\r]*, 8, 0, 0\\\);" 1 "ompexp" { target sync_long_long } } } */ /* { dg-final { scan-tree-dump-not "__atomic_load_8 \\\(" "ompexp" { target sync_long_long } } } */ double x; void foo (double y, double z) { #pragma omp atomic compare seq_cst x = x == y ? z : x; } double bar (double y, double z) { int r; #pragma omp atomic compare capture acq_rel fail (acquire) { r = x == y; if (r) { x = z; } } return r; } double baz (double y, double z) { double v; #pragma omp atomic compare capture seq_cst fail (relaxed) weak if (x == y) { x = z; } else { v = x; } return v; } double qux (double y, double z) { double v; #pragma omp atomic compare capture v = x = x == y ? z : x; return v; }