From: Keith Randall Date: Mon, 25 Sep 2017 17:28:20 +0000 (-0700) Subject: cmd/compile: improve static map initialization X-Git-Tag: go1.10beta1~986 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=91cb9edd5e4d203c6f82332acdac73beb9936283;p=gostls13.git cmd/compile: improve static map initialization When static maps are large, we try to initialize them by iterating over an array of key/value pairs. Currently this optimization only works if the keys and values are of primitive type. This CL improves this optimization by allowing any static composite literals as well. Fixes #22010 Change-Id: Ie493e02ab8b8a228a3472b5c6025a33f7b92daf3 Reviewed-on: https://go-review.googlesource.com/66050 Run-TryBot: Keith Randall Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 27863b323b..10be25b126 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -941,7 +941,7 @@ func maplit(n *Node, m *Node, init *Nodes) { if r.Op != OKEY { Fatalf("maplit: rhs not OKEY: %v", r) } - if isliteral(r.Left) && isliteral(r.Right) { + if isStaticCompositeLiteral(r.Left) && isStaticCompositeLiteral(r.Right) { stat = append(stat, r) } else { dyn = append(dyn, r) @@ -966,24 +966,14 @@ func maplit(n *Node, m *Node, init *Nodes) { vstatv := staticname(tv) vstatv.Name.SetReadonly(true) - for i, r := range stat { - index := r.Left - value := r.Right - - // build vstatk[b] = index - setlineno(index) - lhs := nod(OINDEX, vstatk, nodintconst(int64(i))) - as := nod(OAS, lhs, index) - as = typecheck(as, Etop) - genAsStatic(as) - - // build vstatv[b] = value - setlineno(value) - lhs = nod(OINDEX, vstatv, nodintconst(int64(i))) - as = nod(OAS, lhs, value) - as = typecheck(as, Etop) - genAsStatic(as) + datak := nod(OARRAYLIT, nil, nil) + datav := nod(OARRAYLIT, nil, nil) + for _, r := range stat { + datak.List.Append(r.Left) + datav.List.Append(r.Right) } + fixedlit(inInitFunction, initKindStatic, datak, vstatk, init) + fixedlit(inInitFunction, initKindStatic, datav, vstatv, init) // loop adding structure elements to map // for i = 0; i < len(vstatk); i++ {