aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2019-04-22 14:22:25 -0700
committerMatthew Dempsky <mdempsky@google.com>2019-04-22 23:03:04 +0000
commite40dffe55ac0ec40fc325bf9ef03dde297fcc2c0 (patch)
tree8f8baed395b277ae532185a3448c73e99c11d464
parentef2806e4abca28e01320e08102915dc130417ada (diff)
downloadgo-e40dffe55ac0ec40fc325bf9ef03dde297fcc2c0.tar.xz
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 <bradfitz@golang.org>
-rw-r--r--src/cmd/compile/internal/gc/scc.go59
1 files changed, 18 insertions, 41 deletions
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
-}