mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
cmd/compile: omit write barriers for slice clears of go:notinheap pointers
Currently, for i := range a { a[i] = nil } will compile to have write barriers even if a is a slice of pointers to go:notinheap types. This happens because the optimization that transforms this into a memclr only asks it a's element type has pointers, and not if it specifically has heap pointers. Fix this by changing arrayClear to use HasHeapPointer instead of types.Haspointers. We probably shouldn't have both of these functions, since a pointer to a notinheap type is effectively a uintptr, but that's not going to change in this CL. Change-Id: I284b85bdec6ae1e641f894e8f577989facdb0cf1 Reviewed-on: https://go-review.googlesource.com/c/152723 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
c8ca793176
commit
6454a09a97
|
@ -586,7 +586,7 @@ func arrayClear(n, v1, v2, a *Node) bool {
|
||||||
n.Nbody.Append(nod(OAS, hn, tmp))
|
n.Nbody.Append(nod(OAS, hn, tmp))
|
||||||
|
|
||||||
var fn *Node
|
var fn *Node
|
||||||
if types.Haspointers(a.Type.Elem()) {
|
if a.Type.Elem().HasHeapPointer() {
|
||||||
// memclrHasPointers(hp, hn)
|
// memclrHasPointers(hp, hn)
|
||||||
Curfn.Func.setWBPos(stmt.Pos)
|
Curfn.Func.setWBPos(stmt.Pos)
|
||||||
fn = mkcall("memclrHasPointers", nil, nil, hp, hn)
|
fn = mkcall("memclrHasPointers", nil, nil, hp, hn)
|
||||||
|
|
|
@ -58,3 +58,19 @@ func h() {
|
||||||
_ = append(v1s, v1s...) // no barrier
|
_ = append(v1s, v1s...) // no barrier
|
||||||
_ = append(v2s, v2s...) // ERROR "write barrier"
|
_ = append(v2s, v2s...) // ERROR "write barrier"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Slice clearing
|
||||||
|
|
||||||
|
var (
|
||||||
|
sliceIH []*ih
|
||||||
|
sliceNIH []*nih
|
||||||
|
)
|
||||||
|
|
||||||
|
func sliceClear() {
|
||||||
|
for i := range sliceIH {
|
||||||
|
sliceIH[i] = nil // ERROR "write barrier"
|
||||||
|
}
|
||||||
|
for i := range sliceNIH {
|
||||||
|
sliceNIH[i] = nil // no barrier
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue