mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: move Type.Maplineno to separate data structure
Relatively few types are ever used as map keys, so tracking this separately is a net win. Passes toolstash -cmp. name old alloc/op new alloc/op delta Template 55.9MB ± 0% 55.5MB ± 0% -0.71% (p=0.000 n=10+10) Unicode 37.8MB ± 0% 37.7MB ± 0% -0.27% (p=0.000 n=10+10) GoTypes 180MB ± 0% 179MB ± 0% -0.52% (p=0.000 n=7+10) Compiler 806MB ± 0% 803MB ± 0% -0.41% (p=0.000 n=10+10) CPU and number of allocs are unchanged. Change-Id: I6d60d74a4866995a231dfed3dd5792d75d904292 Reviewed-on: https://go-review.googlesource.com/21622 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
d636d7907c
commit
007b12977a
4 changed files with 12 additions and 10 deletions
|
|
@ -27,7 +27,7 @@ func TestSizeof(t *testing.T) {
|
||||||
{Name{}, 52, 80},
|
{Name{}, 52, 80},
|
||||||
{Node{}, 92, 144},
|
{Node{}, 92, 144},
|
||||||
{Sym{}, 60, 112},
|
{Sym{}, 60, 112},
|
||||||
{Type{}, 56, 88},
|
{Type{}, 52, 80},
|
||||||
{MapType{}, 20, 40},
|
{MapType{}, 20, 40},
|
||||||
{ForwardType{}, 16, 32},
|
{ForwardType{}, 16, 32},
|
||||||
{FuncType{}, 28, 48},
|
{FuncType{}, 28, 48},
|
||||||
|
|
|
||||||
|
|
@ -390,8 +390,8 @@ func checkMapKeyType(key *Type) {
|
||||||
// before key is fully defined, the error
|
// before key is fully defined, the error
|
||||||
// will only be printed for the first one.
|
// will only be printed for the first one.
|
||||||
// good enough.
|
// good enough.
|
||||||
if key.Maplineno == 0 {
|
if maplineno[key] == 0 {
|
||||||
key.Maplineno = lineno
|
maplineno[key] = lineno
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -153,8 +153,6 @@ type Type struct {
|
||||||
Vargen int32 // unique name for OTYPE/ONAME
|
Vargen int32 // unique name for OTYPE/ONAME
|
||||||
Lineno int32 // line at which this type was declared, implicitly or explicitly
|
Lineno int32 // line at which this type was declared, implicitly or explicitly
|
||||||
|
|
||||||
Maplineno int32 // first use of this type as a map key
|
|
||||||
|
|
||||||
Etype EType // kind of type
|
Etype EType // kind of type
|
||||||
Noalg bool // suppress hash and eq algorithm generation
|
Noalg bool // suppress hash and eq algorithm generation
|
||||||
Trecur uint8 // to detect loops
|
Trecur uint8 // to detect loops
|
||||||
|
|
|
||||||
|
|
@ -3513,7 +3513,11 @@ func domethod(n *Node) {
|
||||||
checkwidth(n.Type)
|
checkwidth(n.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
var mapqueue []*Node
|
var (
|
||||||
|
mapqueue []*Node
|
||||||
|
// maplineno tracks the line numbers at which types are first used as map keys
|
||||||
|
maplineno = map[*Type]int32{}
|
||||||
|
)
|
||||||
|
|
||||||
func copytype(n *Node, t *Type) {
|
func copytype(n *Node, t *Type) {
|
||||||
if t.Etype == TFORW {
|
if t.Etype == TFORW {
|
||||||
|
|
@ -3522,7 +3526,7 @@ func copytype(n *Node, t *Type) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
maplineno := n.Type.Maplineno
|
mapline := maplineno[n.Type]
|
||||||
embedlineno := n.Type.ForwardType().Embedlineno
|
embedlineno := n.Type.ForwardType().Embedlineno
|
||||||
l := n.Type.ForwardType().Copyto
|
l := n.Type.ForwardType().Copyto
|
||||||
|
|
||||||
|
|
@ -3559,8 +3563,8 @@ func copytype(n *Node, t *Type) {
|
||||||
lineno = lno
|
lineno = lno
|
||||||
|
|
||||||
// Queue check for map until all the types are done settling.
|
// Queue check for map until all the types are done settling.
|
||||||
if maplineno != 0 {
|
if mapline != 0 {
|
||||||
t.Maplineno = maplineno
|
maplineno[t] = mapline
|
||||||
mapqueue = append(mapqueue, n)
|
mapqueue = append(mapqueue, n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3609,7 +3613,7 @@ ret:
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, n := range mapqueue {
|
for _, n := range mapqueue {
|
||||||
lineno = n.Type.Maplineno
|
lineno = maplineno[n.Type]
|
||||||
checkMapKeyType(n.Type)
|
checkMapKeyType(n.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue