1
0
mirror of https://github.com/golang/go synced 2024-09-24 05:10:13 -06:00

cmd/compile/internal/walk: merge operations

Change-Id: I018872da519dfb4aa6c252ea28fc09289c2d9711
GitHub-Last-Rev: 5969776197
GitHub-Pull-Request: golang/go#45795
Reviewed-on: https://go-review.googlesource.com/c/go/+/313550
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Keith Randall <khr@golang.org>
This commit is contained in:
cuiweixie 2021-04-27 08:50:06 +00:00 committed by Matthew Dempsky
parent 13e87cda00
commit b9dfaf77f5

View File

@ -118,9 +118,7 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
tmp.SetBounded(true)
// Use OAS2 to correctly handle assignments
// of the form "v1, a[v1] := range".
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.Lhs = []ir.Node{v1, v2}
a.Rhs = []ir.Node{hv1, tmp}
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{v1, v2}, []ir.Node{hv1, tmp})
body = []ir.Node{a}
break
}
@ -148,9 +146,7 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
// Use OAS2 to correctly handle assignments
// of the form "v1, a[v1] := range".
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.Lhs = []ir.Node{v1, v2}
a.Rhs = []ir.Node{hv1, ir.NewStarExpr(base.Pos, hp)}
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{v1, v2}, []ir.Node{hv1, ir.NewStarExpr(base.Pos, hp)})
body = append(body, a)
// Advance pointer as part of the late increment.
@ -190,9 +186,7 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
body = []ir.Node{ir.NewAssignStmt(base.Pos, v1, key)}
} else {
elem := ir.NewStarExpr(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, elemsym))
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.Lhs = []ir.Node{v1, v2}
a.Rhs = []ir.Node{key, elem}
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{v1, v2}, []ir.Node{key, elem})
body = []ir.Node{a}
}
@ -208,10 +202,10 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
hb := typecheck.Temp(types.Types[types.TBOOL])
nfor.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, hb, ir.NewBool(false))
a := ir.NewAssignListStmt(base.Pos, ir.OAS2RECV, nil, nil)
lhs := []ir.Node{hv1, hb}
rhs := []ir.Node{ir.NewUnaryExpr(base.Pos, ir.ORECV, ha)}
a := ir.NewAssignListStmt(base.Pos, ir.OAS2RECV, lhs, rhs)
a.SetTypecheck(1)
a.Lhs = []ir.Node{hv1, hb}
a.Rhs = []ir.Node{ir.NewUnaryExpr(base.Pos, ir.ORECV, ha)}
nfor.Cond = ir.InitExpr([]ir.Node{a}, nfor.Cond)
if v1 == nil {
body = nil
@ -270,24 +264,18 @@ func walkRange(nrange *ir.RangeStmt) ir.Node {
nif.Body = []ir.Node{ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, ir.NewInt(1)))}
// } else {
eif := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
// hv2, hv1 = decoderune(ha, hv1)
eif.Lhs = []ir.Node{hv2, hv1}
fn := typecheck.LookupRuntime("decoderune")
var fnInit ir.Nodes
eif.Rhs = []ir.Node{mkcall1(fn, fn.Type().Results(), &fnInit, ha, hv1)}
fnInit.Append(eif)
nif.Else = fnInit
call := mkcall1(fn, fn.Type().Results(), &nif.Else, ha, hv1)
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{hv2, hv1}, []ir.Node{call})
nif.Else.Append(a)
body = append(body, nif)
if v1 != nil {
if v2 != nil {
// v1, v2 = hv1t, hv2
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.Lhs = []ir.Node{v1, v2}
a.Rhs = []ir.Node{hv1t, hv2}
a := ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{v1, v2}, []ir.Node{hv1t, hv2})
body = append(body, a)
} else {
// v1 = hv1t