compiler: avoid write barrier for a[i] = a[i][:v]

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]

Change-Id: If0c7c76eabbdd68c28e5e9e9233af013144f34f2
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/213558
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index 8d72b1f..c228905 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -183,6 +183,24 @@
 					      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;
 }