]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: preserve escape information for map literals
authorMartin Möhrmann <moehrmann@google.com>
Sun, 10 Sep 2017 17:36:38 +0000 (19:36 +0200)
committerMartin Möhrmann <moehrmann@google.com>
Mon, 11 Sep 2017 05:54:46 +0000 (05:54 +0000)
While some map literals were marked non-escaping that information
was lost when creating the corresponding OMAKE node which made map
literals always heap allocated.

Copying the escape information to the corresponding OMAKE node allows
stack allocation of hmap and a map bucket for non escaping map literals.

Fixes #21830

Change-Id: Ife0b020fffbc513f1ac009352f2ecb110d6889c9
Reviewed-on: https://go-review.googlesource.com/62790
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

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

index f38692e31021b81a18d032ce1f9e0eb0211c0afe..27863b323b7ea6f1de29dd406e39ab3413546373 100644 (file)
@@ -931,6 +931,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
 func maplit(n *Node, m *Node, init *Nodes) {
        // make the map var
        a := nod(OMAKE, nil, nil)
+       a.Esc = n.Esc
        a.List.Set2(typenod(n.Type), nodintconst(int64(n.List.Len())))
        litas(m, a, init)
 
index 1d1de3f74011a992ca4033c9a1fd23c2fab31501..a3a21e2f80012e92fde5baffdcba51e05664f623 100644 (file)
@@ -650,6 +650,13 @@ var testNonEscapingMapVariable int = 8
 
 func TestNonEscapingMap(t *testing.T) {
        n := testing.AllocsPerRun(1000, func() {
+               m := map[int]int{}
+               m[0] = 0
+       })
+       if n != 0 {
+               t.Fatalf("mapliteral: want 0 allocs, got %v", n)
+       }
+       n = testing.AllocsPerRun(1000, func() {
                m := make(map[int]int)
                m[0] = 0
        })