return rewriteValuegeneric_OpSliceCap(v)
case OpSliceLen:
return rewriteValuegeneric_OpSliceLen(v)
+ case OpSliceMake:
+ return rewriteValuegeneric_OpSliceMake(v)
case OpSlicePtr:
return rewriteValuegeneric_OpSlicePtr(v)
case OpSlicemask:
}
return false
}
+func rewriteValuegeneric_OpSliceMake(v *Value) bool {
+ v_2 := v.Args[2]
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ b := v.Block
+ // match: (SliceMake (AddPtr <t> x (And64 y (Slicemask _))) w:(Const64 [c]) z)
+ // cond: c > 0
+ // result: (SliceMake (AddPtr <t> x y) w z)
+ for {
+ if v_0.Op != OpAddPtr {
+ break
+ }
+ t := v_0.Type
+ _ = v_0.Args[1]
+ x := v_0.Args[0]
+ v_0_1 := v_0.Args[1]
+ if v_0_1.Op != OpAnd64 {
+ break
+ }
+ _ = v_0_1.Args[1]
+ v_0_1_0 := v_0_1.Args[0]
+ v_0_1_1 := v_0_1.Args[1]
+ for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
+ y := v_0_1_0
+ if v_0_1_1.Op != OpSlicemask {
+ continue
+ }
+ w := v_1
+ if w.Op != OpConst64 {
+ continue
+ }
+ c := auxIntToInt64(w.AuxInt)
+ z := v_2
+ if !(c > 0) {
+ continue
+ }
+ v.reset(OpSliceMake)
+ v0 := b.NewValue0(v.Pos, OpAddPtr, t)
+ v0.AddArg2(x, y)
+ v.AddArg3(v0, w, z)
+ return true
+ }
+ break
+ }
+ // match: (SliceMake (AddPtr <t> x (And32 y (Slicemask _))) w:(Const32 [c]) z)
+ // cond: c > 0
+ // result: (SliceMake (AddPtr <t> x y) w z)
+ for {
+ if v_0.Op != OpAddPtr {
+ break
+ }
+ t := v_0.Type
+ _ = v_0.Args[1]
+ x := v_0.Args[0]
+ v_0_1 := v_0.Args[1]
+ if v_0_1.Op != OpAnd32 {
+ break
+ }
+ _ = v_0_1.Args[1]
+ v_0_1_0 := v_0_1.Args[0]
+ v_0_1_1 := v_0_1.Args[1]
+ for _i0 := 0; _i0 <= 1; _i0, v_0_1_0, v_0_1_1 = _i0+1, v_0_1_1, v_0_1_0 {
+ y := v_0_1_0
+ if v_0_1_1.Op != OpSlicemask {
+ continue
+ }
+ w := v_1
+ if w.Op != OpConst32 {
+ continue
+ }
+ c := auxIntToInt32(w.AuxInt)
+ z := v_2
+ if !(c > 0) {
+ continue
+ }
+ v.reset(OpSliceMake)
+ v0 := b.NewValue0(v.Pos, OpAddPtr, t)
+ v0.AddArg2(x, y)
+ v.AddArg3(v0, w, z)
+ return true
+ }
+ break
+ }
+ return false
+}
func rewriteValuegeneric_OpSlicePtr(v *Value) bool {
v_0 := v.Args[0]
// match: (SlicePtr (SliceMake (SlicePtr x) _ _))
func sm1(b []int, x int) {
// Test constant argument to slicemask.
- useSlice(b[2:8]) // ERROR "Proved slicemask not needed$"
+ useSlice(b[2:8]) // optimized away earlier by rewrite
// Test non-constant argument with known limits.
if cap(b) > 10 {
- useSlice(b[2:])
+ useSlice(b[2:]) // ERROR "Proved slicemask not needed$"
}
}