]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: fix liveness regression
authorMatthew Dempsky <mdempsky@google.com>
Tue, 21 Mar 2017 17:15:14 +0000 (10:15 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 21 Mar 2017 17:46:25 +0000 (17:46 +0000)
During AllocFrame, we drop unused variables from Curfn.Func.Dcl, but
there might still be OpVarFoo instructions that reference those
variables. This wasn't a problem though because gvardefx used to emit
ANOP for unused variables instead of AVARFOO.

As an easy fix, if we see OpVarFoo (or OpKeepAlive) referencing an
unused variable, we can ignore it.

Fixes #19632.

Change-Id: I4e9ffabdb4058f7cdcc4663b540f5a5a692daf8b
Reviewed-on: https://go-review.googlesource.com/38400
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/plive.go

index b3cecdf894cc74fffd6f21539f9bb0150ca38c55..8b8882ac5505368aa5453e09aa3d3a8c5b246aec 100644 (file)
@@ -186,6 +186,17 @@ func (lv *Liveness) valueEffects(v *ssa.Value) (pos int32, effect liveEffect) {
                return -1, 0
        }
 
+       // AllocFrame has dropped unused variables from
+       // lv.fn.Func.Dcl, but they might still be referenced by
+       // OpVarFoo pseudo-ops. Ignore them to prevent "lost track of
+       // variable" ICEs (issue 19632).
+       switch v.Op {
+       case ssa.OpVarDef, ssa.OpVarKill, ssa.OpVarLive, ssa.OpKeepAlive:
+               if !n.Used() {
+                       return -1, 0
+               }
+       }
+
        pos = liveIndex(n, lv.vars)
        if pos < 0 {
                return -1, 0