• Keith Randall's avatar
    cmd/compile: improve write barrier removal · 30da79d9
    Keith Randall authored
    We're allowed to remove a write barrier when both the old
    value in memory and the new value we're writing are not heap pointers.
    
    Improve both those checks a little bit.
    
    A pointer is known to not be a heap pointer if it is read from
    read-only memory. This sometimes happens for loads of pointers
    from string constants in read-only memory.
    
    Do a better job of tracking which parts of memory are known to be
    zero.  Before we just kept track of a range of offsets in the most
    recently allocated object. For code that initializes the new object's
    fields in a nonstandard order, that tracking is imprecise. Instead,
    keep a bit map of the first 64 words of that object, so we can track
    precisely what we know to be zeroed.
    
    The new scheme is only precise up to the first 512 bytes of the object.
    After that, we'll use write barriers unnecessarily. Hopefully most
    initializers of large objects will use typedmemmove, which does only one
    write barrier check for the whole initialization.
    
    Fixes #34723
    Update #21561
    
    Change-Id: Idf6e1b7d525042fb67961302d4fc6f941393cac8
    Reviewed-on: https://go-review.googlesource.com/c/go/+/199558
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
    30da79d9
writebarrier.go 17.9 KB