From: Matthew Dempsky Date: Mon, 22 Apr 2019 21:22:25 +0000 (-0700) Subject: cmd/compile: refactor visitBottomUp to use inspectList X-Git-Tag: go1.13beta1~598 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e40dffe55ac0ec40fc325bf9ef03dde297fcc2c0;p=gostls13.git cmd/compile: refactor visitBottomUp to use inspectList Passes toolstash-check. Change-Id: I02efba7bab3ea49d87c8472bbb99116565bf8423 Reviewed-on: https://go-review.googlesource.com/c/go/+/173321 Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/compile/internal/gc/scc.go b/src/cmd/compile/internal/gc/scc.go index fec71953a4..0428a6af8d 100644 --- a/src/cmd/compile/internal/gc/scc.go +++ b/src/cmd/compile/internal/gc/scc.go @@ -71,9 +71,25 @@ func (v *bottomUpVisitor) visit(n *Node) uint32 { v.nodeID[n] = id v.visitgen++ min := v.visitgen - v.stack = append(v.stack, n) - min = v.visitcodelist(n.Nbody, min) + + inspectList(n.Nbody, func(n *Node) bool { + switch n.Op { + case OCALLFUNC, OCALLMETH: + fn := asNode(n.Left.Type.Nname()) + if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { + if m := v.visit(fn.Name.Defn); m < min { + min = m + } + } + case OCLOSURE: + if m := v.visit(n.Func.Closure); m < min { + min = m + } + } + return true + }) + if (min == id || min == id+1) && !n.Func.IsHiddenClosure() { // This node is the root of a strongly connected component. @@ -104,42 +120,3 @@ func (v *bottomUpVisitor) visit(n *Node) uint32 { return min } - -func (v *bottomUpVisitor) visitcodelist(l Nodes, min uint32) uint32 { - for _, n := range l.Slice() { - min = v.visitcode(n, min) - } - return min -} - -func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { - if n == nil { - return min - } - - switch n.Op { - case OCALLFUNC, OCALLMETH: - fn := asNode(n.Left.Type.Nname()) - if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { - m := v.visit(fn.Name.Defn) - if m < min { - min = m - } - } - - case OCLOSURE: - m := v.visit(n.Func.Closure) - if m < min { - min = m - } - } - - min = v.visitcodelist(n.Ninit, min) - min = v.visitcode(n.Left, min) - min = v.visitcode(n.Right, min) - min = v.visitcodelist(n.List, min) - min = v.visitcodelist(n.Nbody, min) - min = v.visitcodelist(n.Rlist, min) - - return min -}