• Keith Randall's avatar
    cmd/compile: better write barrier removal when initializing new objects · ca36af21
    Keith Randall authored
    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: 's avatarCherry Zhang <cherryyz@google.com>
    ca36af21