cmd/compile: support pointers to arrays in arrayClear

Fixes #52635

Change-Id: I85f182931e30292983ef86c55a0ab6e01282395c
Reviewed-on: https://go-review.googlesource.com/c/go/+/403337
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
Cuong Manh Le 2022-05-02 00:25:16 +07:00
parent f771edd7f9
commit 0668e3cb1a
2 changed files with 43 additions and 1 deletions

View File

@ -403,8 +403,14 @@ func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
return nil return nil
} }
lhs := stmt.X.(*ir.IndexExpr) lhs := stmt.X.(*ir.IndexExpr)
x := lhs.X
if a.Type().IsPtr() && a.Type().Elem().IsArray() {
if s, ok := x.(*ir.StarExpr); ok && s.Op() == ir.ODEREF {
x = s.X
}
}
if !ir.SameSafeExpr(lhs.X, a) || !ir.SameSafeExpr(lhs.Index, v1) { if !ir.SameSafeExpr(x, a) || !ir.SameSafeExpr(lhs.Index, v1) {
return nil return nil
} }

View File

@ -0,0 +1,36 @@
// asmcheck
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Test that optimized range memclr works with pointers to arrays.
package codegen
type T struct {
a *[10]int
b [10]int
}
func (t *T) f() {
// amd64:".*runtime.memclrNoHeapPointers"
for i := range t.a {
t.a[i] = 0
}
// amd64:".*runtime.memclrNoHeapPointers"
for i := range *t.a {
t.a[i] = 0
}
// amd64:".*runtime.memclrNoHeapPointers"
for i := range t.a {
(*t.a)[i] = 0
}
// amd64:".*runtime.memclrNoHeapPointers"
for i := range *t.a {
(*t.a)[i] = 0
}
}