On 8/16/24 06:58, Jakub Jelinek wrote:
If this can apply (perhaps with small fuzz) to vanilla trunk, guess it can
be committed right now, doesn't need to wait for the rest of the
metadirective patch set.
OK. I've tested the slightly cleaned-up version of the patch which is
attached; I'll push it in the next day or two if there is no further
objection.
-Sandra
From 23a82bea26805f2a430354d56b444d5bb7eaed3f Mon Sep 17 00:00:00 2001
From: Sandra Loosemore <sloosem...@baylibre.com>
Date: Fri, 6 Sep 2024 20:58:13 +0000
Subject: [PATCH] OpenMP: Reject other properties with kind(any)
TR13 (pre-6.0) of the OpenMP spec says:
"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."
This restriction dates back to OpenMP 5.1 (where it had slightly
different wording). GCC's implementation was based on the 5.0 spec, and
several testcases include selectors that are now considered invalid.
This patch adds a diagnostic and fixes the testcases.
gcc/ChangeLog
* omp-general.cc (omp_check_context_selector): Reject other
properties in the same selector set with kind(any).
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.
* 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.
---
gcc/omp-general.cc | 35 +++++++++++++++++++
.../c-c++-common/gomp/declare-variant-10.c | 4 +--
.../c-c++-common/gomp/declare-variant-3.c | 10 ++----
.../c-c++-common/gomp/declare-variant-9.c | 4 +--
.../c-c++-common/gomp/declare-variant-any.c | 10 ++++++
.../gfortran.dg/gomp/declare-variant-10.f90 | 4 +--
.../gfortran.dg/gomp/declare-variant-3.f90 | 12 ++-----
.../gfortran.dg/gomp/declare-variant-9.f90 | 2 +-
.../gfortran.dg/gomp/declare-variant-any.f90 | 28 +++++++++++++++
9 files changed, 86 insertions(+), 23 deletions(-)
create mode 100644 gcc/testsuite/c-c++-common/gomp/declare-variant-any.c
create mode 100644 gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90
diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc
index 0b61335dba4..aa53c00bec5 100644
--- a/gcc/omp-general.cc
+++ b/gcc/omp-general.cc
@@ -1288,6 +1288,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)
@@ -1324,6 +1326,31 @@ 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;
+
if (omp_ts_map[ts_code].valid_properties == NULL)
continue;
@@ -1376,6 +1403,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 2b8a39425b1..e77693430d1 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 f5d7797f458..0d772d7aaab 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 5ee75892f2d..da96c81eb6f 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 00000000000..ad932109077
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c
@@ -0,0 +1,10 @@
+extern int f1 (int);
+extern int f2 (int);
+extern int f3 (int);
+extern int f4 (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" } */
+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 2f09146a10d..01f59c52808 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 6b23d40e410..30733209e14 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)})
@@ -219,13 +219,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 ebd066609f3..297bff97d5e 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 00000000000..01540008724
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90
@@ -0,0 +1,28 @@
+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(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" }
+
+ f = x
+end function
+
--
2.25.1