compiler: avoid write barrier for a[i] = a[i][:v]
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 7 Jan 2020 15:35:04 +0000 (15:35 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 7 Jan 2020 15:35:04 +0000 (15:35 +0000)
    This avoids generating a write barrier for code that appears in the
    Go1.14beta1 runtime package in (*pageAlloc).sysGrow:
        s.summary[l] = s.summary[l][:needIdxLimit]

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/213558

From-SVN: r279962

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index 6dca40f..9f825da 100644 (file)
@@ -1,4 +1,4 @@
-d0a102eea2262e3fca89b1eb342fd03328c4aa16
+86d223eaccecff72b44cd23a014bc028b658055e
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 8d72b1f..c228905 100644 (file)
@@ -183,6 +183,24 @@ Expression::is_same_variable(Expression* a, Expression* b)
                                              bu->operand()));
     }
 
+  Array_index_expression* aie = a->array_index_expression();
+  if (aie != NULL)
+    {
+      Array_index_expression* bie = b->array_index_expression();
+      return (aie->end() == NULL
+             && bie->end() == NULL
+             && Expression::is_same_variable(aie->array(), bie->array())
+             && Expression::is_same_variable(aie->start(), bie->start()));
+    }
+
+  Numeric_constant aval;
+  if (a->numeric_constant_value(&aval))
+    {
+      Numeric_constant bval;
+      if (b->numeric_constant_value(&bval))
+       return aval.equals(bval);
+    }
+
   return false;
 }