cmd/compile: reduce inline cost of OCONVOP

OCONVOP doesn't have effect in the compiled code so, it can be safely
excluded from inline cost calculation.

Also make sequence ODEREF OCONVNOP* OADDR cost 1. This is rather common
conversion, such as *(*uint32)(unsafe.Pointer(&x)).

Fixes #42788

Change-Id: I5001f7e89d985c198b6405694cdd5b819cf3f47a
Reviewed-on: https://go-review.googlesource.com/c/go/+/281232
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Egon Elbre 2021-01-02 16:28:11 +02:00 committed by Josh Bleecher Snyder
parent 27684ea195
commit adb467ffd2
2 changed files with 39 additions and 0 deletions

View file

@ -384,6 +384,22 @@ func (v *hairyVisitor) doNode(n ir.Node) bool {
case ir.OAPPEND:
v.budget -= inlineExtraAppendCost
case ir.ODEREF:
// *(*X)(unsafe.Pointer(&x)) is low-cost
n := n.(*ir.StarExpr)
ptr := n.X
for ptr.Op() == ir.OCONVNOP {
ptr = ptr.(*ir.ConvExpr).X
}
if ptr.Op() == ir.OADDR {
v.budget += 1 // undo half of default cost of ir.ODEREF+ir.OADDR
}
case ir.OCONVNOP:
// This doesn't produce code, but the children might.
v.budget++ // undo default cost
case ir.ODCLCONST, ir.OFALL:
// These nodes don't produce code; omit from inlining budget.
return false