]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: improve static map initialization
authorKeith Randall <khr@golang.org>
Mon, 25 Sep 2017 17:28:20 +0000 (10:28 -0700)
committerKeith Randall <khr@golang.org>
Mon, 25 Sep 2017 18:50:41 +0000 (18:50 +0000)
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>

src/cmd/compile/internal/gc/sinit.go

index 27863b323b7ea6f1de29dd406e39ab3413546373..10be25b1261245a9b50f0ba386827447976ae134 100644 (file)
@@ -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++ {