• Dmitry Vyukov's avatar
    cmd/gc: ignore re-slicing in escape analysis · 22c16b4b
    Dmitry Vyukov authored
    Escape analysis treats everything assigned to OIND/ODOTPTR as escaping.
    As the result b escapes in the following code:
    
    	func (b *Buffer) Foo() {
    		n, m := ...
    		b.buf = b.buf[n:m]
    	}
    
    This change recognizes such assignments and ignores them.
    
    Update issue #9043.
    Update issue #7921.
    
    There are two similar cases in std lib that benefit from this optimization.
    First is in archive/zip:
    
    type readBuf []byte
    func (b *readBuf) uint32() uint32 {
    	v := binary.LittleEndian.Uint32(*b)
    	*b = (*b)[4:]
    	return v
    }
    
    Second is in time:
    
    type data struct {
    	p     []byte
    	error bool
    }
    
    func (d *data) read(n int) []byte {
    	if len(d.p) < n {
    		d.p = nil
    		d.error = true
    		return nil
    	}
    	p := d.p[0:n]
    	d.p = d.p[n:]
    	return p
    }
    
    benchmark                         old ns/op     new ns/op     delta
    BenchmarkCompressedZipGarbage     32431724      32217851      -0.66%
    
    benchmark                         old allocs     new allocs     delta
    BenchmarkCompressedZipGarbage     153            143            -6.54%
    
    Change-Id: Ia6cd32744e02e36d6d8c19f402f8451101711626
    Reviewed-on: https://go-review.googlesource.com/3162Reviewed-by: default avatarKeith Randall <khr@golang.org>
    Reviewed-by: default avatarRuss Cox <rsc@golang.org>
    22c16b4b
esc.c 34.4 KB