1
0
mirror of https://github.com/golang/go synced 2024-11-17 05:54:46 -07:00

[dev.regabi] cmd/compile: improve walkReturn common case

Instead of evaluating all result expressions up front and then
assigning them to their result destinations, we can interleave
evaluation with assignment. This reduces how much temporary
stack/register space is needed to hold the values in flight.

Doesn't pass toolstash -cmp, because it allows better return statement
code to be generated. E.g., cmd/go's text segment on linux/ppc64le
shrinks another 1kB.

Change-Id: I3fe889342c80e947e0118704ec01f1682c577e6e
Reviewed-on: https://go-review.googlesource.com/c/go/+/281153
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
Matthew Dempsky 2021-01-02 23:56:20 -08:00
parent a317067d65
commit d36a6bf44d

View File

@ -253,10 +253,9 @@ func walkReturn(n *ir.ReturnStmt) ir.Node {
// Common case: Assignment order doesn't matter. Simply assign to
// each result parameter in order.
walkExprList(n.Results, n.PtrInit())
res := make([]ir.Node, len(results))
var res ir.Nodes
for i, v := range n.Results {
res[i] = convas(ir.NewAssignStmt(base.Pos, dsts[i], v), n.PtrInit())
appendWalkStmt(&res, convas(ir.NewAssignStmt(base.Pos, dsts[i], v), &res))
}
n.Results = res
return n