cmd/compile: use int for field index
All of a struct's fields have to fit into memory anyway, so index them
with int instead of int64. This also makes it nicer for
cmd/compile/internal/gc to reuse the same NumFields function.
Change-Id: I210be804a0c33370ec9977414918c02c675b0fbe
Reviewed-on: https://go-review.googlesource.com/20691
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 805420b..56f2474 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -1865,7 +1865,7 @@
t := n.Left.Type
if canSSAType(t) {
v := s.expr(n.Left)
- return s.newValue1I(ssa.OpStructSelect, n.Type, fieldIdx(n), v)
+ return s.newValue1I(ssa.OpStructSelect, n.Type, int64(fieldIdx(n)), v)
}
p := s.addr(n, false)
return s.newValue2(ssa.OpLoad, n.Type, p, s.mem())
@@ -1956,7 +1956,7 @@
// eface type could also be struct{p *byte; q [0]int}
continue
}
- data = s.newValue1I(ssa.OpStructSelect, f, i, data)
+ data = s.newValue1I(ssa.OpStructSelect, f, int64(i), data)
break
}
default:
@@ -2186,11 +2186,11 @@
new := s.newValue0(ssa.StructMakeOp(t.NumFields()), t)
// Add fields as args.
- for i := int64(0); i < nf; i++ {
+ for i := 0; i < nf; i++ {
if i == idx {
new.AddArg(right)
} else {
- new.AddArg(s.newValue1I(ssa.OpStructSelect, t.FieldType(i), i, old))
+ new.AddArg(s.newValue1I(ssa.OpStructSelect, t.FieldType(i), int64(i), old))
}
}
@@ -2280,7 +2280,7 @@
case t.IsStruct():
n := t.NumFields()
v := s.entryNewValue0(ssa.StructMakeOp(t.NumFields()), t)
- for i := int64(0); i < n; i++ {
+ for i := 0; i < n; i++ {
v.AddArg(s.zeroVal(t.FieldType(i).(*Type)))
}
return v
@@ -2883,10 +2883,10 @@
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, s.config.IntSize, left, itab, s.mem())
case t.IsStruct():
n := t.NumFields()
- for i := int64(0); i < n; i++ {
+ for i := 0; i < n; i++ {
ft := t.FieldType(i)
addr := s.newValue1I(ssa.OpOffPtr, ft.PtrTo(), t.FieldOff(i), left)
- val := s.newValue1I(ssa.OpStructSelect, ft, i, right)
+ val := s.newValue1I(ssa.OpStructSelect, ft, int64(i), right)
s.storeTypeScalars(ft.(*Type), addr, val)
}
default:
@@ -2912,13 +2912,13 @@
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, s.config.PtrSize, idataAddr, idata, s.mem())
case t.IsStruct():
n := t.NumFields()
- for i := int64(0); i < n; i++ {
+ for i := 0; i < n; i++ {
ft := t.FieldType(i)
if !haspointers(ft.(*Type)) {
continue
}
addr := s.newValue1I(ssa.OpOffPtr, ft.PtrTo(), t.FieldOff(i), left)
- val := s.newValue1I(ssa.OpStructSelect, ft, i, right)
+ val := s.newValue1I(ssa.OpStructSelect, ft, int64(i), right)
s.storeTypePtrs(ft.(*Type), addr, val)
}
default:
@@ -2943,13 +2943,13 @@
s.rtcall(writebarrierptr, true, nil, idataAddr, idata)
case t.IsStruct():
n := t.NumFields()
- for i := int64(0); i < n; i++ {
+ for i := 0; i < n; i++ {
ft := t.FieldType(i)
if !haspointers(ft.(*Type)) {
continue
}
addr := s.newValue1I(ssa.OpOffPtr, ft.PtrTo(), t.FieldOff(i), left)
- val := s.newValue1I(ssa.OpStructSelect, ft, i, right)
+ val := s.newValue1I(ssa.OpStructSelect, ft, int64(i), right)
s.storeTypePtrsWB(ft.(*Type), addr, val)
}
default:
@@ -3935,14 +3935,14 @@
}
// fieldIdx finds the index of the field referred to by the ODOT node n.
-func fieldIdx(n *Node) int64 {
+func fieldIdx(n *Node) int {
t := n.Left.Type
f := n.Right
if t.Etype != TSTRUCT {
panic("ODOT's LHS is not a struct")
}
- var i int64
+ var i int
for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
if t1.Sym != f.Sym {
i++