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

Reply via email to