]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[og11] Unify ARRAY_REF/INDIRECT_REF stripping code in extract_base_bit_offset
authorJulian Brown <julian@codesourcery.com>
Mon, 19 Apr 2021 13:24:41 +0000 (06:24 -0700)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Tue, 21 Jun 2022 13:11:37 +0000 (14:11 +0100)
For historical reasons, it seems that extract_base_bit_offset
unnecessarily used two different ways to strip ARRAY_REF/INDIRECT_REF
nodes from component accesses. I verified that the two ways of performing
the operation gave the same results across the whole testsuite (and
several additional benchmarks).

The code was like this since an earlier "mechanical" refactoring by me,
first posted here:

  https://gcc.gnu.org/pipermail/gcc-patches/2018-November/510503.html

It was never clear to me if there was an important semantic
difference between the two ways of stripping the base before calling
get_inner_reference, but it appears that there is not, so one can go away.

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

gcc/
* gimplify.cc (extract_base_bit_offset): Unify ARRAY_REF/INDIRECT_REF
stripping code in first call/subsequent call cases.

gcc/ChangeLog.omp
gcc/gimplify.cc

index bfc3bfa18ef14fc182f4fe60b7d8fe4a7d23d171..cc41450caa659bf8d9b8bdf24e6533869f15b2b9 100644 (file)
@@ -1,3 +1,8 @@
+2021-06-02  Julian Brown  <julian@codesourcery.com>
+
+       * gimplify.cc (extract_base_bit_offset): Unify ARRAY_REF/INDIRECT_REF
+       stripping code in first call/subsequent call cases.
+
 2021-06-02  Julian Brown  <julian@codesourcery.com>
 
        * gimplify.cc (gimplify_scan_omp_clauses): Simplify condition
index 4eca97d2903e8d80c47beb86b56fbb92e672a445..59903ed177919c39d0c2b0798aa62a751939197e 100644 (file)
@@ -8824,31 +8824,21 @@ extract_base_bit_offset (tree base, tree *base_ref, poly_int64 *bitposp,
   poly_offset_int poffset;
 
   if (base_ref)
-    {
-      *base_ref = NULL_TREE;
-
-      while (TREE_CODE (base) == ARRAY_REF)
-       base = TREE_OPERAND (base, 0);
+    *base_ref = NULL_TREE;
 
-      if (TREE_CODE (base) == INDIRECT_REF)
-       base = TREE_OPERAND (base, 0);
-    }
-  else
+  if (TREE_CODE (base) == ARRAY_REF)
     {
-      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))
+      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);