https://gcc.gnu.org/g:90a497c233380b43e36dafaa6688ca45b2ba4f35

commit 90a497c233380b43e36dafaa6688ca45b2ba4f35
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/c-typeck.cc           | 17 ++++++++++++++---
 gcc/cp/semantics.cc         | 18 ++++++++++++++----
 gcc/fortran/trans-openmp.cc |  3 +++
 3 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index d8471e903fe0..cefff5b98827 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -15675,7 +15675,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;
@@ -15764,6 +15764,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
@@ -17292,13 +17294,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/semantics.cc b/gcc/cp/semantics.cc
index 532c2a352504..1be70855cbe2 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -6379,7 +6379,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;
@@ -6473,6 +6473,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
@@ -9363,15 +9365,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/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 82551a6bd8c9..d2ef85d0267f 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -5825,7 +5825,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