]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[og11] OpenMP/OpenACC: Move array_ref/indirect_ref handling code out of extract_base_...
authorJulian Brown <julian@codesourcery.com>
Thu, 3 Jun 2021 13:47:00 +0000 (06:47 -0700)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Tue, 21 Jun 2022 13:11:39 +0000 (14:11 +0100)
At Richard Biener's suggestion, this patch undoes the following patch:

  https://gcc.gnu.org/pipermail/gcc-patches/2021-June/571712.html

and moves the stripping of ARRAY_REFS/INDIRECT_REFS out of
extract_base_bit_offset and back into the (two) call sites of the
function. The difference between the two ways of looking through these
nodes comes down to (I think) what processing has been done on the
clause in question already: in the case where BASE_REF is non-NULL,
we are processing an OMP_CLAUSE_DECL for the first time. Conversely,
when BASE_REF is NULL, we are processing a node from the sorted list
that is being constructed after a GOMP_MAP_STRUCT node.

2021-06-07  Julian Brown  <julian@codesourcery.com>

gcc/
* gimplify.cc (extract_base_bit_offset): Don't look through ARRAY_REFs or
INDIRECT_REFs here.
(build_struct_group): Reinstate previous behaviour for handling
ARRAY_REFs/INDIRECT_REFs.

gcc/ChangeLog.omp
gcc/gimplify.cc

index 25914ac1cad972d8cad7dd97f61a1f020e0c869b..d3628663b267723698d0d2b4e0089c09f60d089e 100644 (file)
@@ -1,3 +1,10 @@
+2021-06-03  Julian Brown  <julian@codesourcery.com>
+
+       * gimplify.cc (extract_base_bit_offset): Don't look through ARRAY_REFs or
+       INDIRECT_REFs here.
+       (build_struct_group): Reinstate previous behaviour for handling
+       ARRAY_REFs/INDIRECT_REFs.
+
 2021-06-02  Julian Brown  <julian@codesourcery.com>
 
        * gimplify.cc (extract_base_bit_offset): Add BASE_IND and OPENMP
index ea0cc6f69f937bb1456916f99234313314413f95..f962c727df4a33fc6c6184ac328f81cdfde174c8 100644 (file)
@@ -8823,20 +8823,6 @@ extract_base_bit_offset (tree base, tree *base_ind, tree *base_ref,
   if (base_ref)
     *base_ref = NULL_TREE;
 
-  if (TREE_CODE (base) == ARRAY_REF)
-    {
-      while (TREE_CODE (base) == ARRAY_REF)
-       base = TREE_OPERAND (base, 0);
-      if (TREE_CODE (base) != COMPONENT_REF
-         || TREE_CODE (TREE_TYPE (base)) != ARRAY_TYPE)
-       return NULL_TREE;
-    }
-  else if (TREE_CODE (base) == INDIRECT_REF
-          && TREE_CODE (TREE_OPERAND (base, 0)) == COMPONENT_REF
-          && (TREE_CODE (TREE_TYPE (TREE_OPERAND (base, 0)))
-              == REFERENCE_TYPE))
-    base = TREE_OPERAND (base, 0);
-
   base = get_inner_reference (base, &bitsize, &bitpos, &offset, &mode,
                              &unsignedp, &reversep, &volatilep);
 
@@ -9413,11 +9399,17 @@ build_struct_group (struct gimplify_omp_ctx *ctx,
   poly_offset_int coffset;
   poly_int64 cbitpos;
   tree base_ind, base_ref, tree_coffset;
+  tree ocd = OMP_CLAUSE_DECL (c);
   bool openmp = !(region_type & ORT_ACC);
 
-  tree base = extract_base_bit_offset (OMP_CLAUSE_DECL (c), &base_ind,
-                                      &base_ref, &cbitpos, &coffset,
-                                      &tree_coffset, openmp);
+  while (TREE_CODE (ocd) == ARRAY_REF)
+    ocd = TREE_OPERAND (ocd, 0);
+
+  if (TREE_CODE (ocd) == INDIRECT_REF)
+    ocd = TREE_OPERAND (ocd, 0);
+
+  tree base = extract_base_bit_offset (ocd, &base_ind, &base_ref, &cbitpos,
+                                      &coffset, &tree_coffset, openmp);
 
   bool do_map_struct = (base == decl && !tree_coffset);
 
@@ -9644,9 +9636,23 @@ build_struct_group (struct gimplify_omp_ctx *ctx,
            poly_offset_int offset;
            poly_int64 bitpos;
            tree tree_offset;
-           tree base = extract_base_bit_offset (sc_decl, NULL, NULL,
-                                                &bitpos, &offset,
-                                                &tree_offset, openmp);
+
+           if (TREE_CODE (sc_decl) == ARRAY_REF)
+             {
+               while (TREE_CODE (sc_decl) == ARRAY_REF)
+                 sc_decl = TREE_OPERAND (sc_decl, 0);
+               if (TREE_CODE (sc_decl) != COMPONENT_REF
+                   || TREE_CODE (TREE_TYPE (sc_decl)) != ARRAY_TYPE)
+                 break;
+             }
+           else if (TREE_CODE (sc_decl) == INDIRECT_REF
+                    && TREE_CODE (TREE_OPERAND (sc_decl, 0)) == COMPONENT_REF
+                    && (TREE_CODE (TREE_TYPE (TREE_OPERAND (sc_decl, 0)))
+                        == REFERENCE_TYPE))
+             sc_decl = TREE_OPERAND (sc_decl, 0);
+
+           tree base = extract_base_bit_offset (sc_decl, NULL, NULL, &bitpos,
+                                                &offset, &tree_offset, openmp);
            if (!base || !operand_equal_p (base, decl, 0))
              break;
            if (scp)