From 6dc356a76a405ff12c884ab0a4acb2296d1618b7 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 29 Sep 2016 15:08:37 -0700 Subject: [PATCH] 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 Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/regalloc.go | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go index 61d8ddab45..3b9f49d9df 100644 --- a/src/cmd/compile/internal/ssa/regalloc.go +++ b/src/cmd/compile/internal/ssa/regalloc.go @@ -1707,14 +1707,24 @@ sinking: } } - // Erase any copies we never used - 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()) + // Erase any copies we never used. + // Also, an unused copy might be the only use of another copy, + // so continue erasing until we reach a fixed point. + for { + 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 } }