1
0
mirror of https://github.com/golang/go synced 2024-11-24 08:50:14 -07:00

cmd/compile: optimize convT2I as a two-word copy when T is pointer-shaped

See #14874

This change adds a compiler optimization for pointer shaped convT2I.
Since itab symbols are now emitted by the compiler, the itab address can
be directly moved into the iface structure.

Change-Id: I311483af544519ca682c5f872960717ead772f26
Reviewed-on: https://go-review.googlesource.com/20901
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Michel Lespinasse 2016-03-18 16:20:20 -07:00
parent 79688ca58f
commit 7427f2c4bd
2 changed files with 17 additions and 9 deletions

View File

@ -947,7 +947,7 @@ func typename(t *Type) *Node {
return n
}
func itabnamesym(t, itype *Type) *Sym {
func itabname(t, itype *Type) *Node {
if t == nil || (Isptr[t.Etype] && t.Type == nil) || isideal(t) {
Fatalf("itabname %v", t)
}
@ -961,7 +961,13 @@ func itabnamesym(t, itype *Type) *Sym {
itabs = append(itabs, itabEntry{t: t, itype: itype, sym: s})
}
return s.Def.Sym
n := Nod(OADDR, s.Def, nil)
n.Type = Ptrto(s.Def.Type)
n.Addable = true
n.Ullman = 2
n.Typecheck = 1
return n
}
// isreflexive reports whether t has a reflexive equality operator.

View File

@ -987,19 +987,21 @@ opswitch:
case OCONVIFACE:
n.Left = walkexpr(n.Left, init)
// Optimize convT2E as a two-word copy when T is pointer-shaped.
if isnilinter(n.Type) && isdirectiface(n.Left.Type) {
l := Nod(OEFACE, typename(n.Left.Type), n.Left)
// Optimize convT2E or convT2I as a two-word copy when T is pointer-shaped.
if isdirectiface(n.Left.Type) {
var t *Node
if isnilinter(n.Type) {
t = typename(n.Left.Type)
} else {
t = itabname(n.Left.Type, n.Type)
}
l := Nod(OEFACE, t, n.Left)
l.Type = n.Type
l.Typecheck = n.Typecheck
n = l
break
}
if isdirectiface(n.Left.Type) {
itabnamesym(n.Left.Type, n.Type)
}
var ll []*Node
if !Isinter(n.Left.Type) {
ll = append(ll, typename(n.Left.Type))