cmd/compile: remove Node.Nincr, Node.Nelse, Node.Initplan

$ sizeof -p cmd/compile/internal/gc Node
Node 288
$

Change-Id: I4e316efa246132b3faa3a892e4fe9c9039250665
Reviewed-on: https://go-review.googlesource.com/10520
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go
index 2c13493..879bbf0 100644
--- a/src/cmd/compile/internal/gc/esc.go
+++ b/src/cmd/compile/internal/gc/esc.go
@@ -135,9 +135,7 @@
 	min = v.visitcode(n.Right, min)
 	min = v.visitcodelist(n.List, min)
 	min = v.visitcode(n.Ntest, min)
-	min = v.visitcode(n.Nincr, min)
 	min = v.visitcodelist(n.Nbody, min)
-	min = v.visitcodelist(n.Nelse, min)
 	min = v.visitcodelist(n.Rlist, min)
 
 	if n.Op == OCALLFUNC || n.Op == OCALLMETH {
@@ -546,9 +544,7 @@
 	escloopdepth(e, n.Right)
 	escloopdepthlist(e, n.List)
 	escloopdepth(e, n.Ntest)
-	escloopdepth(e, n.Nincr)
 	escloopdepthlist(e, n.Nbody)
-	escloopdepthlist(e, n.Nelse)
 	escloopdepthlist(e, n.Rlist)
 }
 
@@ -602,9 +598,7 @@
 	esc(e, n.Left, n)
 	esc(e, n.Right, n)
 	esc(e, n.Ntest, n)
-	esc(e, n.Nincr, n)
 	esclist(e, n.Nbody, n)
-	esclist(e, n.Nelse, n)
 	esclist(e, n.List, n)
 	esclist(e, n.Rlist, n)
 
diff --git a/src/cmd/compile/internal/gc/export.go b/src/cmd/compile/internal/gc/export.go
index 5117490..b5a9518 100644
--- a/src/cmd/compile/internal/gc/export.go
+++ b/src/cmd/compile/internal/gc/export.go
@@ -203,9 +203,7 @@
 	reexportdeplist(n.Rlist)
 	reexportdeplist(n.Ninit)
 	reexportdep(n.Ntest)
-	reexportdep(n.Nincr)
 	reexportdeplist(n.Nbody)
-	reexportdeplist(n.Nelse)
 }
 
 func dumpexportconst(s *Sym) {
diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go
index 4b93363..f4be881 100644
--- a/src/cmd/compile/internal/gc/fmt.go
+++ b/src/cmd/compile/internal/gc/fmt.go
@@ -867,8 +867,8 @@
 		} else {
 			f += fmt.Sprintf("if %v { %v }", n.Ntest, n.Nbody)
 		}
-		if n.Nelse != nil {
-			f += fmt.Sprintf(" else { %v }", n.Nelse)
+		if n.Rlist != nil {
+			f += fmt.Sprintf(" else { %v }", n.Rlist)
 		}
 
 	case OFOR:
@@ -880,7 +880,7 @@
 		f += "for"
 		if simpleinit {
 			f += fmt.Sprintf(" %v;", n.Ninit.N)
-		} else if n.Nincr != nil {
+		} else if n.Right != nil {
 			f += " ;"
 		}
 
@@ -888,8 +888,8 @@
 			f += fmt.Sprintf(" %v", n.Ntest)
 		}
 
-		if n.Nincr != nil {
-			f += fmt.Sprintf("; %v", n.Nincr)
+		if n.Right != nil {
+			f += fmt.Sprintf("; %v", n.Right)
 		} else if simpleinit {
 			f += ";"
 		}
@@ -1571,16 +1571,6 @@
 			indent(&buf)
 			fmt.Fprintf(&buf, "%v-body%v", Oconv(int(n.Op), 0), n.Nbody)
 		}
-
-		if n.Nelse != nil {
-			indent(&buf)
-			fmt.Fprintf(&buf, "%v-else%v", Oconv(int(n.Op), 0), n.Nelse)
-		}
-
-		if n.Nincr != nil {
-			indent(&buf)
-			fmt.Fprintf(&buf, "%v-incr%v", Oconv(int(n.Op), 0), n.Nincr)
-		}
 	}
 
 	return buf.String()
diff --git a/src/cmd/compile/internal/gc/gen.go b/src/cmd/compile/internal/gc/gen.go
index c0dd996..ac436f0 100644
--- a/src/cmd/compile/internal/gc/gen.go
+++ b/src/cmd/compile/internal/gc/gen.go
@@ -788,7 +788,7 @@
 			lab.Continpc = continpc
 		}
 
-		gen(n.Nincr)                      // contin:	incr
+		gen(n.Right)                      // contin:	incr
 		Patch(p1, Pc)                     // test:
 		Bgen(n.Ntest, false, -1, breakpc) //		if(!test) goto break
 		Genlist(n.Nbody)                  //		body
@@ -809,7 +809,7 @@
 		Genlist(n.Nbody)                         //		then
 		p3 := gjmp(nil)                          //		goto done
 		Patch(p2, Pc)                            // else:
-		Genlist(n.Nelse)                         //		else
+		Genlist(n.Rlist)                         //		else
 		Patch(p3, Pc)                            // done:
 
 	case OSWITCH:
diff --git a/src/cmd/compile/internal/gc/go.y b/src/cmd/compile/internal/gc/go.y
index ae2e761..d0bc638 100644
--- a/src/cmd/compile/internal/gc/go.y
+++ b/src/cmd/compile/internal/gc/go.y
@@ -701,7 +701,7 @@
 			$$.Ninit = list1($1);
 		}
 		$$.Ntest = $3;
-		$$.Nincr = $5;
+		$$.Right = $5;
 	}
 |	osimple_stmt
 	{
@@ -774,7 +774,7 @@
 			if nn.N.Op == OIF {
 				popdcl();
 			}
-			n.Nelse = list1(nn.N);
+			n.Rlist = list1(nn.N);
 			n = nn.N;
 		}
 	}
diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go
index 22a5d3d..3c5f086 100644
--- a/src/cmd/compile/internal/gc/inl.go
+++ b/src/cmd/compile/internal/gc/inl.go
@@ -231,7 +231,7 @@
 
 	(*budget)--
 
-	return *budget < 0 || ishairy(n.Left, budget) || ishairy(n.Right, budget) || ishairylist(n.List, budget) || ishairylist(n.Rlist, budget) || ishairylist(n.Ninit, budget) || ishairy(n.Ntest, budget) || ishairy(n.Nincr, budget) || ishairylist(n.Nbody, budget) || ishairylist(n.Nelse, budget)
+	return *budget < 0 || ishairy(n.Left, budget) || ishairy(n.Right, budget) || ishairylist(n.List, budget) || ishairylist(n.Rlist, budget) || ishairylist(n.Ninit, budget) || ishairy(n.Ntest, budget) || ishairylist(n.Nbody, budget)
 }
 
 // Inlcopy and inlcopylist recursively copy the body of a function.
@@ -266,9 +266,7 @@
 	m.Rlist = inlcopylist(n.Rlist)
 	m.Ninit = inlcopylist(n.Ninit)
 	m.Ntest = inlcopy(n.Ntest)
-	m.Nincr = inlcopy(n.Nincr)
 	m.Nbody = inlcopylist(n.Nbody)
-	m.Nelse = inlcopylist(n.Nelse)
 
 	return m
 }
@@ -374,7 +372,11 @@
 
 	inlnode(&n.Right)
 	if n.Right != nil && n.Right.Op == OINLCALL {
-		inlconv2expr(&n.Right)
+		if n.Op == OFOR {
+			inlconv2stmt(n.Right)
+		} else {
+			inlconv2expr(&n.Right)
+		}
 	}
 
 	inlnodelist(n.List)
@@ -423,7 +425,11 @@
 	default:
 		for l := n.Rlist; l != nil; l = l.Next {
 			if l.N.Op == OINLCALL {
-				inlconv2expr(&l.N)
+				if n.Op == OIF {
+					inlconv2stmt(l.N)
+				} else {
+					inlconv2expr(&l.N)
+				}
 			}
 		}
 	}
@@ -433,11 +439,6 @@
 		inlconv2expr(&n.Ntest)
 	}
 
-	inlnode(&n.Nincr)
-	if n.Nincr != nil && n.Nincr.Op == OINLCALL {
-		inlconv2stmt(n.Nincr)
-	}
-
 	inlnodelist(n.Nbody)
 	for l := n.Nbody; l != nil; l = l.Next {
 		if l.N.Op == OINLCALL {
@@ -445,13 +446,6 @@
 		}
 	}
 
-	inlnodelist(n.Nelse)
-	for l := n.Nelse; l != nil; l = l.Next {
-		if l.N.Op == OINLCALL {
-			inlconv2stmt(l.N)
-		}
-	}
-
 	// with all the branches out of the way, it is now time to
 	// transmogrify this node itself unless inhibited by the
 	// switch at the top of this function.
@@ -972,9 +966,7 @@
 	m.Rlist = inlsubstlist(n.Rlist)
 	m.Ninit = concat(m.Ninit, inlsubstlist(n.Ninit))
 	m.Ntest = inlsubst(n.Ntest)
-	m.Nincr = inlsubst(n.Nincr)
 	m.Nbody = inlsubstlist(n.Nbody)
-	m.Nelse = inlsubstlist(n.Nelse)
 
 	return m
 }
@@ -1002,7 +994,5 @@
 	setlnolist(n.Rlist, lno)
 	setlnolist(n.Ninit, lno)
 	setlno(n.Ntest, lno)
-	setlno(n.Nincr, lno)
 	setlnolist(n.Nbody, lno)
-	setlnolist(n.Nelse, lno)
 }
diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go
index ee0ec52..7a4a84d 100644
--- a/src/cmd/compile/internal/gc/order.go
+++ b/src/cmd/compile/internal/gc/order.go
@@ -651,7 +651,7 @@
 		cleantempnopop(t, order, &l)
 		n.Nbody = concat(l, n.Nbody)
 		orderblock(&n.Nbody)
-		orderstmtinplace(&n.Nincr)
+		orderstmtinplace(&n.Right)
 		order.out = list(order.out, n)
 		cleantemp(t, order)
 
@@ -666,10 +666,10 @@
 		n.Nbody = concat(l, n.Nbody)
 		l = nil
 		cleantempnopop(t, order, &l)
-		n.Nelse = concat(l, n.Nelse)
+		n.Rlist = concat(l, n.Rlist)
 		poptemp(t, order)
 		orderblock(&n.Nbody)
-		orderblock(&n.Nelse)
+		orderblock(&n.Rlist)
 		order.out = list(order.out, n)
 
 		// Special: argument will be converted to interface using convT2E
diff --git a/src/cmd/compile/internal/gc/racewalk.go b/src/cmd/compile/internal/gc/racewalk.go
index 05a902e..e35054c 100644
--- a/src/cmd/compile/internal/gc/racewalk.go
+++ b/src/cmd/compile/internal/gc/racewalk.go
@@ -372,8 +372,13 @@
 		goto ret
 
 		// just do generic traversal
-	case OFOR,
-		OIF,
+	case OFOR:
+		if n.Right != nil {
+			racewalknode(&n.Right, &n.Right.Ninit, 0, 0)
+		}
+		goto ret
+
+	case OIF,
 		OCALLMETH,
 		ORETURN,
 		ORETJMP,
@@ -413,11 +418,7 @@
 	if n.Ntest != nil {
 		racewalknode(&n.Ntest, &n.Ntest.Ninit, 0, 0)
 	}
-	if n.Nincr != nil {
-		racewalknode(&n.Nincr, &n.Nincr.Ninit, 0, 0)
-	}
 	racewalklist(n.Nbody, nil)
-	racewalklist(n.Nelse, nil)
 	racewalklist(n.Rlist, nil)
 	*np = n
 }
@@ -577,9 +578,7 @@
 	foreachnode(n.Right, f, c)
 	foreachlist(n.List, f, c)
 	foreachnode(n.Ntest, f, c)
-	foreachnode(n.Nincr, f, c)
 	foreachlist(n.Nbody, f, c)
-	foreachlist(n.Nelse, f, c)
 	foreachlist(n.Rlist, f, c)
 }
 
diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go
index 03beb1c..1036cf9 100644
--- a/src/cmd/compile/internal/gc/range.go
+++ b/src/cmd/compile/internal/gc/range.go
@@ -146,6 +146,7 @@
 
 	a := n.Right
 	lno := int(setlineno(a))
+	n.Right = nil
 
 	var v1 *Node
 	if n.List != nil {
@@ -201,7 +202,6 @@
 
 															n.Nbody = nil
 															n.Ntest = Nod(ONE, Nod(OLEN, a, nil), Nodintconst(0))
-															n.Nincr = nil
 
 															// hp = &a[0]
 															hp := temp(Ptrto(Types[TUINT8]))
@@ -267,7 +267,7 @@
 		}
 
 		n.Ntest = Nod(OLT, hv1, hn)
-		n.Nincr = Nod(OAS, hv1, Nod(OADD, hv1, Nodintconst(1)))
+		n.Right = Nod(OAS, hv1, Nod(OADD, hv1, Nodintconst(1)))
 		if v1 == nil {
 			body = nil
 		} else if v2 == nil {
@@ -294,7 +294,7 @@
 			tmp.Right.Typecheck = 1
 			a = Nod(OAS, hp, tmp)
 			typecheck(&a, Etop)
-			n.Nincr.Ninit = list1(a)
+			n.Right.Ninit = list1(a)
 		}
 
 		// orderstmt allocated the iterator for us.
@@ -317,7 +317,7 @@
 
 		fn = syslook("mapiternext", 1)
 		substArgTypes(fn, th)
-		n.Nincr = mkcall1(fn, nil, nil, Nod(OADDR, hit, nil))
+		n.Right = mkcall1(fn, nil, nil, Nod(OADDR, hit, nil))
 
 		key := Nod(ODOT, hit, keyname)
 		key = Nod(OIND, key, nil)
@@ -397,7 +397,7 @@
 	n.Ninit = concat(n.Ninit, init)
 	typechecklist(n.Ntest.Ninit, Etop)
 	typecheck(&n.Ntest, Erv)
-	typecheck(&n.Nincr, Etop)
+	typecheck(&n.Right, Etop)
 	typechecklist(body, Etop)
 	n.Nbody = concat(body, n.Nbody)
 	walkstmt(&n)
diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go
index 3a28ea3..f5911c4 100644
--- a/src/cmd/compile/internal/gc/select.go
+++ b/src/cmd/compile/internal/gc/select.go
@@ -247,7 +247,7 @@
 
 		typecheck(&r.Ntest, Erv)
 		r.Nbody = cas.Nbody
-		r.Nelse = concat(dflt.Ninit, dflt.Nbody)
+		r.Rlist = concat(dflt.Ninit, dflt.Nbody)
 		sel.Nbody = list1(r)
 		goto out
 	}
diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go
index b5427a3..55359df 100644
--- a/src/cmd/compile/internal/gc/sinit.go
+++ b/src/cmd/compile/internal/gc/sinit.go
@@ -19,6 +19,7 @@
 )
 
 var initlist *NodeList
+var initplans = make(map[*Node]*InitPlan)
 
 // init1 walks the AST starting at n, and accumulates in out
 // the list of definitions needing init code in dependency order.
@@ -218,7 +219,6 @@
 	init2list(n.List, out)
 	init2list(n.Rlist, out)
 	init2list(n.Nbody, out)
-	init2list(n.Nelse, out)
 
 	if n.Op == OCLOSURE {
 		init2list(n.Param.Closure.Nbody, out)
@@ -351,7 +351,7 @@
 
 		// fall through
 	case OSTRUCTLIT:
-		p := r.Initplan
+		p := initplans[r]
 
 		n1 := *l
 		var e *InitEntry
@@ -469,7 +469,7 @@
 	case OSTRUCTLIT:
 		initplan(r)
 
-		p := r.Initplan
+		p := initplans[r]
 		n1 = *l
 		var e *InitEntry
 		var a *Node
@@ -997,7 +997,7 @@
 
 		a.Ninit = list1(Nod(OAS, index, Nodintconst(0)))
 		a.Ntest = Nod(OLT, index, Nodintconst(t.Bound))
-		a.Nincr = Nod(OAS, index, Nod(OADD, index, Nodintconst(1)))
+		a.Right = Nod(OAS, index, Nod(OADD, index, Nodintconst(1)))
 
 		typecheck(&a, Etop)
 		walkstmt(&a)
@@ -1274,11 +1274,11 @@
 }
 
 func initplan(n *Node) {
-	if n.Initplan != nil {
+	if initplans[n] != nil {
 		return
 	}
 	p := new(InitPlan)
-	n.Initplan = p
+	initplans[n] = p
 	switch n.Op {
 	default:
 		Fatal("initplan")
@@ -1325,7 +1325,7 @@
 	// special case: inline struct and array (not slice) literals
 	if isvaluelit(n) {
 		initplan(n)
-		q := n.Initplan
+		q := initplans[n]
 		var e *InitEntry
 		for i := 0; i < len(q.E); i++ {
 			e = entry(p)
diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go
index 221b1f4..2f6833af 100644
--- a/src/cmd/compile/internal/gc/swt.go
+++ b/src/cmd/compile/internal/gc/swt.go
@@ -326,7 +326,7 @@
 	}
 	typecheck(&a.Ntest, Erv)
 	a.Nbody = list1(s.walkCases(cc[:half]))
-	a.Nelse = list1(s.walkCases(cc[half:]))
+	a.Rlist = list1(s.walkCases(cc[half:]))
 	return a
 }
 
@@ -688,7 +688,7 @@
 	a.Ntest = Nod(OLE, s.hashname, Nodintconst(int64(cc[half-1].hash)))
 	typecheck(&a.Ntest, Erv)
 	a.Nbody = list1(s.walkCases(cc[:half]))
-	a.Nelse = list1(s.walkCases(cc[half:]))
+	a.Rlist = list1(s.walkCases(cc[half:]))
 	return a
 }
 
diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go
index be43076..21f43c0 100644
--- a/src/cmd/compile/internal/gc/syntax.go
+++ b/src/cmd/compile/internal/gc/syntax.go
@@ -16,10 +16,8 @@
 	Left  *Node
 	Right *Node
 	Ntest *Node
-	Nincr *Node
 	Ninit *NodeList
 	Nbody *NodeList
-	Nelse *NodeList
 	List  *NodeList
 	Rlist *NodeList
 
@@ -44,7 +42,6 @@
 	Pkg *Pkg
 
 	// OARRAYLIT, OMAPLIT, OSTRUCTLIT.
-	Initplan *InitPlan
 
 	// Escape analysis.
 	Escflowsrc *NodeList // flow(this, src)
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index 2900da8..2d3ef07 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -237,7 +237,7 @@
 		return true
 	}
 
-	return callrecv(n.Left) || callrecv(n.Right) || callrecv(n.Ntest) || callrecv(n.Nincr) || callrecvlist(n.Ninit) || callrecvlist(n.Nbody) || callrecvlist(n.Nelse) || callrecvlist(n.List) || callrecvlist(n.Rlist)
+	return callrecv(n.Left) || callrecv(n.Right) || callrecv(n.Ntest) || callrecvlist(n.Ninit) || callrecvlist(n.Nbody) || callrecvlist(n.List) || callrecvlist(n.Rlist)
 }
 
 func callrecvlist(l *NodeList) bool {
@@ -2104,7 +2104,7 @@
 				Yyerror("non-bool %v used as for condition", Nconv(n.Ntest, obj.FmtLong))
 			}
 		}
-		typecheck(&n.Nincr, Etop)
+		typecheck(&n.Right, Etop)
 		typechecklist(n.Nbody, Etop)
 		decldepth--
 		break OpSwitch
@@ -2120,7 +2120,7 @@
 			}
 		}
 		typechecklist(n.Nbody, Etop)
-		typechecklist(n.Nelse, Etop)
+		typechecklist(n.Rlist, Etop)
 		break OpSwitch
 
 	case ORETURN:
@@ -3953,10 +3953,8 @@
 
 		markbreak(n.Right, implicit)
 		markbreak(n.Ntest, implicit)
-		markbreak(n.Nincr, implicit)
 		markbreaklist(n.Ninit, implicit)
 		markbreaklist(n.Nbody, implicit)
-		markbreaklist(n.Nelse, implicit)
 		markbreaklist(n.List, implicit)
 		markbreaklist(n.Rlist, implicit)
 	}
@@ -4035,7 +4033,7 @@
 		return true
 
 	case OIF:
-		return isterminating(n.Nbody, 0) && isterminating(n.Nelse, 0)
+		return isterminating(n.Nbody, 0) && isterminating(n.Rlist, 0)
 
 	case OSWITCH, OTYPESW, OSELECT:
 		if n.Hasbreak {
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index d5eb44c..5b3d585 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -255,13 +255,13 @@
 			addinit(&n.Ntest, init)
 		}
 
-		walkstmt(&n.Nincr)
+		walkstmt(&n.Right)
 		walkstmtlist(n.Nbody)
 
 	case OIF:
 		walkexpr(&n.Ntest, &n.Ninit)
 		walkstmtlist(n.Nbody)
-		walkstmtlist(n.Nelse)
+		walkstmtlist(n.Rlist)
 
 	case OPROC:
 		switch n.Left.Op {
@@ -3982,7 +3982,7 @@
 		return false
 	}
 
-	if !candiscard(n.Left) || !candiscard(n.Right) || !candiscard(n.Ntest) || !candiscard(n.Nincr) || !candiscardlist(n.Ninit) || !candiscardlist(n.Nbody) || !candiscardlist(n.Nelse) || !candiscardlist(n.List) || !candiscardlist(n.Rlist) {
+	if !candiscard(n.Left) || !candiscard(n.Right) || !candiscard(n.Ntest) || !candiscardlist(n.Ninit) || !candiscardlist(n.Nbody) || !candiscardlist(n.List) || !candiscardlist(n.Rlist) {
 		return false
 	}
 
diff --git a/src/cmd/compile/internal/gc/y.go b/src/cmd/compile/internal/gc/y.go
index 56b9d04..c412d11 100644
--- a/src/cmd/compile/internal/gc/y.go
+++ b/src/cmd/compile/internal/gc/y.go
@@ -1789,7 +1789,7 @@
 				yyVAL.node.Ninit = list1(yyDollar[1].node)
 			}
 			yyVAL.node.Ntest = yyDollar[3].node
-			yyVAL.node.Nincr = yyDollar[5].node
+			yyVAL.node.Right = yyDollar[5].node
 		}
 	case 71:
 		yyDollar = yyS[yypt-1 : yypt+1]
@@ -1872,7 +1872,7 @@
 				if nn.N.Op == OIF {
 					popdcl()
 				}
-				n.Nelse = list1(nn.N)
+				n.Rlist = list1(nn.N)
 				n = nn.N
 			}
 		}