cmd/internal/obj: drop Addr's Gotype field

The Gotype field is only used for ATYPE instructions. Instead of
specially storing the Go type symbol in From.Gotype, just store it in
To.Sym like any other 2-argument instruction would.

Modest reduction in allocations:

name       old alloc/op    new alloc/op    delta
Template      42.0MB ± 0%     41.8MB ± 0%  -0.40%         (p=0.000 n=9+10)
Unicode       34.3MB ± 0%     34.1MB ± 0%  -0.48%         (p=0.000 n=9+10)
GoTypes        122MB ± 0%      122MB ± 0%  -0.14%         (p=0.000 n=9+10)
Compiler       518MB ± 0%      518MB ± 0%  -0.04%         (p=0.000 n=9+10)

Passes toolstash -cmp.

Change-Id: I0e603266b5d7d4e405106a26369e22773a0d3a91
Reviewed-on: https://go-review.googlesource.com/31850
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Matthew Dempsky 2016-10-24 11:46:06 -07:00
parent 07a22dbd34
commit 7124056f7e
5 changed files with 6 additions and 8 deletions

View file

@ -425,7 +425,9 @@ func compile(fn *Node) {
fallthrough fallthrough
case PPARAM, PPARAMOUT: case PPARAM, PPARAMOUT:
p := Gins(obj.ATYPE, n, nil) p := Gins(obj.ATYPE, n, nil)
p.From.Gotype = Linksym(ngotype(n)) p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
p.To.Sym = Linksym(ngotype(n))
} }
} }

View file

@ -160,7 +160,6 @@ type Addr struct {
Class int8 Class int8
Offset int64 Offset int64
Sym *LSym Sym *LSym
Gotype *LSym
// argument value: // argument value:
// for TYPE_SCONST, a string // for TYPE_SCONST, a string

View file

@ -69,7 +69,7 @@ func flushplist(ctxt *Link, freeProgs bool) {
a.Asym = p.From.Sym a.Asym = p.From.Sym
a.Aoffset = int32(p.From.Offset) a.Aoffset = int32(p.From.Offset)
a.Name = int16(p.From.Name) a.Name = int16(p.From.Name)
a.Gotype = p.From.Gotype a.Gotype = p.To.Sym
a.Link = curtext.Autom a.Link = curtext.Autom
curtext.Autom = a curtext.Autom = a
continue continue

View file

@ -22,9 +22,9 @@ func TestSizeof(t *testing.T) {
_32bit uintptr // size on 32bit platforms _32bit uintptr // size on 32bit platforms
_64bit uintptr // size on 64bit platforms _64bit uintptr // size on 64bit platforms
}{ }{
{Addr{}, 44, 72}, {Addr{}, 40, 64},
{LSym{}, 80, 136}, {LSym{}, 80, 136},
{Prog{}, 152, 240}, {Prog{}, 144, 224},
} }
for _, tt := range tests { for _, tt := range tests {

View file

@ -240,9 +240,6 @@ func Dconv(p *Prog, a *Addr) string {
if a.Index != REG_NONE { if a.Index != REG_NONE {
str += fmt.Sprintf("(%v*%d)", Rconv(int(a.Index)), int(a.Scale)) str += fmt.Sprintf("(%v*%d)", Rconv(int(a.Index)), int(a.Scale))
} }
if p != nil && p.As == ATYPE && a.Gotype != nil {
str += fmt.Sprintf("%s", a.Gotype.Name)
}
case TYPE_CONST: case TYPE_CONST:
if a.Reg != 0 { if a.Reg != 0 {