cmd/compile/internal/ssa: erase register copies deterministically

Fixes #17288.

Change-Id: I2ddd01d14667d5c6a2e19bd70489da8d9869d308
Reviewed-on: https://go-review.googlesource.com/30072
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Matthew Dempsky 2016-09-29 15:08:37 -07:00
parent c1e06dcb61
commit 6dc356a76a

View File

@ -1707,14 +1707,24 @@ sinking:
} }
} }
// Erase any copies we never used // Erase any copies we never used.
for c, used := range s.copies { // Also, an unused copy might be the only use of another copy,
if !used && c.Uses == 0 { // so continue erasing until we reach a fixed point.
if s.f.pass.debug > regDebug { for {
fmt.Printf("delete copied value %s\n", c.LongString()) progress := false
for c, used := range s.copies {
if !used && c.Uses == 0 {
if s.f.pass.debug > regDebug {
fmt.Printf("delete copied value %s\n", c.LongString())
}
c.Args[0].Uses--
f.freeValue(c)
delete(s.copies, c)
progress = true
} }
c.Args[0].Uses-- }
f.freeValue(c) if !progress {
break
} }
} }