summaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/gc/range.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/gc/range.go')
-rw-r--r--src/cmd/compile/internal/gc/range.go92
1 files changed, 46 insertions, 46 deletions
diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go
index aa4f0358c9..4a753328f2 100644
--- a/src/cmd/compile/internal/gc/range.go
+++ b/src/cmd/compile/internal/gc/range.go
@@ -166,7 +166,7 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
return n
}
- nfor := ir.NodAt(nrange.Pos(), ir.OFOR, nil, nil)
+ nfor := ir.NewForStmt(nrange.Pos(), nil, nil, nil, nil)
nfor.SetInit(nrange.Init())
nfor.SetSym(nrange.Sym())
@@ -224,11 +224,11 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
hv1 := temp(types.Types[types.TINT])
hn := temp(types.Types[types.TINT])
- init = append(init, ir.Nod(ir.OAS, hv1, nil))
- init = append(init, ir.Nod(ir.OAS, hn, ir.Nod(ir.OLEN, ha, nil)))
+ init = append(init, ir.NewAssignStmt(base.Pos, hv1, nil))
+ init = append(init, ir.NewAssignStmt(base.Pos, hn, ir.NewUnaryExpr(base.Pos, ir.OLEN, ha)))
- nfor.SetLeft(ir.Nod(ir.OLT, hv1, hn))
- nfor.SetRight(ir.Nod(ir.OAS, hv1, ir.Nod(ir.OADD, hv1, nodintconst(1))))
+ nfor.SetLeft(ir.NewBinaryExpr(base.Pos, ir.OLT, hv1, hn))
+ nfor.SetRight(ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, nodintconst(1))))
// for range ha { body }
if v1 == nil {
@@ -237,18 +237,18 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
// for v1 := range ha { body }
if v2 == nil {
- body = []ir.Node{ir.Nod(ir.OAS, v1, hv1)}
+ body = []ir.Node{ir.NewAssignStmt(base.Pos, v1, hv1)}
break
}
// for v1, v2 := range ha { body }
if cheapComputableIndex(nrange.Type().Elem().Width) {
// v1, v2 = hv1, ha[hv1]
- tmp := ir.Nod(ir.OINDEX, ha, hv1)
+ tmp := ir.NewIndexExpr(base.Pos, ha, hv1)
tmp.SetBounded(true)
// Use OAS2 to correctly handle assignments
// of the form "v1, a[v1] := range".
- a := ir.Nod(ir.OAS2, nil, nil)
+ a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.PtrList().Set2(v1, v2)
a.PtrRlist().Set2(hv1, tmp)
body = []ir.Node{a}
@@ -268,19 +268,19 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
// elimination on the index variable (see #20711).
// Enhance the prove pass to understand this.
ifGuard = ir.NewIfStmt(base.Pos, nil, nil, nil)
- ifGuard.SetLeft(ir.Nod(ir.OLT, hv1, hn))
+ ifGuard.SetLeft(ir.NewBinaryExpr(base.Pos, ir.OLT, hv1, hn))
nfor.SetOp(ir.OFORUNTIL)
hp := temp(types.NewPtr(nrange.Type().Elem()))
- tmp := ir.Nod(ir.OINDEX, ha, nodintconst(0))
+ tmp := ir.NewIndexExpr(base.Pos, ha, nodintconst(0))
tmp.SetBounded(true)
- init = append(init, ir.Nod(ir.OAS, hp, nodAddr(tmp)))
+ init = append(init, ir.NewAssignStmt(base.Pos, hp, nodAddr(tmp)))
// Use OAS2 to correctly handle assignments
// of the form "v1, a[v1] := range".
- a := ir.Nod(ir.OAS2, nil, nil)
+ a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.PtrList().Set2(v1, v2)
- a.PtrRlist().Set2(hv1, ir.Nod(ir.ODEREF, hp, nil))
+ a.PtrRlist().Set2(hv1, ir.NewStarExpr(base.Pos, hp))
body = append(body, a)
// Advance pointer as part of the late increment.
@@ -288,7 +288,7 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
// This runs *after* the condition check, so we know
// advancing the pointer is safe and won't go past the
// end of the allocation.
- as := ir.Nod(ir.OAS, hp, addptr(hp, t.Elem().Width))
+ as := ir.NewAssignStmt(base.Pos, hp, addptr(hp, t.Elem().Width))
nfor.PtrList().Set1(typecheck(as, ctxStmt))
case types.TMAP:
@@ -305,20 +305,20 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
fn = substArgTypes(fn, t.Key(), t.Elem(), th)
init = append(init, mkcall1(fn, nil, nil, typename(t), ha, nodAddr(hit)))
- nfor.SetLeft(ir.Nod(ir.ONE, nodSym(ir.ODOT, hit, keysym), nodnil()))
+ nfor.SetLeft(ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym), nodnil()))
fn = syslook("mapiternext")
fn = substArgTypes(fn, th)
nfor.SetRight(mkcall1(fn, nil, nil, nodAddr(hit)))
- key := ir.Nod(ir.ODEREF, nodSym(ir.ODOT, hit, keysym), nil)
+ key := ir.NewStarExpr(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, keysym))
if v1 == nil {
body = nil
} else if v2 == nil {
- body = []ir.Node{ir.Nod(ir.OAS, v1, key)}
+ body = []ir.Node{ir.NewAssignStmt(base.Pos, v1, key)}
} else {
- elem := ir.Nod(ir.ODEREF, nodSym(ir.ODOT, hit, elemsym), nil)
- a := ir.Nod(ir.OAS2, nil, nil)
+ elem := ir.NewStarExpr(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, hit, elemsym))
+ a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.PtrList().Set2(v1, v2)
a.PtrRlist().Set2(key, elem)
body = []ir.Node{a}
@@ -331,25 +331,25 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
hv1 := temp(t.Elem())
hv1.SetTypecheck(1)
if t.Elem().HasPointers() {
- init = append(init, ir.Nod(ir.OAS, hv1, nil))
+ init = append(init, ir.NewAssignStmt(base.Pos, hv1, nil))
}
hb := temp(types.Types[types.TBOOL])
- nfor.SetLeft(ir.Nod(ir.ONE, hb, nodbool(false)))
- a := ir.Nod(ir.OAS2RECV, nil, nil)
+ nfor.SetLeft(ir.NewBinaryExpr(base.Pos, ir.ONE, hb, nodbool(false)))
+ a := ir.NewAssignListStmt(base.Pos, ir.OAS2RECV, nil, nil)
a.SetTypecheck(1)
a.PtrList().Set2(hv1, hb)
- a.PtrRlist().Set1(ir.Nod(ir.ORECV, ha, nil))
+ a.PtrRlist().Set1(ir.NewUnaryExpr(base.Pos, ir.ORECV, ha))
nfor.Left().PtrInit().Set1(a)
if v1 == nil {
body = nil
} else {
- body = []ir.Node{ir.Nod(ir.OAS, v1, hv1)}
+ body = []ir.Node{ir.NewAssignStmt(base.Pos, v1, hv1)}
}
// Zero hv1. This prevents hv1 from being the sole, inaccessible
// reference to an otherwise GC-able value during the next channel receive.
// See issue 15281.
- body = append(body, ir.Nod(ir.OAS, hv1, nil))
+ body = append(body, ir.NewAssignStmt(base.Pos, hv1, nil))
case types.TSTRING:
// Transform string range statements like "for v1, v2 = range a" into
@@ -375,30 +375,30 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
hv2 := temp(types.RuneType)
// hv1 := 0
- init = append(init, ir.Nod(ir.OAS, hv1, nil))
+ init = append(init, ir.NewAssignStmt(base.Pos, hv1, nil))
// hv1 < len(ha)
- nfor.SetLeft(ir.Nod(ir.OLT, hv1, ir.Nod(ir.OLEN, ha, nil)))
+ nfor.SetLeft(ir.NewBinaryExpr(base.Pos, ir.OLT, hv1, ir.NewUnaryExpr(base.Pos, ir.OLEN, ha)))
if v1 != nil {
// hv1t = hv1
- body = append(body, ir.Nod(ir.OAS, hv1t, hv1))
+ body = append(body, ir.NewAssignStmt(base.Pos, hv1t, hv1))
}
// hv2 := rune(ha[hv1])
- nind := ir.Nod(ir.OINDEX, ha, hv1)
+ nind := ir.NewIndexExpr(base.Pos, ha, hv1)
nind.SetBounded(true)
- body = append(body, ir.Nod(ir.OAS, hv2, conv(nind, types.RuneType)))
+ body = append(body, ir.NewAssignStmt(base.Pos, hv2, conv(nind, types.RuneType)))
// if hv2 < utf8.RuneSelf
- nif := ir.Nod(ir.OIF, nil, nil)
- nif.SetLeft(ir.Nod(ir.OLT, hv2, nodintconst(utf8.RuneSelf)))
+ nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
+ nif.SetLeft(ir.NewBinaryExpr(base.Pos, ir.OLT, hv2, nodintconst(utf8.RuneSelf)))
// hv1++
- nif.PtrBody().Set1(ir.Nod(ir.OAS, hv1, ir.Nod(ir.OADD, hv1, nodintconst(1))))
+ nif.PtrBody().Set1(ir.NewAssignStmt(base.Pos, hv1, ir.NewBinaryExpr(base.Pos, ir.OADD, hv1, nodintconst(1))))
// } else {
- eif := ir.Nod(ir.OAS2, nil, nil)
+ eif := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
nif.PtrRlist().Set1(eif)
// hv2, hv1 = decoderune(ha, hv1)
@@ -411,13 +411,13 @@ func walkrange(nrange *ir.RangeStmt) ir.Node {
if v1 != nil {
if v2 != nil {
// v1, v2 = hv1t, hv2
- a := ir.Nod(ir.OAS2, nil, nil)
+ a := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
a.PtrList().Set2(v1, v2)
a.PtrRlist().Set2(hv1t, hv2)
body = append(body, a)
} else {
// v1 = hv1t
- body = append(body, ir.Nod(ir.OAS, v1, hv1t))
+ body = append(body, ir.NewAssignStmt(base.Pos, v1, hv1t))
}
}
}
@@ -561,22 +561,22 @@ func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
// memclr{NoHeap,Has}Pointers(hp, hn)
// i = len(a) - 1
// }
- n := ir.Nod(ir.OIF, nil, nil)
+ n := ir.NewIfStmt(base.Pos, nil, nil, nil)
n.PtrBody().Set(nil)
- n.SetLeft(ir.Nod(ir.ONE, ir.Nod(ir.OLEN, a, nil), nodintconst(0)))
+ n.SetLeft(ir.NewBinaryExpr(base.Pos, ir.ONE, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), nodintconst(0)))
// hp = &a[0]
hp := temp(types.Types[types.TUNSAFEPTR])
- ix := ir.Nod(ir.OINDEX, a, nodintconst(0))
+ ix := ir.NewIndexExpr(base.Pos, a, nodintconst(0))
ix.SetBounded(true)
addr := convnop(nodAddr(ix), types.Types[types.TUNSAFEPTR])
- n.PtrBody().Append(ir.Nod(ir.OAS, hp, addr))
+ n.PtrBody().Append(ir.NewAssignStmt(base.Pos, hp, addr))
// hn = len(a) * sizeof(elem(a))
hn := temp(types.Types[types.TUINTPTR])
- mul := conv(ir.Nod(ir.OMUL, ir.Nod(ir.OLEN, a, nil), nodintconst(elemsize)), types.Types[types.TUINTPTR])
- n.PtrBody().Append(ir.Nod(ir.OAS, hn, mul))
+ mul := conv(ir.NewBinaryExpr(base.Pos, ir.OMUL, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), nodintconst(elemsize)), types.Types[types.TUINTPTR])
+ n.PtrBody().Append(ir.NewAssignStmt(base.Pos, hn, mul))
var fn ir.Node
if a.Type().Elem().HasPointers() {
@@ -591,7 +591,7 @@ func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
n.PtrBody().Append(fn)
// i = len(a) - 1
- v1 = ir.Nod(ir.OAS, v1, ir.Nod(ir.OSUB, ir.Nod(ir.OLEN, a, nil), nodintconst(1)))
+ v1 = ir.NewAssignStmt(base.Pos, v1, ir.NewBinaryExpr(base.Pos, ir.OSUB, ir.NewUnaryExpr(base.Pos, ir.OLEN, a), nodintconst(1)))
n.PtrBody().Append(v1)
@@ -605,12 +605,12 @@ func arrayClear(loop *ir.RangeStmt, v1, v2, a ir.Node) ir.Node {
func addptr(p ir.Node, n int64) ir.Node {
t := p.Type()
- p = ir.Nod(ir.OCONVNOP, p, nil)
+ p = ir.NewConvExpr(base.Pos, ir.OCONVNOP, nil, p)
p.SetType(types.Types[types.TUINTPTR])
- p = ir.Nod(ir.OADD, p, nodintconst(n))
+ p = ir.NewBinaryExpr(base.Pos, ir.OADD, p, nodintconst(n))
- p = ir.Nod(ir.OCONVNOP, p, nil)
+ p = ir.NewConvExpr(base.Pos, ir.OCONVNOP, nil, p)
p.SetType(t)
return p