]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: improve walkReturn common case
authorMatthew Dempsky <mdempsky@google.com>
Sun, 3 Jan 2021 07:56:20 +0000 (23:56 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Sun, 3 Jan 2021 19:48:15 +0000 (19:48 +0000)
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>
src/cmd/compile/internal/walk/assign.go

index 04bd576b696d4e528f843d1aeb0556fe2ad5479a..84ba7f0dc5093dccf25c01c0f89056f54c88f584 100644 (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