Commit eb6ee75a authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/compile: convert select, sinit, ssa to nodeSeq

Passes toolstash -cmp.

Update #14473.

Change-Id: I1b50fe981e7a266d4b14f31d849eb91afccdfda3
Reviewed-on: https://go-review.googlesource.com/20270
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent e3a9dca7
This diff is collapsed.
...@@ -30,8 +30,8 @@ func init1(n *Node, out *[]*Node) { ...@@ -30,8 +30,8 @@ func init1(n *Node, out *[]*Node) {
} }
init1(n.Left, out) init1(n.Left, out)
init1(n.Right, out) init1(n.Right, out)
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
init1(l.N, out) init1(it.N(), out)
} }
if n.Left != nil && n.Type != nil && n.Left.Op == OTYPE && n.Class == PFUNC { if n.Left != nil && n.Type != nil && n.Left.Op == OTYPE && n.Class == PFUNC {
...@@ -98,7 +98,7 @@ func init1(n *Node, out *[]*Node) { ...@@ -98,7 +98,7 @@ func init1(n *Node, out *[]*Node) {
Fatalf("init1: bad defn") Fatalf("init1: bad defn")
case ODCLFUNC: case ODCLFUNC:
init2slice(defn.Nbody.Slice(), out) init2list(defn.Nbody, out)
case OAS: case OAS:
if defn.Left != n { if defn.Left != n {
...@@ -128,8 +128,8 @@ func init1(n *Node, out *[]*Node) { ...@@ -128,8 +128,8 @@ func init1(n *Node, out *[]*Node) {
break break
} }
defn.Initorder = InitPending defn.Initorder = InitPending
for l := defn.Rlist; l != nil; l = l.Next { for it := nodeSeqIterate(defn.Rlist); !it.Done(); it.Next() {
init1(l.N, out) init1(it.N(), out)
} }
if Debug['%'] != 0 { if Debug['%'] != 0 {
Dump("nonstatic", defn) Dump("nonstatic", defn)
...@@ -192,7 +192,7 @@ func init2(n *Node, out *[]*Node) { ...@@ -192,7 +192,7 @@ func init2(n *Node, out *[]*Node) {
return return
} }
if n.Op == ONAME && n.Ninit != nil { if n.Op == ONAME && nodeSeqLen(n.Ninit) != 0 {
Fatalf("name %v with ninit: %v\n", n.Sym, Nconv(n, obj.FmtSign)) Fatalf("name %v with ninit: %v\n", n.Sym, Nconv(n, obj.FmtSign))
} }
...@@ -202,40 +202,34 @@ func init2(n *Node, out *[]*Node) { ...@@ -202,40 +202,34 @@ func init2(n *Node, out *[]*Node) {
init2list(n.Ninit, out) init2list(n.Ninit, out)
init2list(n.List, out) init2list(n.List, out)
init2list(n.Rlist, out) init2list(n.Rlist, out)
init2slice(n.Nbody.Slice(), out) init2list(n.Nbody, out)
if n.Op == OCLOSURE { if n.Op == OCLOSURE {
init2slice(n.Func.Closure.Nbody.Slice(), out) init2list(n.Func.Closure.Nbody, out)
} }
if n.Op == ODOTMETH || n.Op == OCALLPART { if n.Op == ODOTMETH || n.Op == OCALLPART {
init2(n.Type.Nname, out) init2(n.Type.Nname, out)
} }
} }
func init2list(l *NodeList, out *[]*Node) { func init2list(l nodesOrNodeList, out *[]*Node) {
for ; l != nil; l = l.Next { for it := nodeSeqIterate(l); !it.Done(); it.Next() {
init2(l.N, out) init2(it.N(), out)
} }
} }
func init2slice(l []*Node, out *[]*Node) { func initreorder(l nodesOrNodeList, out *[]*Node) {
for _, n := range l {
init2(n, out)
}
}
func initreorder(l *NodeList, out *[]*Node) {
var n *Node var n *Node
for ; l != nil; l = l.Next { for it := nodeSeqIterate(l); !it.Done(); it.Next() {
n = l.N n = it.N()
switch n.Op { switch n.Op {
case ODCLFUNC, ODCLCONST, ODCLTYPE: case ODCLFUNC, ODCLCONST, ODCLTYPE:
continue continue
} }
initreorder(n.Ninit, out) initreorder(n.Ninit, out)
n.Ninit = nil setNodeSeq(&n.Ninit, nil)
init1(n, out) init1(n, out)
} }
} }
...@@ -243,7 +237,7 @@ func initreorder(l *NodeList, out *[]*Node) { ...@@ -243,7 +237,7 @@ func initreorder(l *NodeList, out *[]*Node) {
// initfix computes initialization order for a list l of top-level // initfix computes initialization order for a list l of top-level
// declarations and outputs the corresponding list of statements // declarations and outputs the corresponding list of statements
// to include in the init() function body. // to include in the init() function body.
func initfix(l *NodeList) []*Node { func initfix(l nodesOrNodeList) []*Node {
var lout []*Node var lout []*Node
initplans = make(map[*Node]*InitPlan) initplans = make(map[*Node]*InitPlan)
lno := lineno lno := lineno
...@@ -565,8 +559,8 @@ func getdyn(n *Node, top int) int { ...@@ -565,8 +559,8 @@ func getdyn(n *Node, top int) int {
break break
} }
for nl := n.List; nl != nil; nl = nl.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
value := nl.N.Right value := it.N().Right
mode |= getdyn(value, 0) mode |= getdyn(value, 0)
if mode == MODEDYNAM|MODECONST { if mode == MODEDYNAM|MODECONST {
break break
...@@ -577,8 +571,8 @@ func getdyn(n *Node, top int) int { ...@@ -577,8 +571,8 @@ func getdyn(n *Node, top int) int {
} }
func structlit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr) { func structlit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
for nl := n.List; nl != nil; nl = nl.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := nl.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("structlit: rhs not OKEY: %v", r) Fatalf("structlit: rhs not OKEY: %v", r)
} }
...@@ -642,8 +636,8 @@ func structlit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr) ...@@ -642,8 +636,8 @@ func structlit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr)
} }
func arraylit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr) { func arraylit(ctxt int, pass int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := l.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("arraylit: rhs not OKEY: %v", r) Fatalf("arraylit: rhs not OKEY: %v", r)
} }
...@@ -790,7 +784,7 @@ func slicelit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -790,7 +784,7 @@ func slicelit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
a = Nod(OADDR, a, nil) a = Nod(OADDR, a, nil)
} else { } else {
a = Nod(ONEW, nil, nil) a = Nod(ONEW, nil, nil)
a.List = list1(typenod(t)) setNodeSeq(&a.List, []*Node{typenod(t)})
} }
a = Nod(OAS, vauto, a) a = Nod(OAS, vauto, a)
...@@ -817,8 +811,8 @@ func slicelit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -817,8 +811,8 @@ func slicelit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
appendNodeSeqNode(init, a) appendNodeSeqNode(init, a)
// put dynamics into slice (6) // put dynamics into slice (6)
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := l.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("slicelit: rhs not OKEY: %v", r) Fatalf("slicelit: rhs not OKEY: %v", r)
} }
...@@ -864,13 +858,13 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -864,13 +858,13 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
nerr := nerrors nerr := nerrors
a := Nod(OMAKE, nil, nil) a := Nod(OMAKE, nil, nil)
a.List = list1(typenod(n.Type)) setNodeSeq(&a.List, []*Node{typenod(n.Type)})
litas(var_, a, init) litas(var_, a, init)
// count the initializers // count the initializers
b := 0 b := 0
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := l.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("maplit: rhs not OKEY: %v", r) Fatalf("maplit: rhs not OKEY: %v", r)
} }
...@@ -913,8 +907,8 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -913,8 +907,8 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
vstat := staticname(tarr, ctxt) vstat := staticname(tarr, ctxt)
b := int64(0) b := int64(0)
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := l.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("maplit: rhs not OKEY: %v", r) Fatalf("maplit: rhs not OKEY: %v", r)
...@@ -971,7 +965,7 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -971,7 +965,7 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
a = Nod(OFOR, nil, nil) a = Nod(OFOR, nil, nil)
a.Nbody.Set([]*Node{r}) a.Nbody.Set([]*Node{r})
a.Ninit = list1(Nod(OAS, index, Nodintconst(0))) setNodeSeq(&a.Ninit, []*Node{Nod(OAS, index, Nodintconst(0))})
a.Left = Nod(OLT, index, Nodintconst(tarr.Bound)) a.Left = Nod(OLT, index, Nodintconst(tarr.Bound))
a.Right = Nod(OAS, index, Nod(OADD, index, Nodintconst(1))) a.Right = Nod(OAS, index, Nod(OADD, index, Nodintconst(1)))
...@@ -982,8 +976,8 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -982,8 +976,8 @@ func maplit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
// put in dynamic entries one-at-a-time // put in dynamic entries one-at-a-time
var key, val *Node var key, val *Node
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
r := l.N r := it.N()
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("maplit: rhs not OKEY: %v", r) Fatalf("maplit: rhs not OKEY: %v", r)
...@@ -1071,7 +1065,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -1071,7 +1065,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
Fatalf("anylit: not struct") Fatalf("anylit: not struct")
} }
if simplename(var_) && count(n.List) > 4 { if simplename(var_) && nodeSeqLen(n.List) > 4 {
if ctxt == 0 { if ctxt == 0 {
// lay out static data // lay out static data
vstat := staticname(t, ctxt) vstat := staticname(t, ctxt)
...@@ -1097,7 +1091,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -1097,7 +1091,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
} }
// initialize of not completely specified // initialize of not completely specified
if simplename(var_) || count(n.List) < structcount(t) { if simplename(var_) || nodeSeqLen(n.List) < structcount(t) {
a := Nod(OAS, var_, nil) a := Nod(OAS, var_, nil)
typecheck(&a, Etop) typecheck(&a, Etop)
walkexpr(&a, init) walkexpr(&a, init)
...@@ -1115,7 +1109,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -1115,7 +1109,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
break break
} }
if simplename(var_) && count(n.List) > 4 { if simplename(var_) && nodeSeqLen(n.List) > 4 {
if ctxt == 0 { if ctxt == 0 {
// lay out static data // lay out static data
vstat := staticname(t, ctxt) vstat := staticname(t, ctxt)
...@@ -1141,7 +1135,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) { ...@@ -1141,7 +1135,7 @@ func anylit(ctxt int, n *Node, var_ *Node, init nodesOrNodeListPtr) {
} }
// initialize of not completely specified // initialize of not completely specified
if simplename(var_) || int64(count(n.List)) < t.Bound { if simplename(var_) || int64(nodeSeqLen(n.List)) < t.Bound {
a := Nod(OAS, var_, nil) a := Nod(OAS, var_, nil)
typecheck(&a, Etop) typecheck(&a, Etop)
walkexpr(&a, init) walkexpr(&a, init)
...@@ -1263,8 +1257,8 @@ func initplan(n *Node) { ...@@ -1263,8 +1257,8 @@ func initplan(n *Node) {
Fatalf("initplan") Fatalf("initplan")
case OARRAYLIT: case OARRAYLIT:
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
a := l.N a := it.N()
if a.Op != OKEY || !Smallintconst(a.Left) { if a.Op != OKEY || !Smallintconst(a.Left) {
Fatalf("initplan arraylit") Fatalf("initplan arraylit")
} }
...@@ -1272,8 +1266,8 @@ func initplan(n *Node) { ...@@ -1272,8 +1266,8 @@ func initplan(n *Node) {
} }
case OSTRUCTLIT: case OSTRUCTLIT:
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
a := l.N a := it.N()
if a.Op != OKEY || a.Left.Type == nil { if a.Op != OKEY || a.Left.Type == nil {
Fatalf("initplan structlit") Fatalf("initplan structlit")
} }
...@@ -1281,8 +1275,8 @@ func initplan(n *Node) { ...@@ -1281,8 +1275,8 @@ func initplan(n *Node) {
} }
case OMAPLIT: case OMAPLIT:
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
a := l.N a := it.N()
if a.Op != OKEY { if a.Op != OKEY {
Fatalf("initplan maplit") Fatalf("initplan maplit")
} }
...@@ -1357,8 +1351,8 @@ func iszero(n *Node) bool { ...@@ -1357,8 +1351,8 @@ func iszero(n *Node) bool {
// fall through // fall through
case OSTRUCTLIT: case OSTRUCTLIT:
for l := n.List; l != nil; l = l.Next { for it := nodeSeqIterate(n.List); !it.Done(); it.Next() {
if !iszero(l.N.Right) { if !iszero(it.N().Right) {
return false return false
} }
} }
......
...@@ -504,9 +504,9 @@ func (s *state) stmts(a Nodes) { ...@@ -504,9 +504,9 @@ func (s *state) stmts(a Nodes) {
} }
// ssaStmtList converts the statement n to SSA and adds it to s. // ssaStmtList converts the statement n to SSA and adds it to s.
func (s *state) stmtList(l *NodeList) { func (s *state) stmtList(l nodesOrNodeList) {
for ; l != nil; l = l.Next { for it := nodeSeqIterate(l); !it.Done(); it.Next() {
s.stmt(l.N) s.stmt(it.N())
} }
} }
...@@ -554,9 +554,9 @@ func (s *state) stmt(n *Node) { ...@@ -554,9 +554,9 @@ func (s *state) stmt(n *Node) {
s.call(n.Left, callGo) s.call(n.Left, callGo)
case OAS2DOTTYPE: case OAS2DOTTYPE:
res, resok := s.dottype(n.Rlist.N, true) res, resok := s.dottype(nodeSeqFirst(n.Rlist), true)
s.assign(n.List.N, res, needwritebarrier(n.List.N, n.Rlist.N), false, n.Lineno) s.assign(nodeSeqFirst(n.List), res, needwritebarrier(nodeSeqFirst(n.List), nodeSeqFirst(n.Rlist)), false, n.Lineno)
s.assign(n.List.Next.N, resok, false, false, n.Lineno) s.assign(nodeSeqSecond(n.List), resok, false, false, n.Lineno)
return return
case ODCL: case ODCL:
...@@ -697,7 +697,7 @@ func (s *state) stmt(n *Node) { ...@@ -697,7 +697,7 @@ func (s *state) stmt(n *Node) {
bThen := s.f.NewBlock(ssa.BlockPlain) bThen := s.f.NewBlock(ssa.BlockPlain)
bEnd := s.f.NewBlock(ssa.BlockPlain) bEnd := s.f.NewBlock(ssa.BlockPlain)
var bElse *ssa.Block var bElse *ssa.Block
if n.Rlist != nil { if nodeSeqLen(n.Rlist) != 0 {
bElse = s.f.NewBlock(ssa.BlockPlain) bElse = s.f.NewBlock(ssa.BlockPlain)
s.condBranch(n.Left, bThen, bElse, n.Likely) s.condBranch(n.Left, bThen, bElse, n.Likely)
} else { } else {
...@@ -710,7 +710,7 @@ func (s *state) stmt(n *Node) { ...@@ -710,7 +710,7 @@ func (s *state) stmt(n *Node) {
b.AddEdgeTo(bEnd) b.AddEdgeTo(bEnd)
} }
if n.Rlist != nil { if nodeSeqLen(n.Rlist) != 0 {
s.startBlock(bElse) s.startBlock(bElse)
s.stmtList(n.Rlist) s.stmtList(n.Rlist)
if b := s.endBlock(); b != nil { if b := s.endBlock(); b != nil {
...@@ -2013,14 +2013,14 @@ func (s *state) expr(n *Node) *ssa.Value { ...@@ -2013,14 +2013,14 @@ func (s *state) expr(n *Node) *ssa.Value {
pt := Ptrto(et) pt := Ptrto(et)
// Evaluate slice // Evaluate slice
slice := s.expr(n.List.N) slice := s.expr(nodeSeqFirst(n.List))
// Allocate new blocks // Allocate new blocks
grow := s.f.NewBlock(ssa.BlockPlain) grow := s.f.NewBlock(ssa.BlockPlain)
assign := s.f.NewBlock(ssa.BlockPlain) assign := s.f.NewBlock(ssa.BlockPlain)
// Decide if we need to grow // Decide if we need to grow
nargs := int64(count(n.List) - 1) nargs := int64(nodeSeqLen(n.List) - 1)
p := s.newValue1(ssa.OpSlicePtr, pt, slice) p := s.newValue1(ssa.OpSlicePtr, pt, slice)
l := s.newValue1(ssa.OpSliceLen, Types[TINT], slice) l := s.newValue1(ssa.OpSliceLen, Types[TINT], slice)
c := s.newValue1(ssa.OpSliceCap, Types[TINT], slice) c := s.newValue1(ssa.OpSliceCap, Types[TINT], slice)
...@@ -2054,12 +2054,14 @@ func (s *state) expr(n *Node) *ssa.Value { ...@@ -2054,12 +2054,14 @@ func (s *state) expr(n *Node) *ssa.Value {
// Evaluate args // Evaluate args
args := make([]*ssa.Value, 0, nargs) args := make([]*ssa.Value, 0, nargs)
store := make([]bool, 0, nargs) store := make([]bool, 0, nargs)
for l := n.List.Next; l != nil; l = l.Next { it := nodeSeqIterate(n.List)
if canSSAType(l.N.Type) { it.Next()
args = append(args, s.expr(l.N)) for ; !it.Done(); it.Next() {
if canSSAType(it.N().Type) {
args = append(args, s.expr(it.N()))
store = append(store, true) store = append(store, true)
} else { } else {
args = append(args, s.addr(l.N, false)) args = append(args, s.addr(it.N(), false))
store = append(store, false) store = append(store, false)
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment