]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/gc: ignore re-slicing in escape analysis
authorDmitry Vyukov <dvyukov@google.com>
Fri, 16 Jan 2015 20:30:35 +0000 (23:30 +0300)
committerDmitry Vyukov <dvyukov@google.com>
Wed, 28 Jan 2015 17:37:55 +0000 (17:37 +0000)
commit22c16b4b92f10baf42a3db5de439a70f49101a89
tree9f9c12c64cf66b6fb5a9f6a74bed7da1508e1912
parent1b87f01239de499654b390a41a7f8e2b453789dc
cmd/gc: ignore re-slicing in escape analysis

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/3162
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/gc/esc.c
test/escape2.go
test/escape2n.go