cmd/compile: simplify SliceCap when it equals SliceLen

Shows up occassionally, especially after p = p[:8:len(p)]

Updates #14905

Change-Id: Iab35ef2eac57817e6a10c6aaeeb84709e8021641
Reviewed-on: https://go-review.googlesource.com/21025
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules
index 059914d..d405419 100644
--- a/src/cmd/compile/internal/ssa/gen/generic.rules
+++ b/src/cmd/compile/internal/ssa/gen/generic.rules
@@ -596,6 +596,7 @@
 (SlicePtr (SliceMake (SlicePtr x) _ _)) -> (SlicePtr x)
 (SliceLen (SliceMake _ (SliceLen x) _)) -> (SliceLen x)
 (SliceCap (SliceMake _ _ (SliceCap x))) -> (SliceCap x)
+(SliceCap (SliceMake _ _ (SliceLen x))) -> (SliceLen x)
 
 (ConstSlice) && config.PtrSize == 4 ->
   (SliceMake
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index 4094d86..518240f 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -2727,13 +2727,15 @@
 	// cond: (1 << 8) <= int32(c)
 	// result: (ConstBool [1])
 	for {
-		if v.Args[0].Op != OpZeroExt8to32 {
+		v_0 := v.Args[0]
+		if v_0.Op != OpZeroExt8to32 {
 			break
 		}
-		if v.Args[1].Op != OpConst32 {
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst32 {
 			break
 		}
-		c := v.Args[1].AuxInt
+		c := v_1.AuxInt
 		if !((1 << 8) <= int32(c)) {
 			break
 		}
@@ -2745,13 +2747,15 @@
 	// cond: (1 << 8) <= c
 	// result: (ConstBool [1])
 	for {
-		if v.Args[0].Op != OpZeroExt8to64 {
+		v_0 := v.Args[0]
+		if v_0.Op != OpZeroExt8to64 {
 			break
 		}
-		if v.Args[1].Op != OpConst64 {
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst64 {
 			break
 		}
-		c := v.Args[1].AuxInt
+		c := v_1.AuxInt
 		if !((1 << 8) <= c) {
 			break
 		}
@@ -2763,13 +2767,15 @@
 	// cond: (1 << 16) <= int32(c)
 	// result: (ConstBool [1])
 	for {
-		if v.Args[0].Op != OpZeroExt16to32 {
+		v_0 := v.Args[0]
+		if v_0.Op != OpZeroExt16to32 {
 			break
 		}
-		if v.Args[1].Op != OpConst32 {
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst32 {
 			break
 		}
-		c := v.Args[1].AuxInt
+		c := v_1.AuxInt
 		if !((1 << 16) <= int32(c)) {
 			break
 		}
@@ -2781,13 +2787,15 @@
 	// cond: (1 << 16) <= c
 	// result: (ConstBool [1])
 	for {
-		if v.Args[0].Op != OpZeroExt16to64 {
+		v_0 := v.Args[0]
+		if v_0.Op != OpZeroExt16to64 {
 			break
 		}
-		if v.Args[1].Op != OpConst64 {
+		v_1 := v.Args[1]
+		if v_1.Op != OpConst64 {
 			break
 		}
-		c := v.Args[1].AuxInt
+		c := v_1.AuxInt
 		if !((1 << 16) <= c) {
 			break
 		}
@@ -7705,6 +7713,23 @@
 		v.AddArg(x)
 		return true
 	}
+	// match: (SliceCap (SliceMake _ _ (SliceLen x)))
+	// cond:
+	// result: (SliceLen x)
+	for {
+		v_0 := v.Args[0]
+		if v_0.Op != OpSliceMake {
+			break
+		}
+		v_0_2 := v_0.Args[2]
+		if v_0_2.Op != OpSliceLen {
+			break
+		}
+		x := v_0_2.Args[0]
+		v.reset(OpSliceLen)
+		v.AddArg(x)
+		return true
+	}
 	return false
 }
 func rewriteValuegeneric_OpSliceLen(v *Value, config *Config) bool {