Skip to content

Commit

Permalink
cmd/compile: optimize convT2I as a two-word copy when T is pointer-sh…
Browse files Browse the repository at this point in the history
…aped

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>
  • Loading branch information
walken-google committed Mar 29, 2016
1 parent 79688ca commit 7427f2c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 9 deletions.
10 changes: 8 additions & 2 deletions src/cmd/compile/internal/gc/reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -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.
Expand Down
16 changes: 9 additions & 7 deletions src/cmd/compile/internal/gc/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit 7427f2c

Please sign in to comment.