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>
fallthrough
case PPARAM, PPARAMOUT:
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))
}
}
Class int8
Offset int64
Sym *LSym
- Gotype *LSym
// argument value:
// for TYPE_SCONST, a string
a.Asym = p.From.Sym
a.Aoffset = int32(p.From.Offset)
a.Name = int16(p.From.Name)
- a.Gotype = p.From.Gotype
+ a.Gotype = p.To.Sym
a.Link = curtext.Autom
curtext.Autom = a
continue
_32bit uintptr // size on 32bit platforms
_64bit uintptr // size on 64bit platforms
}{
- {Addr{}, 44, 72},
+ {Addr{}, 40, 64},
{LSym{}, 80, 136},
- {Prog{}, 152, 240},
+ {Prog{}, 144, 224},
}
for _, tt := range tests {
if a.Index != REG_NONE {
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:
if a.Reg != 0 {