]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't generate algs for map buckets
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 4 May 2015 22:01:03 +0000 (15:01 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sun, 24 Apr 2016 21:00:29 +0000 (21:00 +0000)
Note that this is only safe because
the compiler generates multiple distinct
gc.Types. If we switch to having canonical
gc.Types, then this will need to be updated
to handle the case in which the user uses both
map[T]S and also map[[8]T]S. In that case,
the runtime needs algs for [8]T, but this could
mark the sole [8]T type as Noalg. This is a general
problem with having a single bool to represent
whether alg generation is needed for a type.

Cuts 5k off cmd/go and 22k off golang.org/x/tools/cmd/godoc,
approx 0.04% and 0.12% respectively.

For #6853 and #9930

Change-Id: I30a15ec72ecb62e2aa053260a7f0f75015fc0ade
Reviewed-on: https://go-review.googlesource.com/19769
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

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

index 49d55091ff5e723c337bd1412290e9afe49da2f8..727b9939e94db62ebce0ecd7780bcbf44717f8db 100644 (file)
@@ -102,13 +102,18 @@ func mapbucket(t *Type) *Type {
                valtype = Ptrto(valtype)
        }
 
+       field := make([]*Field, 0, 5)
+
        // The first field is: uint8 topbits[BUCKETSIZE].
        arr := typArray(Types[TUINT8], BUCKETSIZE)
-       field := make([]*Field, 0, 5)
        field = append(field, makefield("topbits", arr))
+
        arr = typArray(keytype, BUCKETSIZE)
+       arr.Noalg = true
        field = append(field, makefield("keys", arr))
+
        arr = typArray(valtype, BUCKETSIZE)
+       arr.Noalg = true
        field = append(field, makefield("values", arr))
 
        // Make sure the overflow pointer is the last memory in the struct,