From 8ce37e4110316030159972e17c67152e8f8e9359 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 10 Dec 2020 21:04:41 -0800 Subject: [PATCH] [dev.regabi] cmd/compile: fix noopt builder The non-simple, phi-insertion algorithm can leave OpFwdRefs in the SSA graph unresolved if they're in dead blocks. Normally, these would be harmlessly removed later during SSA dead-code elimination, but those passes are omitted for -N builds. And so they reach zcse, where the Value.Aux is used within a hash map. This became a problem after golang.org/cl/275788, which added FwdRefAux to wrap OpFwdRef's ir.Node, and to ensure that it's not compared for equality / used as a map key. This CL adds a simple fix: if there are any OpFwdRefs remaining after resolveFwdRef, then they must be dead code and we can simply replace them with OpUnknown. Change-Id: I72e4116d52d3f6441ebb0bf6160906617cd59513 Reviewed-on: https://go-review.googlesource.com/c/go/+/277075 Trust: Matthew Dempsky Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/phi.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/compile/internal/gc/phi.go b/src/cmd/compile/internal/gc/phi.go index def11e1be0..32c330b584 100644 --- a/src/cmd/compile/internal/gc/phi.go +++ b/src/cmd/compile/internal/gc/phi.go @@ -188,6 +188,11 @@ levels: if v.Op == ssa.OpPhi { v.AuxInt = 0 } + // Any remaining FwdRefs are dead code. + if v.Op == ssa.OpFwdRef { + v.Op = ssa.OpUnknown + v.Aux = nil + } } } } -- 2.48.1