diff options
| author | Austin Clements <austin@google.com> | 2016-10-18 10:01:56 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2016-10-28 19:13:13 +0000 |
| commit | 58e2edafb718718225056530a7a09ee3e08a96d1 (patch) | |
| tree | a24a2d3e4196b3b32d38e0fa48b97e934f6a2333 /src | |
| parent | ef3df18944d2d210f99de88fee01414ab1fa8f66 (diff) | |
| download | go-58e2edafb718718225056530a7a09ee3e08a96d1.tar.xz | |
cmd/compile: lower slice clears to memclrHasPointers
If a slice's backing store has pointers, we need to lower clears of
that slice to memclrHasPointers instead of memclrNoHeapPointers.
Updates #17503.
Change-Id: I20750e4bf57f7b8862f3d898bfb32d964b91d07b
Reviewed-on: https://go-review.googlesource.com/31450
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/range.go | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go index 59dfba5b1e..b59047428f 100644 --- a/src/cmd/compile/internal/gc/range.go +++ b/src/cmd/compile/internal/gc/range.go @@ -393,13 +393,11 @@ func memclrrange(n, v1, v2, a *Node) bool { return false } - // TODO: Use memclrHasPointers if there are pointers. - // Convert to // if len(a) != 0 { // hp = &a[0] // hn = len(a)*sizeof(elem(a)) - // memclrNoHeapPointers(hp, hn) + // memclr{NoHeap,Has}Pointers(hp, hn) // i = len(a) - 1 // } n.Op = OIF @@ -425,8 +423,14 @@ func memclrrange(n, v1, v2, a *Node) bool { tmp = conv(tmp, Types[TUINTPTR]) n.Nbody.Append(nod(OAS, hn, tmp)) - // memclrNoHeapPointers(hp, hn) - fn := mkcall("memclrNoHeapPointers", nil, nil, hp, hn) + var fn *Node + if haspointers(a.Type.Elem()) { + // memclrHasPointers(hp, hn) + fn = mkcall("memclrHasPointers", nil, nil, hp, hn) + } else { + // memclrNoHeapPointers(hp, hn) + fn = mkcall("memclrNoHeapPointers", nil, nil, hp, hn) + } n.Nbody.Append(fn) |
