]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: cache mapped types during irgen
authorMatthew Dempsky <mdempsky@google.com>
Tue, 19 Jan 2021 18:38:33 +0000 (10:38 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 19 Jan 2021 21:14:44 +0000 (21:14 +0000)
If we see the exact same types2.Type a second time, we can map it to
the same *types.Type instance. Not strictly necessary, but reduces
memory usage and plays better with the rest of the compiler given the
current state of things.

Change-Id: I53686d072c7c7834b0c97417bc8d5f2cd24572b2
Reviewed-on: https://go-review.googlesource.com/c/go/+/284692
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/noder/irgen.go
src/cmd/compile/internal/noder/types.go

index 694a6abb8e72cd35542d03d4b496643de2de2d7a..e1273484821d2d6e25fa440bbbc88c000facf084 100644 (file)
@@ -79,6 +79,7 @@ func check2(noders []*noder) {
                info:   &info,
                posMap: m,
                objs:   make(map[types2.Object]*ir.Name),
+               typs:   make(map[types2.Type]*types.Type),
        }
        g.generate(noders)
 
@@ -94,6 +95,7 @@ type irgen struct {
 
        posMap
        objs   map[types2.Object]*ir.Name
+       typs   map[types2.Type]*types.Type
        marker dwarfgen.ScopeMarker
 }
 
index 0635d76077fd8ee3ff65c980f7f1ed814088e877..aec1846619d72c3f5cb1480e6df4b6d81aef4010 100644 (file)
@@ -26,6 +26,20 @@ func (g *irgen) pkg(pkg *types2.Package) *types.Pkg {
 }
 
 func (g *irgen) typ(typ types2.Type) *types.Type {
+       // Caching type mappings isn't strictly needed, because typ0 preserves
+       // type identity; but caching minimizes memory blow-up from mapping the
+       // same composite type multiple times, and also plays better with the
+       // current state of cmd/compile (e.g., haphazard calculation of type
+       // sizes).
+       res, ok := g.typs[typ]
+       if !ok {
+               res = g.typ0(typ)
+               g.typs[typ] = res
+       }
+       return res
+}
+
+func (g *irgen) typ0(typ types2.Type) *types.Type {
        switch typ := typ.(type) {
        case *types2.Basic:
                return g.basic(typ)