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>
// 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