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;
}