]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: better write barrier removal when initializing new objects
authorKeith Randall <khr@google.com>
Sat, 5 Jan 2019 01:34:33 +0000 (17:34 -0800)
committerKeith Randall <khr@golang.org>
Mon, 18 Mar 2019 21:16:19 +0000 (21:16 +0000)
commitca36af215f78b670000b31e7573f0fcf0c5de594
tree4cfb8e0b6eabba2df46359206dcbb124225daf91
parent08751259b75ad88e1b65c0b1c1a76541b924dd9d
cmd/compile: better write barrier removal when initializing new objects

When initializing a new object, we're often writing
1) to a location that doesn't have a pointer to a heap object
2) a pointer that doesn't point to a heap object

When both those conditions are true, we can avoid the write barrier.

This CL detects case 1 by looking for writes to known-zeroed
locations.  The results of runtime.newobject are zeroed, and we
perform a simple tracking of which parts of that object are written so
we can determine what part remains zero at each write.

This CL detects case 2 by looking for addresses of globals (including
the types and itabs which are used in interfaces) and for nil pointers.

Makes cmd/go 0.3% smaller. Some particular cases, like the slice
literal in #29573, can get much smaller.

TODO: we can remove actual zero writes also with this mechanism.

Update #29573

Change-Id: Ie74a3533775ea88da0495ba02458391e5db26cb9
Reviewed-on: https://go-review.googlesource.com/c/go/+/156363
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/sinit.go
src/cmd/compile/internal/ssa/writebarrier.go
test/writebarrier.go