mirror of
https://github.com/golang/go
synced 2024-09-05 16:04:50 +00:00
[dev.regabi] cmd/compile: fix potential closure waste in Order
I haven't measured this, but it's the only use of EditChildren where we aren't careful to allocate a closure once and use it for the whole recursion. This one is allocating a closure at every level of the recursion, and it was an oversight that it wasn't cleaned up in the original CL. Passes buildall w/ toolstash -cmp. Change-Id: I5e3f1795c6f64c5867a19c077f797643aa1066a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/277914 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
578fbbe3aa
commit
a997543292
|
@ -47,6 +47,7 @@ type Order struct {
|
|||
out []ir.Node // list of generated statements
|
||||
temp []*ir.Name // stack of temporary variables
|
||||
free map[string][]*ir.Name // free list of unused temporaries, by type.LongString().
|
||||
edit func(ir.Node) ir.Node // cached closure of o.exprNoLHS
|
||||
}
|
||||
|
||||
// Order rewrites fn.Nbody to apply the ordering constraints
|
||||
|
@ -1072,7 +1073,10 @@ func (o *Order) expr(n, lhs ir.Node) ir.Node {
|
|||
|
||||
switch n.Op() {
|
||||
default:
|
||||
ir.EditChildren(n, o.exprNoLHS)
|
||||
if o.edit == nil {
|
||||
o.edit = o.exprNoLHS // create closure once
|
||||
}
|
||||
ir.EditChildren(n, o.edit)
|
||||
|
||||
// Addition of strings turns into a function call.
|
||||
// Allocate a temporary to hold the strings.
|
||||
|
|
Loading…
Reference in a new issue