aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2025-08-20 12:29:02 -0400
committerDavid Chase <drchase@google.com>2025-08-20 15:13:04 -0700
commit7c84e984e675e44a2abc9aa25dd68cb9c9d08ec5 (patch)
tree91970f18429a0466f473e0282d552c3df6f58064 /src/cmd/compile/internal
parentcf31b1563534d6c4f8d2be87cbfdebd6e61ad479 (diff)
downloadgo-7c84e984e675e44a2abc9aa25dd68cb9c9d08ec5.tar.xz
[dev.simd] cmd/compile: rewrite to elide Slicemask from len==c>0 slicing
This might have been something that prove could be educated into figuring out, but this also works, and it also helps prove downstream. Adjusted the prove test, because this change moved a message. Change-Id: I5eabe639eff5db9cd9766a6a8666fdb4973829cb Reviewed-on: https://go-review.googlesource.com/c/go/+/697715 Commit-Queue: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Bypass: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/generic.rules4
-rw-r--r--src/cmd/compile/internal/ssa/rewritegeneric.go87
2 files changed, 91 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules
index 00e8fcbe32..8583cfae40 100644
--- a/src/cmd/compile/internal/ssa/_gen/generic.rules
+++ b/src/cmd/compile/internal/ssa/_gen/generic.rules
@@ -989,6 +989,10 @@
(Const64 <typ.Int> [0])
(Const64 <typ.Int> [0]))
+// Special rule to help constant slicing; len > 0 implies cap > 0 implies Slicemask is all 1
+(SliceMake (AddPtr <t> x (And64 y (Slicemask _))) w:(Const64 [c]) z) && c > 0 => (SliceMake (AddPtr <t> x y) w z)
+(SliceMake (AddPtr <t> x (And32 y (Slicemask _))) w:(Const32 [c]) z) && c > 0 => (SliceMake (AddPtr <t> x y) w z)
+
// interface ops
(ConstInterface) =>
(IMake
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index fe61ceaff2..c9cff8651b 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -422,6 +422,8 @@ func rewriteValuegeneric(v *Value) bool {
return rewriteValuegeneric_OpSliceCap(v)
case OpSliceLen:
return rewriteValuegeneric_OpSliceLen(v)
+ case OpSliceMake:
+ return rewriteValuegeneric_OpSliceMake(v)
case OpSlicePtr:
return rewriteValuegeneric_OpSlicePtr(v)
case OpSlicemask:
@@ -30645,6 +30647,91 @@ func rewriteValuegeneric_OpSliceLen(v *Value) bool {
}
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) _ _))