https://gcc.gnu.org/g:1adb0ccac34ca39b6539108bdaa0262256c842d5

commit 1adb0ccac34ca39b6539108bdaa0262256c842d5
Author: Kwok Cheung Yeung <kcye...@baylibre.com>
Date:   Thu Sep 12 21:33:58 2024 +0100

    openmp: Disable strided target updates when iterators are used
    
    Non-contiguous target updates result in the new strided target updates code
    being used, resulting in new clauses such as GOMP_MAP_GRID_DIM,
    GOMP_MAP_GRID_STRIDE etc. These are not currently supported in conjunction
    with iterators, so this code-path is disabled when used together with
    iterators.
    
    The older target updates supports non-contiguous updates as long as a stride
    is not applied.
    
    gcc/c/
    
            * c-typeck.cc (handle_omp_array_sections): Add extra argument.  Set
            argument to true if array section has a stride that is not one.
            (c_finish_omp_clauses): Disable strided updates when iterators are
            used in the clause.  Emit sorry if strided.
    
    gcc/cp/
    
            * semantics.cc (handle_omp_array_sections): Add extra argument.  Set
            argument to true if array section has a stride that is not one.
            (finish_omp_clauses): Disable strided updates when iterators are
            used in the clause.  Emit sorry if strided.
    
    gcc/fortran/
    
            * trans-openmp.cc (gfc_trans_omp_clauses): Disable strided updates
            when iterators are used in the clause.

Diff:
---
 gcc/c/ChangeLog.omp         |  7 +++++++
 gcc/c/c-typeck.cc           | 17 ++++++++++++++---
 gcc/cp/ChangeLog.omp        |  7 +++++++
 gcc/cp/semantics.cc         | 18 ++++++++++++++----
 gcc/fortran/ChangeLog.omp   |  5 +++++
 gcc/fortran/trans-openmp.cc |  3 +++
 6 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp
index af995a398571..80a771f50207 100644
--- a/gcc/c/ChangeLog.omp
+++ b/gcc/c/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * c-typeck.cc (handle_omp_array_sections): Add extra argument.  Set
+       argument to true if array section has a stride that is not one.
+       (c_finish_omp_clauses): Disable strided updates when iterators are
+       used in the clause.  Emit sorry if strided.
+
 2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
 
        * c-parser.cc (c_parser_omp_clause_from_to): Parse 'iterator' modifier.
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index e6ec927c6bc2..78272d582357 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -14597,7 +14597,7 @@ omp_array_section_low_bound (location_t loc, tree node)
 
 static bool
 handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort,
-                          int *discontiguous)
+                          int *discontiguous, bool *strided = NULL)
 {
   tree c = *pc;
   bool maybe_zero_len = false;
@@ -14686,6 +14686,8 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum 
c_omp_region_type ort,
 
          if (stride == NULL_TREE)
            stride = size_one_node;
+         if (strided && !integer_onep (stride))
+           *strided = true;
          if (discontiguous && *discontiguous)
            {
              /* This condition is similar to the error check below, but
@@ -16214,13 +16216,22 @@ c_finish_omp_clauses (tree clauses, enum 
c_omp_region_type ort)
                grp_sentinel = OMP_CLAUSE_CHAIN (c);
 
                tree *pnext = NULL;
+               /* FIXME: Strided target updates not supported together with
+                  iterators yet.  */
                int discontiguous
                  = (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
-                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM);
-               if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous))
+                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+                   && !OMP_CLAUSE_ITERATORS (c);
+               bool strided = false;
+               if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous,
+                                              &strided))
                  remove = true;
                else
                  {
+                   if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
+                        || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+                       && OMP_CLAUSE_ITERATORS (c) && strided)
+                     sorry ("strided target updates with iterators");
                    c = *pc;
                    t = OMP_CLAUSE_DECL (c);
                    if (!omp_mappable_type (TREE_TYPE (t)))
diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index 80d2c3b5069e..95e2b32e60e3 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * semantics.cc (handle_omp_array_sections): Add extra argument.  Set
+       argument to true if array section has a stride that is not one.
+       (finish_omp_clauses): Disable strided updates when iterators are
+       used in the clause.  Emit sorry if strided.
+
 2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
 
        * parser.cc (cp_parser_omp_clause_from_to): Parse 'iterator' modifier.
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index dc102f15cf7c..e7c2e69e0e26 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -5993,7 +5993,7 @@ omp_array_section_low_bound (location_t loc, tree node)
 
 static bool
 handle_omp_array_sections (tree *pc, tree **pnext, enum c_omp_region_type ort,
-                          int *discontiguous)
+                          int *discontiguous, bool *strided = NULL)
 {
   tree c = *pc;
   bool maybe_zero_len = false;
@@ -6087,6 +6087,8 @@ handle_omp_array_sections (tree *pc, tree **pnext, enum 
c_omp_region_type ort,
 
          if (stride == NULL_TREE)
            stride = size_one_node;
+         if (strided && !integer_onep (stride))
+           *strided = true;
          if (discontiguous && *discontiguous)
            {
              /* This condition is similar to the error check below, but
@@ -8976,15 +8978,23 @@ finish_omp_clauses (tree clauses, enum 
c_omp_region_type ort)
              {
                grp_start_p = pc;
                grp_sentinel = OMP_CLAUSE_CHAIN (c);
-
+               /* FIXME: Strided target updates not supported together with
+                  iterators yet.  */
                int discontiguous
                  = (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
-                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM);
+                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+                   && !OMP_CLAUSE_ITERATORS (c);
+               bool strided = false;
                tree *pnext = NULL;
-               if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous))
+               if (handle_omp_array_sections (pc, &pnext, ort, &discontiguous,
+                                              &strided))
                  remove = true;
                else
                  {
+                   if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
+                        || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
+                       && OMP_CLAUSE_ITERATORS (c) && strided)
+                     sorry ("strided target updates with iterators");
                    /* We might have replaced the clause, so refresh C.  */
                    c = *pc;
                    t = OMP_CLAUSE_DECL (c);
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index ebbdf3d149e7..e1533c56b347 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,8 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * trans-openmp.cc (gfc_trans_omp_clauses): Disable strided updates
+       when iterators are used in the clause.
+
 2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
 
        * dump-parse-tree.cc (show_omp_namelist): Add iterator support for
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 5d62ea396df3..8154e7850509 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -6465,7 +6465,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, 
gfc_omp_clauses *clauses,
                  if (ref->type == REF_COMPONENT || ref->type == REF_ARRAY)
                    lastref = ref;
 
+             /* FIXME: Currently no support for strided target updates with
+                iterators.  */
              if ((list == OMP_LIST_TO || list == OMP_LIST_FROM)
+                 && !iterator
                  && (!n->expr || (lastref && lastref->type == REF_ARRAY))
                  && !gfc_omp_contiguous_update_p (n))
                {

Reply via email to