From a997543292df533f5951cd8fda39692a44077151 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 7 Dec 2020 16:07:38 -0500 Subject: [PATCH] [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 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/order.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index fe64738856..e0c0cabcde 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -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.