1
0
mirror of https://github.com/golang/go synced 2024-11-20 04:04:41 -07:00

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 <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Keith Randall 2017-09-25 10:28:20 -07:00
parent c82ee79247
commit 91cb9edd5e

View File

@ -941,7 +941,7 @@ func maplit(n *Node, m *Node, init *Nodes) {
if r.Op != OKEY { if r.Op != OKEY {
Fatalf("maplit: rhs not OKEY: %v", r) 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) stat = append(stat, r)
} else { } else {
dyn = append(dyn, r) dyn = append(dyn, r)
@ -966,24 +966,14 @@ func maplit(n *Node, m *Node, init *Nodes) {
vstatv := staticname(tv) vstatv := staticname(tv)
vstatv.Name.SetReadonly(true) vstatv.Name.SetReadonly(true)
for i, r := range stat { datak := nod(OARRAYLIT, nil, nil)
index := r.Left datav := nod(OARRAYLIT, nil, nil)
value := r.Right for _, r := range stat {
datak.List.Append(r.Left)
// build vstatk[b] = index datav.List.Append(r.Right)
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)
} }
fixedlit(inInitFunction, initKindStatic, datak, vstatk, init)
fixedlit(inInitFunction, initKindStatic, datav, vstatv, init)
// loop adding structure elements to map // loop adding structure elements to map
// for i = 0; i < len(vstatk); i++ { // for i = 0; i < len(vstatk); i++ {