https://gcc.gnu.org/g:01fee7c82d65ac512baaaca32de0ca762872d24a
commit 01fee7c82d65ac512baaaca32de0ca762872d24a Author: Tobias Burnus <tbur...@baylibre.com> Date: Thu Jan 23 22:41:23 2025 +0100 OpenMP: Update OMP_REQUIRES_TARGET_USED for declare_target + interop Older versions of the OpenMP specification were not clear about what counted as device usage. Newer (like TR13) are rather clear. Hence, this commit adds GCC's target-used flag also when a 'declare target' or an 'interop' are encountered. (The latter only to Fortran as C/C++ parsing support is still missing.) TR13 also lists 'dispatch' as target-used construct (as it has the device clause) and 'device_safesync' as clause with global requirement property, but both are not yet supported in GCC. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_declare_target): Set target-used bit in omp_requires_mask. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_declare_target): Set target-used bit in omp_requires_mask. gcc/fortran/ChangeLog: * parse.cc (decode_omp_directive): Set target-used bit of omp_requires_mask when encountering the declare_target or interop directive. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/interop-1.f90: Add dg-error for missing omp requires requirement and declare_variant usage. * gfortran.dg/gomp/requires-8.f90: Likewise. (cherry picked from commit fcff9c3dad4f356cbf56feaed7442893203a3003) Diff: --- gcc/c/ChangeLog.omp | 8 ++++++++ gcc/c/c-parser.cc | 3 +++ gcc/cp/ChangeLog.omp | 8 ++++++++ gcc/cp/parser.cc | 3 +++ gcc/fortran/ChangeLog.omp | 9 +++++++++ gcc/fortran/parse.cc | 8 ++++++-- gcc/testsuite/ChangeLog.omp | 9 +++++++++ gcc/testsuite/gfortran.dg/gomp/interop-1.f90 | 2 +- gcc/testsuite/gfortran.dg/gomp/requires-8.f90 | 4 ++-- 9 files changed, 49 insertions(+), 5 deletions(-) diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp index 99afa3868446..2381d31ef0e4 100644 --- a/gcc/c/ChangeLog.omp +++ b/gcc/c/ChangeLog.omp @@ -1,3 +1,11 @@ +2025-01-23 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2024-09-25 Tobias Burnus <tbur...@baylibre.com> + + * c-parser.cc (c_parser_omp_declare_target): Set target-used bit + in omp_requires_mask. + 2024-05-15 Jakub Jelinek <ja...@redhat.com> * c-typeck.cc (c_finish_omp_clauses): Diagnose grainsize diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index b8fd24695754..a284a916ac62 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -26191,6 +26191,9 @@ c_parser_omp_declare_target (c_parser *parser) int device_type = 0; bool indirect = false; bool only_device_type_or_indirect = true; + if (flag_openmp) + omp_requires_mask + = (enum omp_requires) (omp_requires_mask | OMP_REQUIRES_TARGET_USED); if (c_parser_next_token_is (parser, CPP_NAME) || (c_parser_next_token_is (parser, CPP_COMMA) && c_parser_peek_2nd_token (parser)->type == CPP_NAME)) diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp index 1136e686b18c..03f4631cc565 100644 --- a/gcc/cp/ChangeLog.omp +++ b/gcc/cp/ChangeLog.omp @@ -1,3 +1,11 @@ +2025-01-23 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2024-09-25 Tobias Burnus <tbur...@baylibre.com> + + * parser.cc (cp_parser_omp_declare_target): Set target-used bit + in omp_requires_mask. + 2024-12-06 Andrew Stubbs <a...@baylibre.com> Kwok Cheung Yeung <kcye...@baylibre.com> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 2d1a3464bad2..5a05fb18ef87 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -50099,6 +50099,9 @@ cp_parser_omp_declare_target (cp_parser *parser, cp_token *pragma_tok) int device_type = 0; bool indirect = false; bool only_device_type_or_indirect = true; + if (flag_openmp) + omp_requires_mask + = (enum omp_requires) (omp_requires_mask | OMP_REQUIRES_TARGET_USED); if (cp_lexer_next_token_is (parser->lexer, CPP_NAME) || (cp_lexer_next_token_is (parser->lexer, CPP_COMMA) && cp_lexer_nth_token_is (parser->lexer, 2, CPP_NAME))) diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp index 89cc5f52ebb6..d74e26213801 100644 --- a/gcc/fortran/ChangeLog.omp +++ b/gcc/fortran/ChangeLog.omp @@ -1,3 +1,12 @@ +2025-01-23 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2024-09-25 Tobias Burnus <tbur...@baylibre.com> + + * parse.cc (decode_omp_directive): Set target-used bit of + omp_requires_mask when encountering the declare_target or interop + directive. + 2025-01-23 Tobias Burnus <tbur...@baylibre.com> Backported from master: diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc index 182c293148d5..fa731cec0ca7 100644 --- a/gcc/fortran/parse.cc +++ b/gcc/fortran/parse.cc @@ -1366,8 +1366,12 @@ decode_omp_directive (void) switch (ret) { - /* Set omp_target_seen; exclude ST_OMP_DECLARE_TARGET. - FIXME: Get clarification, cf. OpenMP Spec Issue #3240. */ + /* For the constraints on clauses with the global requirement property, + we set omp_target_seen. This included all clauses that take the + DEVICE clause, (BEGIN) DECLARE_TARGET and procedures run the device + (which effectively is implied by the former). */ + case ST_OMP_DECLARE_TARGET: + case ST_OMP_INTEROP: case ST_OMP_TARGET: case ST_OMP_TARGET_DATA: case ST_OMP_TARGET_ENTER_DATA: diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp index b3f5731d5119..c8952ea407c6 100644 --- a/gcc/testsuite/ChangeLog.omp +++ b/gcc/testsuite/ChangeLog.omp @@ -1,3 +1,12 @@ +2025-01-23 Tobias Burnus <tbur...@baylibre.com> + + Backported from master: + 2024-09-25 Tobias Burnus <tbur...@baylibre.com> + + * gfortran.dg/gomp/interop-1.f90: Add dg-error for missing + omp requires requirement and declare_variant usage. + * gfortran.dg/gomp/requires-8.f90: Likewise. + 2025-01-23 Tobias Burnus <tbur...@baylibre.com> Backported from master: diff --git a/gcc/testsuite/gfortran.dg/gomp/interop-1.f90 b/gcc/testsuite/gfortran.dg/gomp/interop-1.f90 index 8c99fc97f888..b7d2164812cc 100644 --- a/gcc/testsuite/gfortran.dg/gomp/interop-1.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/interop-1.f90 @@ -17,7 +17,7 @@ module m integer (omp_interop_fr_kind), parameter :: omp_ifr_hsa = 7 end module m -subroutine sub1 +subroutine sub1 ! { dg-error "Program unit at .1. has OpenMP device constructs/routines but does not set !.OMP REQUIRES REVERSE_OFFLOAD but other program units do" } !$omp interop integer :: y ! { dg-error "Unexpected data declaration statement" } end subroutine sub1 diff --git a/gcc/testsuite/gfortran.dg/gomp/requires-8.f90 b/gcc/testsuite/gfortran.dg/gomp/requires-8.f90 index 583c5a56b32e..3b0a7d81768c 100644 --- a/gcc/testsuite/gfortran.dg/gomp/requires-8.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/requires-8.f90 @@ -17,9 +17,9 @@ contains end subroutine foo end module m -subroutine bar +subroutine bar ! { dg-error "has OpenMP device constructs/routines but does not set !.OMP REQUIRES REVERSE_OFFLOAD but other program units do" } !use m - !$omp requires unified_shared_memory ! Possibly OK - needs OpenMP Lang Spec clarification (-> #3240) + !$omp requires unified_shared_memory !$omp declare target end subroutine bar