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:
parent
79688ca58f
commit
7427f2c4bd
@ -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.
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user