diff options
author | Josh Bleecher Snyder <josharian@gmail.com> | 2017-02-27 11:37:54 -0800 |
---|---|---|
committer | Josh Bleecher Snyder <josharian@gmail.com> | 2017-02-27 21:31:04 +0000 |
commit | 1e29cd8c2b560825494e6ae079a17d9f3201b73b (patch) | |
tree | ab37a1fe356959134b259a46a78e7ed7c7e10e97 /test/escape2.go | |
parent | 7b8f51188bd24746b7d0a624b2e9979a425745eb (diff) | |
download | go-1e29cd8c2b560825494e6ae079a17d9f3201b73b.tar.gz go-1e29cd8c2b560825494e6ae079a17d9f3201b73b.zip |
cmd/compile: ignore some dead code during escape analysis
This is the escape analysis analog of CL 37499.
Fixes #12397
Fixes #16871
The only "moved to heap" decisions eliminated by this
CL in std+cmd are:
cmd/compile/internal/gc/const.go:1514: moved to heap: ac
cmd/compile/internal/gc/const.go:1515: moved to heap: bd
cmd/compile/internal/gc/const.go:1516: moved to heap: bc
cmd/compile/internal/gc/const.go:1517: moved to heap: ad
cmd/compile/internal/gc/const.go:1546: moved to heap: ac
cmd/compile/internal/gc/const.go:1547: moved to heap: bd
cmd/compile/internal/gc/const.go:1548: moved to heap: bc
cmd/compile/internal/gc/const.go:1549: moved to heap: ad
cmd/compile/internal/gc/const.go:1550: moved to heap: cc_plus
cmd/compile/internal/gc/export.go:162: moved to heap: copy
cmd/compile/internal/gc/mpfloat.go:66: moved to heap: b
cmd/compile/internal/gc/mpfloat.go:97: moved to heap: b
Change-Id: I0d420b69c84a41ba9968c394e8957910bab5edea
Reviewed-on: https://go-review.googlesource.com/37508
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'test/escape2.go')
-rw-r--r-- | test/escape2.go | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/test/escape2.go b/test/escape2.go index 3490c29d3b..e10dbc2acc 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -1824,3 +1824,18 @@ func issue11387(x int) func() int { copy(slice2, slice1) return slice2[0] } + +func issue12397(x, y int) { // ERROR "moved to heap: y$" + // x does not escape below, because all relevant code is dead. + if false { + gxx = &x + } else { + gxx = &y // ERROR "&y escapes to heap$" + } + + if true { + gxx = &y // ERROR "&y escapes to heap$" + } else { + gxx = &x + } +} |