• 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: 's avatarKeith Randall <khr@golang.org>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    22c16b4b
Name
Last commit
Last update
api Loading commit data...
doc Loading commit data...
include Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...