• Keith Randall's avatar
    cmd/compile: reorder how slicelit initializes a slice · 934c3599
    Keith Randall authored
      func f(x, y, z *int) {
        a := []*int{x,y,z}
        ...
      }
    
    We used to use:
      var tmp [3]*int
      a := tmp[:]
      a[0] = x
      a[1] = y
      a[2] = z
    
    Now we do:
      var tmp [3]*int
      tmp[0] = x
      tmp[1] = y
      tmp[2] = z
      a := tmp[:]
    
    Doesn't sound like a big deal, but the compiler has trouble
    eliminating write barriers when using the former method because it
    doesn't know that the slice points to the stack.  In the latter
    method, the compiler knows the array is on the stack and as a result
    doesn't emit any write barriers.
    
    This turns out to be extremely common when building ... args, like
    for calls fmt.Printf.
    
    Makes go binaries ~1% smaller.
    
    Doesn't have a measurable effect on the go1 fmt benchmarks,
    unfortunately.
    
    Fixes #14263
    Update #6853
    
    Change-Id: I9074a2788ec9e561a75f3b71c119b69f304d6ba2
    Reviewed-on: https://go-review.googlesource.com/22395
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarJosh Bleecher Snyder <josharian@gmail.com>
    934c3599
writebarrier.go 3.71 KB