• 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
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal/syscall Loading commit data...
io Loading commit data...
lib9 Loading commit data...
libbio Loading commit data...
liblink Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...