[dev.ssa] src/cmd/compile/internal/ssa/gen: detect type earlier when generating rules.

Removes approx. one assignment per rule.

Change-Id: Ie9f0a7082ae12c4447ff6b4d40678cd92bdbb6f2
Reviewed-on: https://go-review.googlesource.com/19194
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index 60d9f06..b9e4d18 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -528,13 +528,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
 		v0.Aux = n
 		v0.AuxInt = off
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
 		v1.Aux = n
 		v1.AuxInt = off + config.PtrSize
 		v.AddArg(v1)
@@ -556,18 +554,15 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
 		v0.Aux = n
 		v0.AuxInt = off
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
 		v1.Aux = n
 		v1.AuxInt = off + config.PtrSize
 		v.AddArg(v1)
-		v2 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v2.Type = config.fe.TypeInt()
+		v2 := b.NewValue0(v.Line, OpArg, config.fe.TypeInt())
 		v2.Aux = n
 		v2.AuxInt = off + 2*config.PtrSize
 		v.AddArg(v2)
@@ -589,13 +584,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
 		v0.Aux = n
 		v0.AuxInt = off
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = config.fe.TypeBytePtr()
+		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeBytePtr())
 		v1.Aux = n
 		v1.AuxInt = off + config.PtrSize
 		v.AddArg(v1)
@@ -617,13 +610,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = config.fe.TypeFloat64()
+		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
 		v0.Aux = n
 		v0.AuxInt = off
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = config.fe.TypeFloat64()
+		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat64())
 		v1.Aux = n
 		v1.AuxInt = off + 8
 		v.AddArg(v1)
@@ -645,13 +636,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = config.fe.TypeFloat32()
+		v0 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
 		v0.Aux = n
 		v0.AuxInt = off
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = config.fe.TypeFloat32()
+		v1 := b.NewValue0(v.Line, OpArg, config.fe.TypeFloat32())
 		v1.Aux = n
 		v1.AuxInt = off + 4
 		v.AddArg(v1)
@@ -691,8 +680,7 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
 		v0.Aux = n
 		v0.AuxInt = off + t.FieldOff(0)
 		v.AddArg(v0)
@@ -715,13 +703,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
 		v0.Aux = n
 		v0.AuxInt = off + t.FieldOff(0)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = t.FieldType(1)
+		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
 		v1.Aux = n
 		v1.AuxInt = off + t.FieldOff(1)
 		v.AddArg(v1)
@@ -744,18 +730,15 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
 		v0.Aux = n
 		v0.AuxInt = off + t.FieldOff(0)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = t.FieldType(1)
+		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
 		v1.Aux = n
 		v1.AuxInt = off + t.FieldOff(1)
 		v.AddArg(v1)
-		v2 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v2.Type = t.FieldType(2)
+		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
 		v2.Aux = n
 		v2.AuxInt = off + t.FieldOff(2)
 		v.AddArg(v2)
@@ -778,23 +761,19 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpArg, t.FieldType(0))
 		v0.Aux = n
 		v0.AuxInt = off + t.FieldOff(0)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v1.Type = t.FieldType(1)
+		v1 := b.NewValue0(v.Line, OpArg, t.FieldType(1))
 		v1.Aux = n
 		v1.AuxInt = off + t.FieldOff(1)
 		v.AddArg(v1)
-		v2 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v2.Type = t.FieldType(2)
+		v2 := b.NewValue0(v.Line, OpArg, t.FieldType(2))
 		v2.Aux = n
 		v2.AuxInt = off + t.FieldOff(2)
 		v.AddArg(v2)
-		v3 := b.NewValue0(v.Line, OpArg, TypeInvalid)
-		v3.Type = t.FieldType(3)
+		v3 := b.NewValue0(v.Line, OpArg, t.FieldType(3))
 		v3.Aux = n
 		v3.AuxInt = off + t.FieldOff(3)
 		v.AddArg(v3)
@@ -825,8 +804,7 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpPtrIndex, TypeInvalid)
-		v0.Type = v.Type.PtrTo()
+		v0 := b.NewValue0(v.Line, OpPtrIndex, v.Type.PtrTo())
 		v0.AddArg(ptr)
 		v0.AddArg(idx)
 		v.AddArg(v0)
@@ -993,11 +971,9 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v1.Type = config.fe.TypeBytePtr()
+		v1 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v1)
 		return true
 	}
@@ -1020,15 +996,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpConst32, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
 		v1.AuxInt = 0
 		v.AddArg(v1)
-		v2 := b.NewValue0(v.Line, OpConst32, TypeInvalid)
-		v2.Type = config.fe.TypeInt()
+		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
 		v2.AuxInt = 0
 		v.AddArg(v2)
 		return true
@@ -1047,15 +1020,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpConst64, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
 		v1.AuxInt = 0
 		v.AddArg(v1)
-		v2 := b.NewValue0(v.Line, OpConst64, TypeInvalid)
-		v2.Type = config.fe.TypeInt()
+		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
 		v2.AuxInt = 0
 		v.AddArg(v2)
 		return true
@@ -1080,11 +1050,9 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpConst32, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
 		v1.AuxInt = 0
 		v.AddArg(v1)
 		return true
@@ -1104,11 +1072,9 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpConstNil, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpConstNil, config.fe.TypeBytePtr())
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpConst64, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
 		v1.AuxInt = 0
 		v.AddArg(v1)
 		return true
@@ -1128,15 +1094,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpAddr, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
 		v0.Aux = config.fe.StringData(s.(string))
-		v1 := b.NewValue0(v.Line, OpSB, TypeInvalid)
-		v1.Type = config.fe.TypeUintptr()
+		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
 		v0.AddArg(v1)
 		v.AddArg(v0)
-		v2 := b.NewValue0(v.Line, OpConst32, TypeInvalid)
-		v2.Type = config.fe.TypeInt()
+		v2 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
 		v2.AuxInt = int64(len(s.(string)))
 		v.AddArg(v2)
 		return true
@@ -1156,15 +1119,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpAddr, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpAddr, config.fe.TypeBytePtr())
 		v0.Aux = config.fe.StringData(s.(string))
-		v1 := b.NewValue0(v.Line, OpSB, TypeInvalid)
-		v1.Type = config.fe.TypeUintptr()
+		v1 := b.NewValue0(v.Line, OpSB, config.fe.TypeUintptr())
 		v0.AddArg(v1)
 		v.AddArg(v0)
-		v2 := b.NewValue0(v.Line, OpConst64, TypeInvalid)
-		v2.Type = config.fe.TypeInt()
+		v2 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
 		v2.AuxInt = int64(len(s.(string)))
 		v.AddArg(v2)
 		return true
@@ -1666,13 +1626,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpITab, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
 		v0.AddArg(x)
-		v0.Type = config.fe.TypeBytePtr()
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpITab, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
 		v1.AddArg(y)
-		v1.Type = config.fe.TypeBytePtr()
 		v.AddArg(v1)
 		return true
 	}
@@ -1696,9 +1654,8 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpIsNonNil, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
 		v0.AddArg(p)
-		v0.Type = config.fe.TypeBool()
 		v.AddArg(v0)
 		return true
 	}
@@ -1717,9 +1674,8 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpIsNonNil, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpIsNonNil, config.fe.TypeBool())
 		v0.AddArg(p)
-		v0.Type = config.fe.TypeBool()
 		v.AddArg(v0)
 		return true
 	}
@@ -1741,13 +1697,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpSlicePtr, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
 		v0.AddArg(x)
-		v0.Type = config.fe.TypeBytePtr()
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpSlicePtr, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
 		v1.AddArg(y)
-		v1.Type = config.fe.TypeBytePtr()
 		v.AddArg(v1)
 		return true
 	}
@@ -2800,8 +2754,7 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
@@ -2824,15 +2777,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = t.FieldType(1)
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = t.FieldType(1).PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
+		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v2.AuxInt = t.FieldOff(1)
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
@@ -2857,24 +2807,19 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = t.FieldType(1)
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = t.FieldType(1).PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
+		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v2.AuxInt = t.FieldOff(1)
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
 		v1.AddArg(mem)
 		v.AddArg(v1)
-		v3 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v3.Type = t.FieldType(2)
-		v4 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v4.Type = t.FieldType(2).PtrTo()
+		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
+		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 		v4.AuxInt = t.FieldOff(2)
 		v4.AddArg(ptr)
 		v3.AddArg(v4)
@@ -2899,33 +2844,26 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = t.FieldType(0)
+		v0 := b.NewValue0(v.Line, OpLoad, t.FieldType(0))
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = t.FieldType(1)
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = t.FieldType(1).PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, t.FieldType(1))
+		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v2.AuxInt = t.FieldOff(1)
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
 		v1.AddArg(mem)
 		v.AddArg(v1)
-		v3 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v3.Type = t.FieldType(2)
-		v4 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v4.Type = t.FieldType(2).PtrTo()
+		v3 := b.NewValue0(v.Line, OpLoad, t.FieldType(2))
+		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 		v4.AuxInt = t.FieldOff(2)
 		v4.AddArg(ptr)
 		v3.AddArg(v4)
 		v3.AddArg(mem)
 		v.AddArg(v3)
-		v5 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v5.Type = t.FieldType(3)
-		v6 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v6.Type = t.FieldType(3).PtrTo()
+		v5 := b.NewValue0(v.Line, OpLoad, t.FieldType(3))
+		v6 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
 		v6.AuxInt = t.FieldOff(3)
 		v6.AddArg(ptr)
 		v5.AddArg(v6)
@@ -2950,15 +2888,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = config.fe.TypeFloat32()
+		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = config.fe.TypeFloat32()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeFloat32().PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat32())
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
 		v2.AuxInt = 4
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
@@ -2983,15 +2918,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = config.fe.TypeFloat64()
+		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = config.fe.TypeFloat64()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeFloat64().PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeFloat64())
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
 		v2.AuxInt = 8
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
@@ -3016,15 +2948,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeInt().PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v2.AuxInt = config.PtrSize
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
@@ -3049,24 +2978,19 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeInt().PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v2.AuxInt = config.PtrSize
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
 		v1.AddArg(mem)
 		v.AddArg(v1)
-		v3 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v3.Type = config.fe.TypeInt()
-		v4 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v4.Type = config.fe.TypeInt().PtrTo()
+		v3 := b.NewValue0(v.Line, OpLoad, config.fe.TypeInt())
+		v4 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v4.AuxInt = 2 * config.PtrSize
 		v4.AddArg(ptr)
 		v3.AddArg(v4)
@@ -3091,15 +3015,12 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr()
+		v0 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
 		v0.AddArg(ptr)
 		v0.AddArg(mem)
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpLoad, TypeInvalid)
-		v1.Type = config.fe.TypeBytePtr()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeBytePtr().PtrTo()
+		v1 := b.NewValue0(v.Line, OpLoad, config.fe.TypeBytePtr())
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
 		v2.AuxInt = config.PtrSize
 		v2.AddArg(ptr)
 		v1.AddArg(v2)
@@ -3657,13 +3578,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpITab, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
 		v0.AddArg(x)
-		v0.Type = config.fe.TypeBytePtr()
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpITab, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpITab, config.fe.TypeBytePtr())
 		v1.AddArg(y)
-		v1.Type = config.fe.TypeBytePtr()
 		v.AddArg(v1)
 		return true
 	}
@@ -3726,13 +3645,11 @@
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
-		v0 := b.NewValue0(v.Line, OpSlicePtr, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
 		v0.AddArg(x)
-		v0.Type = config.fe.TypeBytePtr()
 		v.AddArg(v0)
-		v1 := b.NewValue0(v.Line, OpSlicePtr, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpSlicePtr, config.fe.TypeBytePtr())
 		v1.AddArg(y)
-		v1.Type = config.fe.TypeBytePtr()
 		v.AddArg(v1)
 		return true
 	}
@@ -3855,11 +3772,9 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AddArg(ptr)
-		v0 := b.NewValue0(v.Line, OpMul32, TypeInvalid)
-		v0.Type = config.fe.TypeInt()
+		v0 := b.NewValue0(v.Line, OpMul32, config.fe.TypeInt())
 		v0.AddArg(idx)
-		v1 := b.NewValue0(v.Line, OpConst32, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst32, config.fe.TypeInt())
 		v1.AuxInt = t.Elem().Size()
 		v0.AddArg(v1)
 		v.AddArg(v0)
@@ -3883,11 +3798,9 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AddArg(ptr)
-		v0 := b.NewValue0(v.Line, OpMul64, TypeInvalid)
-		v0.Type = config.fe.TypeInt()
+		v0 := b.NewValue0(v.Line, OpMul64, config.fe.TypeInt())
 		v0.AddArg(idx)
-		v1 := b.NewValue0(v.Line, OpConst64, TypeInvalid)
-		v1.Type = config.fe.TypeInt()
+		v1 := b.NewValue0(v.Line, OpConst64, config.fe.TypeInt())
 		v1.AuxInt = t.Elem().Size()
 		v0.AddArg(v1)
 		v.AddArg(v0)
@@ -4033,18 +3946,16 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = t.FieldType(1).Size()
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = t.FieldType(1).PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v0.AuxInt = t.FieldOff(1)
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(f1)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = t.FieldType(0).Size()
 		v1.AddArg(dst)
 		v1.AddArg(f0)
 		v1.AddArg(mem)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4069,28 +3980,24 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = t.FieldType(2).Size()
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = t.FieldType(2).PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 		v0.AuxInt = t.FieldOff(2)
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(f2)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = t.FieldType(1).Size()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = t.FieldType(1).PtrTo()
+		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v2.AuxInt = t.FieldOff(1)
 		v2.AddArg(dst)
 		v1.AddArg(v2)
 		v1.AddArg(f1)
-		v3 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v3.AuxInt = t.FieldType(0).Size()
 		v3.AddArg(dst)
 		v3.AddArg(f0)
 		v3.AddArg(mem)
-		v3.Type = TypeMem
 		v1.AddArg(v3)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4116,38 +4023,32 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = t.FieldType(3).Size()
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = t.FieldType(3).PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(3).PtrTo())
 		v0.AuxInt = t.FieldOff(3)
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(f3)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = t.FieldType(2).Size()
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = t.FieldType(2).PtrTo()
+		v2 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(2).PtrTo())
 		v2.AuxInt = t.FieldOff(2)
 		v2.AddArg(dst)
 		v1.AddArg(v2)
 		v1.AddArg(f2)
-		v3 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v3.AuxInt = t.FieldType(1).Size()
-		v4 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v4.Type = t.FieldType(1).PtrTo()
+		v4 := b.NewValue0(v.Line, OpOffPtr, t.FieldType(1).PtrTo())
 		v4.AuxInt = t.FieldOff(1)
 		v4.AddArg(dst)
 		v3.AddArg(v4)
 		v3.AddArg(f1)
-		v5 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v5 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v5.AuxInt = t.FieldType(0).Size()
 		v5.AddArg(dst)
 		v5.AddArg(f0)
 		v5.AddArg(mem)
-		v5.Type = TypeMem
 		v3.AddArg(v5)
-		v3.Type = TypeMem
 		v1.AddArg(v3)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4173,18 +4074,16 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = 4
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = config.fe.TypeFloat32().PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat32().PtrTo())
 		v0.AuxInt = 4
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(imag)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = 4
 		v1.AddArg(dst)
 		v1.AddArg(real)
 		v1.AddArg(mem)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4210,18 +4109,16 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = 8
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = config.fe.TypeFloat64().PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeFloat64().PtrTo())
 		v0.AuxInt = 8
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(imag)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = 8
 		v1.AddArg(dst)
 		v1.AddArg(real)
 		v1.AddArg(mem)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4247,18 +4144,16 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = config.PtrSize
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = config.fe.TypeInt().PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v0.AuxInt = config.PtrSize
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(len)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = config.PtrSize
 		v1.AddArg(dst)
 		v1.AddArg(ptr)
 		v1.AddArg(mem)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4285,28 +4180,24 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = config.PtrSize
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = config.fe.TypeInt().PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v0.AuxInt = 2 * config.PtrSize
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(cap)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = config.PtrSize
-		v2 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v2.Type = config.fe.TypeInt().PtrTo()
+		v2 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeInt().PtrTo())
 		v2.AuxInt = config.PtrSize
 		v2.AddArg(dst)
 		v1.AddArg(v2)
 		v1.AddArg(len)
-		v3 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v3 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v3.AuxInt = config.PtrSize
 		v3.AddArg(dst)
 		v3.AddArg(ptr)
 		v3.AddArg(mem)
-		v3.Type = TypeMem
 		v1.AddArg(v3)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4332,18 +4223,16 @@
 		v.Aux = nil
 		v.resetArgs()
 		v.AuxInt = config.PtrSize
-		v0 := b.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v0.Type = config.fe.TypeBytePtr().PtrTo()
+		v0 := b.NewValue0(v.Line, OpOffPtr, config.fe.TypeBytePtr().PtrTo())
 		v0.AuxInt = config.PtrSize
 		v0.AddArg(dst)
 		v.AddArg(v0)
 		v.AddArg(data)
-		v1 := b.NewValue0(v.Line, OpStore, TypeInvalid)
+		v1 := b.NewValue0(v.Line, OpStore, TypeMem)
 		v1.AuxInt = config.PtrSize
 		v1.AddArg(dst)
 		v1.AddArg(itab)
 		v1.AddArg(mem)
-		v1.Type = TypeMem
 		v.AddArg(v1)
 		return true
 	}
@@ -4410,10 +4299,9 @@
 		v.AuxInt = size
 		v.AddArg(dst)
 		v.AddArg(src)
-		v0 := b.NewValue0(v.Line, OpVarDef, TypeInvalid)
+		v0 := b.NewValue0(v.Line, OpVarDef, TypeMem)
 		v0.Aux = x
 		v0.AddArg(mem)
-		v0.Type = TypeMem
 		v.AddArg(v0)
 		return true
 	}
@@ -4704,15 +4592,13 @@
 		if !(!config.fe.CanSSA(t)) {
 			goto end2afd47b4fcaaab7a73325bd8a75e3e8e
 		}
-		v0 := v.Args[0].Block.NewValue0(v.Line, OpLoad, TypeInvalid)
+		v0 := v.Args[0].Block.NewValue0(v.Line, OpLoad, v.Type)
 		v.Op = OpCopy
 		v.AuxInt = 0
 		v.Aux = nil
 		v.resetArgs()
 		v.AddArg(v0)
-		v0.Type = v.Type
-		v1 := v.Args[0].Block.NewValue0(v.Line, OpOffPtr, TypeInvalid)
-		v1.Type = v.Type.PtrTo()
+		v1 := v.Args[0].Block.NewValue0(v.Line, OpOffPtr, v.Type.PtrTo())
 		v1.AuxInt = t.FieldOff(i)
 		v1.AddArg(ptr)
 		v0.AddArg(v1)