aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2016-10-18 10:01:56 -0400
committerAustin Clements <austin@google.com>2016-10-28 19:13:13 +0000
commit58e2edafb718718225056530a7a09ee3e08a96d1 (patch)
treea24a2d3e4196b3b32d38e0fa48b97e934f6a2333 /src
parentef3df18944d2d210f99de88fee01414ab1fa8f66 (diff)
downloadgo-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.go14
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)