diff options
author | Sandra Loosemore <sloosemore@baylibre.com> | 2024-09-06 20:58:13 +0000 |
---|---|---|
committer | Sandra Loosemore <sloosemore@baylibre.com> | 2024-09-24 15:04:08 +0000 |
commit | 96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4 (patch) | |
tree | d41609ae565965c5a885121ac658efd8fb0fca49 /gcc | |
parent | 2114243c23ec5168cd54633cd4995ab123d92573 (diff) | |
download | gcc-96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4.zip gcc-96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4.tar.gz gcc-96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4.tar.bz2 |
OpenMP: Check additional restrictions on context selector properties
TR13 (pre-6.0) of the OpenMP spec says:
"Each trait-property may only be specified once in a trait selector
other than those in the construct selector set."
and
"If trait-property any is specified in the kind trait-selector of the
device selector set or the target_device selector sets, no other
trait-property may be specified in the same selector set."
These restrictions (with slightly different wording) date back to
OpenMP 5.1, but were not in 5.0 which was the basis for GCC's
implementation.
This patch adds a diagnostic, adds new testcases, and fixes some older
testcases that include now-invalid selectors.
gcc/ChangeLog
* omp-general.cc (omp_check_context_selector): Reject other
properties in the same selector set with kind(any). Also reject
duplicate name-list properties.
gcc/testsuite/ChangeLog
* c-c++-common/gomp/declare-variant-10.c: Fix broken tests.
* c-c++-common/gomp/declare-variant-3.c: Likewise.
* c-c++-common/gomp/declare-variant-9.c: Likewise.
* c-c++-common/gomp/declare-variant-any.c: New.
* c-c++-common/gomp/declare-variant-duplicates.c: New.
* gfortran.dg/gomp/declare-variant-10.f90: Fix broken tests.
* gfortran.dg/gomp/declare-variant-3.f90: Likewise.
* gfortran.dg/gomp/declare-variant-9.f90: Likewise.
* gfortran.dg/gomp/declare-variant-any.f90: New.
* gfortran.dg/gomp/declare-variant-duplicates.f90: New.
Diffstat (limited to 'gcc')
11 files changed, 176 insertions, 24 deletions
diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc index c93bf12..9713e68 100644 --- a/gcc/omp-general.cc +++ b/gcc/omp-general.cc @@ -1293,6 +1293,8 @@ omp_check_context_selector (location_t loc, tree ctx) for (tree tss = ctx; tss; tss = TREE_CHAIN (tss)) { enum omp_tss_code tss_code = OMP_TSS_CODE (tss); + bool saw_any_prop = false; + bool saw_other_prop = false; /* We can parse this, but not handle it yet. */ if (tss_code == OMP_TRAIT_SET_TARGET_DEVICE) @@ -1329,9 +1331,61 @@ omp_check_context_selector (location_t loc, tree ctx) else ts_seen[ts_code] = true; + /* If trait-property "any" is specified in the "kind" + trait-selector of the "device" selector set or the + "target_device" selector sets, no other trait-property + may be specified in the same selector set. */ + if (ts_code == OMP_TRAIT_DEVICE_KIND) + for (tree p = OMP_TS_PROPERTIES (ts); p; p = TREE_CHAIN (p)) + { + const char *prop = omp_context_name_list_prop (p); + if (!prop) + continue; + else if (strcmp (prop, "any") == 0) + saw_any_prop = true; + else + saw_other_prop = true; + } + /* It seems slightly suspicious that the spec's language covers + the device_num selector too, but + target_device={device_num(whatever),kind(any)} + is probably not terribly useful anyway. */ + else if (ts_code == OMP_TRAIT_DEVICE_ARCH + || ts_code == OMP_TRAIT_DEVICE_ISA + || ts_code == OMP_TRAIT_DEVICE_NUM) + saw_other_prop = true; + + /* Each trait-property can only be specified once in a trait-selector + other than the construct selector set. FIXME: only handles + name-list properties, not clause-list properties, since the + "requires" selector is not implemented yet (PR 113067). */ + if (tss_code != OMP_TRAIT_SET_CONSTRUCT) + for (tree p1 = OMP_TS_PROPERTIES (ts); p1; p1 = TREE_CHAIN (p1)) + { + if (OMP_TP_NAME (p1) != OMP_TP_NAMELIST_NODE) + break; + const char *n1 = omp_context_name_list_prop (p1); + if (!n1) + continue; + for (tree p2 = TREE_CHAIN (p1); p2; p2 = TREE_CHAIN (p2)) + { + const char *n2 = omp_context_name_list_prop (p2); + if (!n2) + continue; + if (!strcmp (n1, n2)) + { + error_at (loc, + "trait-property %qs specified more " + "than once in %qs selector", + n1, OMP_TS_NAME (ts)); + return error_mark_node; + } + } + } + + /* Check for unknown properties. */ if (omp_ts_map[ts_code].valid_properties == NULL) continue; - for (tree p = OMP_TS_PROPERTIES (ts); p; p = TREE_CHAIN (p)) for (unsigned j = 0; ; j++) { @@ -1381,6 +1435,14 @@ omp_check_context_selector (location_t loc, tree ctx) break; } } + + if (saw_any_prop && saw_other_prop) + { + error_at (loc, + "no other trait-property may be specified " + "in the same selector set with %<kind(\"any\")%>"); + return error_mark_node; + } } return ctx; } diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c index 2b8a394..e776934 100644 --- a/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c @@ -7,7 +7,7 @@ void f01 (void); #pragma omp declare variant (f01) match (device={isa(avx512f,avx512bw)}) void f02 (void); void f03 (void); -#pragma omp declare variant (f03) match (device={kind("any"),arch(x86_64),isa(avx512f,avx512bw)}) +#pragma omp declare variant (f03) match (device={arch(x86_64),isa(avx512f,avx512bw)}) void f04 (void); void f05 (void); #pragma omp declare variant (f05) match (device={kind(gpu)}) @@ -28,7 +28,7 @@ void f15 (void); #pragma omp declare variant (f15) match (device={isa(sse4,ssse3),arch(i386)}) void f16 (void); void f17 (void); -#pragma omp declare variant (f17) match (device={kind(any,fpga)}) +#pragma omp declare variant (f17) match (device={kind(fpga)}) void f18 (void); #pragma omp declare target diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c index f5d7797..0d772d7 100644 --- a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c @@ -29,13 +29,13 @@ void f17 (void); void f18 (void); #pragma omp declare variant (f13) match (device={kind(fpga)}) void f19 (void); -#pragma omp declare variant (f13) match (device={kind(any,any)}) +#pragma omp declare variant (f13) match (device={kind(any)}) void f20 (void); #pragma omp declare variant (f13) match (device={kind(host,nohost)}) void f21 (void); #pragma omp declare variant (f13) match (device={kind("cpu","gpu","fpga")}) void f22 (void); -#pragma omp declare variant (f13) match (device={kind(any,cpu,nohost)}) +#pragma omp declare variant (f13) match (device={kind(cpu,nohost)}) void f23 (void); #pragma omp declare variant (f13) match (device={isa(avx)}) void f24 (void); @@ -139,12 +139,8 @@ void f72 (void); void f73 (void); #pragma omp declare variant (f13) match (user={condition(score(25):1)}) void f74 (void); -#pragma omp declare variant (f13) match (device={kind(any,"any")}) +#pragma omp declare variant (f13) match (device={kind("any")}) void f75 (void); -#pragma omp declare variant (f13) match (device={kind("any","any")}) -void f76 (void); -#pragma omp declare variant (f13) match (device={kind("any",any)}) -void f77 (void); #pragma omp declare variant (f13) match (implementation={vendor(nvidia)}) void f78 (void); #pragma omp declare variant (f13) match (user={condition(score(0):0)}) diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c index 5ee7589..da96c81 100644 --- a/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c @@ -7,7 +7,7 @@ void f01 (void); #pragma omp declare variant (f01) match (device={isa("avx512f",avx512bw)}) void f02 (void); void f03 (void); -#pragma omp declare variant (f03) match (device={kind(any),arch(x86_64),isa("avx512f","avx512bw")}) +#pragma omp declare variant (f03) match (device={arch(x86_64),isa("avx512f","avx512bw")}) void f04 (void); void f05 (void); #pragma omp declare variant (f05) match (device={kind(gpu)}) @@ -28,7 +28,7 @@ void f15 (void); #pragma omp declare variant (f15) match (device={isa(sse4,ssse3),arch(i386)}) void f16 (void); void f17 (void); -#pragma omp declare variant (f17) match (device={kind("any","fpga")}) +#pragma omp declare variant (f17) match (device={kind("fpga")}) void f18 (void); void diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c new file mode 100644 index 0000000..cddf73b --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c @@ -0,0 +1,17 @@ +/* Check that errors are detected if other trait-properties are given with + kind(any). */ + +extern int f1 (int); +extern int f2 (int); +extern int f3 (int); +extern int f4 (int); +extern int f5 (int); +extern int f6 (int); + +#pragma omp declare variant (f1) match (device={kind(any,gpu)}) /* { dg-error "no other trait-property may be specified" } */ +#pragma omp declare variant (f2) match (device={kind(cpu,"any")}) /* { dg-error "no other trait-property may be specified" } */ +#pragma omp declare variant (f3) match (device={kind("any"),arch(x86_64)}) /* { dg-error "no other trait-property may be specified" } */ +#pragma omp declare variant (f4) match (device={arch(x86_64),kind(any)}) /* { dg-error "no other trait-property may be specified" } */ +#pragma omp declare variant (f5) match (device={kind(any,"any")}) /* { dg-error "trait-property .any. specified more than once" } */ +#pragma omp declare variant (f6) match (device={kind("any",any)}) /* { dg-error "trait-property .any. specified more than once" } */ +int f (int); diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c new file mode 100644 index 0000000..47d34fc --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c @@ -0,0 +1,13 @@ +/* Check that errors are detected if duplicates appear in name-list + properties. */ + +extern int f1 (int); +extern int f2 (int); +extern int f3 (int); +extern int f4 (int); + +#pragma omp declare variant (f1) match (device={kind(cpu,gpu,"cpu")}) /* { dg-error "trait-property .cpu. specified more than once" } */ +#pragma omp declare variant (f2) match (device={isa(sse4,"avx",avx)}) /* { dg-error "trait-property .avx. specified more than once" } */ +#pragma omp declare variant (f3) match (device={arch(x86_64,i386,aarch64,"i386")}) /* { dg-error "trait-property .i386. specified more than once" } */ +#pragma omp declare variant (f4) match (implementation={vendor(llvm,gnu,"arm",gnu)}) /* { dg-error "trait-property .gnu. specified more than once" } */ +int f (int); diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90 index 2f09146..01f59c5 100644 --- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90 @@ -15,7 +15,7 @@ contains subroutine f03 () end subroutine subroutine f04 () - !$omp declare variant (f03) match (device={kind("any"),arch(x86_64),isa(avx512f,avx512bw)}) + !$omp declare variant (f03) match (device={arch(x86_64),isa(avx512f,avx512bw)}) end subroutine subroutine f05 () end subroutine @@ -50,7 +50,7 @@ contains subroutine f17 () end subroutine subroutine f18 () - !$omp declare variant (f17) match (device={kind(any,fpga)}) + !$omp declare variant (f17) match (device={kind(fpga)}) end subroutine subroutine test1 () diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90 index 9067428..891f1d2 100644 --- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90 @@ -51,7 +51,7 @@ contains !$omp declare variant (f13) match (device={kind(fpga)}) end subroutine subroutine f20 () - !$omp declare variant (f13) match (device={kind(any,any)}) + !$omp declare variant (f13) match (device={kind(any)}) end subroutine subroutine f21 () !$omp declare variant (f13) match (device={kind(host,nohost)}) @@ -60,7 +60,7 @@ contains !$omp declare variant (f13) match (device={kind("cpu","gpu","fpga")}) end subroutine subroutine f23 () - !$omp declare variant (f13) match (device={kind(any,cpu,nohost)}) + !$omp declare variant (f13) match (device={kind(cpu,nohost)}) end subroutine subroutine f24 () !$omp declare variant (f13) match (device={isa(avx)}) @@ -222,13 +222,7 @@ contains !$omp declare variant (f13) match (user={condition(score(25):.true.)}) end subroutine subroutine f75 () - !$omp declare variant (f13) match (device={kind(any,"any")}) - end subroutine - subroutine f76 () - !$omp declare variant (f13) match (device={kind("any","any")}) - end subroutine - subroutine f77 () - !$omp declare variant (f13) match (device={kind("any",any)}) + !$omp declare variant (f13) match (device={kind("any")}) end subroutine subroutine f78 () !$omp declare variant (f13) match (implementation={vendor(nvidia)}) diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90 index ebd0666..297bff9 100644 --- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90 @@ -38,7 +38,7 @@ contains subroutine f17 () end subroutine subroutine f18 () - !$omp declare variant (f17) match (device={kind("any","fpga")}) + !$omp declare variant (f17) match (device={kind("fpga")}) end subroutine subroutine test1 () diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90 new file mode 100644 index 0000000..c22e27c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90 @@ -0,0 +1,40 @@ +! Check that errors are detected if other trait-properties are given with +! kind(any). + +integer function f1 (x) + integer, intent(in) :: x + f1 = x + 1 +end function +integer function f2 (x) + integer, intent(in) :: x + f2 = x + 2 +end function +integer function f3 (x) + integer, intent(in) :: x + f3 = x + 3 +end function +integer function f4 (x) + integer, intent(in) :: x + f4 = x + 4 +end function +integer function f5 (x) + integer, intent(in) :: x + f4 = x + 5 +end function +integer function f6 (x) + integer, intent(in) :: x + f4 = x + 6 +end function + +integer function f (x) + integer, intent(in) :: x + + !$omp declare variant (f1) match (device={kind(any,gpu)}) ! { dg-error "no other trait-property may be specified" } + !$omp declare variant (f2) match (device={kind(cpu,"any")}) ! { dg-error "no other trait-property may be specified" } + !$omp declare variant (f3) match (device={kind("any"),arch(x86_64)}) ! { dg-error "no other trait-property may be specified" } + !$omp declare variant (f4) match (device={arch(x86_64),kind(any)}) ! { dg-error "no other trait-property may be specified" } + !$omp declare variant (f5) match (device={kind(any,"any")}) ! { dg-error "trait-property .any. specified more than once" } + !$omp declare variant (f6) match (device={kind("any",any)}) ! { dg-error "trait-property .any. specified more than once" } + + f = x +end function diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90 b/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90 new file mode 100644 index 0000000..16dc085 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90 @@ -0,0 +1,30 @@ +! Check that errors are detected if duplicates appear in name-list +! properties. + +integer function f1 (x) + integer, intent(in) :: x + f1 = x + 1 +end function +integer function f2 (x) + integer, intent(in) :: x + f2 = x + 2 +end function +integer function f3 (x) + integer, intent(in) :: x + f3 = x + 3 +end function +integer function f4 (x) + integer, intent(in) :: x + f4 = x + 4 +end function + +integer function f (x) + integer, intent(in) :: x + + !$omp declare variant (f1) match (device={kind(cpu,gpu,"cpu")}) ! { dg-error "trait-property .cpu. specified more than once" } + !$omp declare variant (f2) match (device={isa(sse4,"avx",avx)}) ! { dg-error "trait-property .avx. specified more than once" } + !$omp declare variant (f3) match (device={arch(x86_64,i386,aarch64,"i386")}) ! { dg-error "trait-property .i386. specified more than once" } + !$omp declare variant (f4) match (implementation={vendor(llvm,gnu,"arm",gnu)}) ! { dg-error "trait-property .gnu. specified more than once" } + + f = x +end function |