mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: change Node.Nbody, Func.Inl from *NodeList to Nodes
Passes toolstash -cmp. Casual timings show about a 3% improvement in compile times. Update #14473. Change-Id: I584add2e8f1a52486ba418b25ba6122b7347b643 Reviewed-on: https://go-review.googlesource.com/19989 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
75cc05fa55
commit
1d5001afef
24 changed files with 525 additions and 327 deletions
|
|
@ -181,7 +181,7 @@ func typecheckswitch(n *Node) {
|
|||
}
|
||||
}
|
||||
|
||||
typechecklist(ncase.Nbody, Etop)
|
||||
typecheckslice(ncase.Nbody.Slice(), Etop)
|
||||
}
|
||||
|
||||
lineno = int32(lno)
|
||||
|
|
@ -230,7 +230,7 @@ func (s *exprSwitch) walk(sw *Node) {
|
|||
}
|
||||
|
||||
// convert the switch into OIF statements
|
||||
var cas *NodeList
|
||||
var cas []*Node
|
||||
if s.kind == switchKindTrue || s.kind == switchKindFalse {
|
||||
s.exprname = Nodbool(s.kind == switchKindTrue)
|
||||
} else if consttype(cond) >= 0 {
|
||||
|
|
@ -238,8 +238,8 @@ func (s *exprSwitch) walk(sw *Node) {
|
|||
s.exprname = cond
|
||||
} else {
|
||||
s.exprname = temp(cond.Type)
|
||||
cas = list1(Nod(OAS, s.exprname, cond))
|
||||
typechecklist(cas, Etop)
|
||||
cas = []*Node{Nod(OAS, s.exprname, cond)}
|
||||
typecheckslice(cas, Etop)
|
||||
}
|
||||
|
||||
// enumerate the cases, and lop off the default case
|
||||
|
|
@ -258,7 +258,7 @@ func (s *exprSwitch) walk(sw *Node) {
|
|||
// deal with expressions one at a time
|
||||
if !okforcmp[t.Etype] || cc[0].typ != caseKindExprConst {
|
||||
a := s.walkCases(cc[:1])
|
||||
cas = list(cas, a)
|
||||
cas = append(cas, a)
|
||||
cc = cc[1:]
|
||||
continue
|
||||
}
|
||||
|
|
@ -271,15 +271,15 @@ func (s *exprSwitch) walk(sw *Node) {
|
|||
// sort and compile constants
|
||||
sort.Sort(caseClauseByExpr(cc[:run]))
|
||||
a := s.walkCases(cc[:run])
|
||||
cas = list(cas, a)
|
||||
cas = append(cas, a)
|
||||
cc = cc[run:]
|
||||
}
|
||||
|
||||
// handle default case
|
||||
if nerrors == 0 {
|
||||
cas = list(cas, def)
|
||||
sw.Nbody = concat(cas, sw.Nbody)
|
||||
walkstmtlist(sw.Nbody)
|
||||
cas = append(cas, def)
|
||||
sw.Nbody.Set(append(cas, sw.Nbody.Slice()...))
|
||||
walkstmtslice(sw.Nbody.Slice())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -303,7 +303,7 @@ func (s *exprSwitch) walkCases(cc []*caseClause) *Node {
|
|||
a.Left = Nod(ONOT, n.Left, nil) // if !val
|
||||
typecheck(&a.Left, Erv)
|
||||
}
|
||||
a.Nbody = list1(n.Right) // goto l
|
||||
a.Nbody.Set([]*Node{n.Right}) // goto l
|
||||
|
||||
cas = list(cas, a)
|
||||
lineno = int32(lno)
|
||||
|
|
@ -325,7 +325,7 @@ func (s *exprSwitch) walkCases(cc []*caseClause) *Node {
|
|||
a.Left = le
|
||||
}
|
||||
typecheck(&a.Left, Erv)
|
||||
a.Nbody = list1(s.walkCases(cc[:half]))
|
||||
a.Nbody.Set([]*Node{s.walkCases(cc[:half])})
|
||||
a.Rlist = list1(s.walkCases(cc[half:]))
|
||||
return a
|
||||
}
|
||||
|
|
@ -340,9 +340,9 @@ func casebody(sw *Node, typeswvar *Node) {
|
|||
|
||||
lno := setlineno(sw)
|
||||
|
||||
var cas *NodeList // cases
|
||||
var stat *NodeList // statements
|
||||
var def *Node // defaults
|
||||
var cas *NodeList // cases
|
||||
var stat []*Node // statements
|
||||
var def *Node // defaults
|
||||
br := Nod(OBREAK, nil, nil)
|
||||
|
||||
for l := sw.List; l != nil; l = l.Next {
|
||||
|
|
@ -377,17 +377,19 @@ func casebody(sw *Node, typeswvar *Node) {
|
|||
}
|
||||
}
|
||||
|
||||
stat = list(stat, Nod(OLABEL, jmp.Left, nil))
|
||||
stat = append(stat, Nod(OLABEL, jmp.Left, nil))
|
||||
if typeswvar != nil && needvar && n.Rlist != nil {
|
||||
l := list1(Nod(ODCL, n.Rlist.N, nil))
|
||||
l = list(l, Nod(OAS, n.Rlist.N, typeswvar))
|
||||
typechecklist(l, Etop)
|
||||
stat = concat(stat, l)
|
||||
l := []*Node{
|
||||
Nod(ODCL, n.Rlist.N, nil),
|
||||
Nod(OAS, n.Rlist.N, typeswvar),
|
||||
}
|
||||
typecheckslice(l, Etop)
|
||||
stat = append(stat, l...)
|
||||
}
|
||||
stat = concat(stat, n.Nbody)
|
||||
stat = append(stat, n.Nbody.Slice()...)
|
||||
|
||||
// botch - shouldn't fall thru declaration
|
||||
last := stat.End.N
|
||||
last := stat[len(stat)-1]
|
||||
if last.Xoffset == n.Xoffset && last.Op == OXFALL {
|
||||
if typeswvar != nil {
|
||||
setlineno(last)
|
||||
|
|
@ -401,17 +403,17 @@ func casebody(sw *Node, typeswvar *Node) {
|
|||
|
||||
last.Op = OFALL
|
||||
} else {
|
||||
stat = list(stat, br)
|
||||
stat = append(stat, br)
|
||||
}
|
||||
}
|
||||
|
||||
stat = list(stat, br)
|
||||
stat = append(stat, br)
|
||||
if def != nil {
|
||||
cas = list(cas, def)
|
||||
}
|
||||
|
||||
sw.List = cas
|
||||
sw.Nbody = stat
|
||||
sw.Nbody.Set(stat)
|
||||
lineno = lno
|
||||
}
|
||||
|
||||
|
|
@ -531,14 +533,14 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
return
|
||||
}
|
||||
|
||||
var cas *NodeList
|
||||
var cas []*Node
|
||||
|
||||
// predeclare temporary variables and the boolean var
|
||||
s.facename = temp(cond.Right.Type)
|
||||
|
||||
a := Nod(OAS, s.facename, cond.Right)
|
||||
typecheck(&a, Etop)
|
||||
cas = list(cas, a)
|
||||
cas = append(cas, a)
|
||||
|
||||
s.okname = temp(Types[TBOOL])
|
||||
typecheck(&s.okname, Erv)
|
||||
|
|
@ -579,18 +581,18 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
i.Left = Nod(OEQ, typ, nodnil())
|
||||
if typenil != nil {
|
||||
// Do explicit nil case right here.
|
||||
i.Nbody = list1(typenil)
|
||||
i.Nbody.Set([]*Node{typenil})
|
||||
} else {
|
||||
// Jump to default case.
|
||||
lbl := newCaseLabel()
|
||||
i.Nbody = list1(Nod(OGOTO, lbl, nil))
|
||||
i.Nbody.Set([]*Node{Nod(OGOTO, lbl, nil)})
|
||||
// Wrap default case with label.
|
||||
blk := Nod(OBLOCK, nil, nil)
|
||||
blk.List = list(list1(Nod(OLABEL, lbl, nil)), def)
|
||||
def = blk
|
||||
}
|
||||
typecheck(&i.Left, Erv)
|
||||
cas = list(cas, i)
|
||||
cas = append(cas, i)
|
||||
|
||||
if !isnilinter(cond.Right.Type) {
|
||||
// Load type from itab.
|
||||
|
|
@ -608,7 +610,7 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
h.Bounded = true // guaranteed not to fault
|
||||
a = Nod(OAS, s.hashname, h)
|
||||
typecheck(&a, Etop)
|
||||
cas = list(cas, a)
|
||||
cas = append(cas, a)
|
||||
|
||||
// insert type equality check into each case block
|
||||
for _, c := range cc {
|
||||
|
|
@ -625,7 +627,7 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
for len(cc) > 0 {
|
||||
if cc[0].typ != caseKindTypeConst {
|
||||
n := cc[0].node
|
||||
cas = list(cas, n.Right)
|
||||
cas = append(cas, n.Right)
|
||||
cc = cc[1:]
|
||||
continue
|
||||
}
|
||||
|
|
@ -642,7 +644,7 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
if false {
|
||||
for i := 0; i < run; i++ {
|
||||
n := cc[i].node
|
||||
cas = list(cas, n.Right)
|
||||
cas = append(cas, n.Right)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
|
@ -659,16 +661,16 @@ func (s *typeSwitch) walk(sw *Node) {
|
|||
}
|
||||
|
||||
// binary search among cases to narrow by hash
|
||||
cas = list(cas, s.walkCases(cc[:ncase]))
|
||||
cas = append(cas, s.walkCases(cc[:ncase]))
|
||||
cc = cc[ncase:]
|
||||
}
|
||||
|
||||
// handle default case
|
||||
if nerrors == 0 {
|
||||
cas = list(cas, def)
|
||||
sw.Nbody = concat(cas, sw.Nbody)
|
||||
cas = append(cas, def)
|
||||
sw.Nbody.Set(append(cas, sw.Nbody.Slice()...))
|
||||
sw.List = nil
|
||||
walkstmtlist(sw.Nbody)
|
||||
walkstmtslice(sw.Nbody.Slice())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -698,7 +700,7 @@ func (s *typeSwitch) typeone(t *Node) *Node {
|
|||
|
||||
c := Nod(OIF, nil, nil)
|
||||
c.Left = s.okname
|
||||
c.Nbody = list1(t.Right) // if ok { goto l }
|
||||
c.Nbody.Set([]*Node{t.Right}) // if ok { goto l }
|
||||
|
||||
return liststmt(list(init, c))
|
||||
}
|
||||
|
|
@ -715,7 +717,7 @@ func (s *typeSwitch) walkCases(cc []*caseClause) *Node {
|
|||
a := Nod(OIF, nil, nil)
|
||||
a.Left = Nod(OEQ, s.hashname, Nodintconst(int64(c.hash)))
|
||||
typecheck(&a.Left, Erv)
|
||||
a.Nbody = list1(n.Right)
|
||||
a.Nbody.Set([]*Node{n.Right})
|
||||
cas = list(cas, a)
|
||||
}
|
||||
return liststmt(cas)
|
||||
|
|
@ -726,7 +728,7 @@ func (s *typeSwitch) walkCases(cc []*caseClause) *Node {
|
|||
a := Nod(OIF, nil, nil)
|
||||
a.Left = Nod(OLE, s.hashname, Nodintconst(int64(cc[half-1].hash)))
|
||||
typecheck(&a.Left, Erv)
|
||||
a.Nbody = list1(s.walkCases(cc[:half]))
|
||||
a.Nbody.Set([]*Node{s.walkCases(cc[:half])})
|
||||
a.Rlist = list1(s.walkCases(cc[half:]))
|
||||
return a
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue