diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2023-12-11 15:19:02 +0100 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2023-12-11 15:19:02 +0100 |
commit | 055f08feee3424a29403047a7049af467f2b26cd (patch) | |
tree | 417064b8af148bf8f49dd344cfe78a5829e17028 /gcc/testsuite/c-c++-common/gomp | |
parent | 2505a8b41d3b74a545755a278f3750a29c1340b6 (diff) | |
download | gcc-055f08feee3424a29403047a7049af467f2b26cd.zip gcc-055f08feee3424a29403047a7049af467f2b26cd.tar.gz gcc-055f08feee3424a29403047a7049af467f2b26cd.tar.bz2 |
OpenMP: Support acquires/release in 'omp require atomic_default_mem_order'
This is an OpenMP 5.2 feature.
gcc/c/ChangeLog:
* c-parser.cc (c_parser_omp_requires): Handle acquires/release
in atomic_default_mem_order clause.
(c_parser_omp_atomic): Update.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_omp_requires): Handle acquires/release
in atomic_default_mem_order clause.
(cp_parser_omp_atomic): Update.
gcc/fortran/ChangeLog:
* gfortran.h (enum gfc_omp_requires_kind): Add
OMP_REQ_ATOMIC_MEM_ORDER_ACQUIRE and OMP_REQ_ATOMIC_MEM_ORDER_RELEASE.
(gfc_namespace): Add a 7th bit to omp_requires.
* module.cc (enum ab_attribute): Add AB_OMP_REQ_MEM_ORDER_ACQUIRE
and AB_OMP_REQ_MEM_ORDER_RELEASE
(mio_symbol_attribute): Handle it.
* openmp.cc (gfc_omp_requires_add_clause): Update for acquire/release.
(gfc_match_omp_requires): Likewise.
(gfc_match_omp_atomic): Handle them for atomic_default_mem_order.
* parse.cc: Likewise.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/requires-3.c: Update for now valid code.
* gfortran.dg/gomp/requires-3.f90: Likewise.
* gfortran.dg/gomp/requires-2.f90: Update dg-error.
* gfortran.dg/gomp/requires-5.f90: Likewise.
* c-c++-common/gomp/requires-5.c: New test.
* c-c++-common/gomp/requires-6.c: New test.
* c-c++-common/gomp/requires-7.c: New test.
* c-c++-common/gomp/requires-8.c: New test.
* gfortran.dg/gomp/requires-10.f90: New test.
* gfortran.dg/gomp/requires-11.f90: New test.
Diffstat (limited to 'gcc/testsuite/c-c++-common/gomp')
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/requires-3.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/requires-5.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/requires-6.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/requires-7.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/requires-8.c | 14 |
5 files changed, 75 insertions, 4 deletions
diff --git a/gcc/testsuite/c-c++-common/gomp/requires-3.c b/gcc/testsuite/c-c++-common/gomp/requires-3.c index bd2479b..2fd601a 100644 --- a/gcc/testsuite/c-c++-common/gomp/requires-3.c +++ b/gcc/testsuite/c-c++-common/gomp/requires-3.c @@ -1,6 +1,6 @@ -#pragma omp requires atomic_default_mem_order(acquire) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ -#pragma omp requires atomic_default_mem_order(release) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ -#pragma omp requires atomic_default_mem_order(foobar) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ -#pragma omp requires atomic_default_mem_order ( /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ +#pragma omp requires atomic_default_mem_order(foobar) /* { dg-error "expected 'acq_rel', 'acquire', 'relaxed', 'release' or 'seq_cst'" } */ +#pragma omp requires atomic_default_mem_order ( /* { dg-error "expected 'acq_rel', 'acquire', 'relaxed', 'release' or 'seq_cst'" } */ /* { dg-error "expected '\\\)' before end of line" "" { target *-*-* } .-1 } */ #pragma omp requires atomic_default_mem_order(seq_cst), /* { dg-error "expected end of line before ',' token" } */ +/* Valid since since 5.2, but ... */ +#pragma omp requires atomic_default_mem_order(acquire) /* { dg-error "more than one 'atomic_default_mem_order' clause in a single compilation unit" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/requires-5.c b/gcc/testsuite/c-c++-common/gomp/requires-5.c new file mode 100644 index 0000000..53e0b75 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/requires-5.c @@ -0,0 +1,23 @@ +/* { dg-additional-options "-fdump-tree-original" } */ + +#pragma omp requires atomic_default_mem_order(release) + +int +foo (int x, int y) +{ + int z; + + #pragma omp atomic write + x = y; + + #pragma omp atomic update + x += 1; + + #pragma omp atomic read acquire + z = x; + return z; +} + +/* { dg-final { scan-tree-dump "#pragma omp atomic release" "original" } } */ +/* { dg-final { scan-tree-dump "#pragma omp atomic release" "original" } } */ +/* { dg-final { scan-tree-dump "z = #pragma omp atomic read acquire" "original" } } */ diff --git a/gcc/testsuite/c-c++-common/gomp/requires-6.c b/gcc/testsuite/c-c++-common/gomp/requires-6.c new file mode 100644 index 0000000..4470c8cae --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/requires-6.c @@ -0,0 +1,23 @@ +/* { dg-additional-options "-fdump-tree-original" } */ + +#pragma omp requires atomic_default_mem_order(acquire) + +int +bar (int a, int b) +{ + int c; + + #pragma omp atomic write release + a = b; + + #pragma omp atomic update + a += 1; + + #pragma omp atomic read + c = a; + return c; +} + +/* { dg-final { scan-tree-dump "#pragma omp atomic release" "original" } } */ +/* { dg-final { scan-tree-dump "#pragma omp atomic acquire" "original" } } */ +/* { dg-final { scan-tree-dump "c = #pragma omp atomic read acquire" "original" } } */ diff --git a/gcc/testsuite/c-c++-common/gomp/requires-7.c b/gcc/testsuite/c-c++-common/gomp/requires-7.c new file mode 100644 index 0000000..4735ef2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/requires-7.c @@ -0,0 +1,11 @@ +#pragma omp requires atomic_default_mem_order(release) + +int +foo (int x) +{ + int z; + + #pragma omp atomic read /* { dg-error "'#pragma omp atomic read' incompatible with 'release' clause implicitly provided by a 'requires' directive" } */ + z = x; + return z; +} diff --git a/gcc/testsuite/c-c++-common/gomp/requires-8.c b/gcc/testsuite/c-c++-common/gomp/requires-8.c new file mode 100644 index 0000000..4d56e7d --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/requires-8.c @@ -0,0 +1,14 @@ +#pragma omp requires atomic_default_mem_order(acquire) + +int +bar (int a, int b) +{ + int c; + + #pragma omp atomic write /* { dg-error "'#pragma omp atomic write' incompatible with 'acquire' clause implicitly provided by a 'requires' directive" } */ + a = b; + + #pragma omp atomic read + c = a; + return c; +} |