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

[dev.regabi] cmd/compile: remove walkReturn "common case" path

After the previous two optimization CLs, this code path now generates
the same code as ascompatee does anyway. So just use that and remove
some redundant code.

Passes toolstash -cmp.

Change-Id: I5e2e5c6dbea64d8e91abe0f2cf51aa5bb86576d2
Reviewed-on: https://go-review.googlesource.com/c/go/+/281154
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-03 00:03:28 -08:00
parent d36a6bf44d
commit f2e6dab048

View File

@ -143,7 +143,7 @@ func walkAssignFunc(init *ir.Nodes, n *ir.AssignListStmt) ir.Node {
// walkAssignList walks an OAS2 node.
func walkAssignList(init *ir.Nodes, n *ir.AssignListStmt) ir.Node {
init.Append(ir.TakeInit(n)...)
return ir.NewBlockStmt(src.NoXPos, ascompatee(ir.OAS, n.Lhs, n.Rhs, init))
return ir.NewBlockStmt(src.NoXPos, ascompatee(ir.OAS, n.Lhs, n.Rhs))
}
// walkAssignMapRead walks an OAS2MAPR node.
@ -244,20 +244,7 @@ func walkReturn(n *ir.ReturnStmt) ir.Node {
dsts[i] = typecheck.AssignExpr(v.Nname.(*ir.Name))
}
if (ir.HasNamedResults(fn) && len(n.Results) > 1) || paramoutheap(fn) {
// General case: For anything tricky, let ascompatee handle
// ordering the assignments correctly.
n.Results = ascompatee(n.Op(), dsts, n.Results, n.PtrInit())
return n
}
// Common case: Assignment order doesn't matter. Simply assign to
// each result parameter in order.
var res ir.Nodes
for i, v := range n.Results {
appendWalkStmt(&res, convas(ir.NewAssignStmt(base.Pos, dsts[i], v), &res))
}
n.Results = res
n.Results = ascompatee(n.Op(), dsts, n.Results)
return n
}
@ -318,7 +305,7 @@ func ascompatet(nl ir.Nodes, nr *types.Type) []ir.Node {
// check assign expression list to
// an expression list. called in
// expr-list = expr-list
func ascompatee(op ir.Op, nl, nr []ir.Node, init *ir.Nodes) []ir.Node {
func ascompatee(op ir.Op, nl, nr []ir.Node) []ir.Node {
// cannot happen: should have been rejected during type checking
if len(nl) != len(nr) {
base.Fatalf("assignment operands mismatch: %+v / %+v", ir.Nodes(nl), ir.Nodes(nr))
@ -413,6 +400,11 @@ func ascompatee(op ir.Op, nl, nr []ir.Node, init *ir.Nodes) []ir.Node {
// We can ignore assignments to blank.
continue
}
if op == ir.ORETURN && types.OrigSym(name.Sym()) == nil {
// We can also ignore assignments to anonymous result
// parameters. These can't appear in expressions anyway.
continue
}
assigned.Add(name)
}