]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: simplify SliceCap when it equals SliceLen
authorAlexandru Moșoi <mosoi@google.com>
Tue, 22 Mar 2016 16:34:36 +0000 (17:34 +0100)
committerAlexandru Moșoi <alexandru@mosoi.ro>
Tue, 22 Mar 2016 16:56:03 +0000 (16:56 +0000)
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>

src/cmd/compile/internal/ssa/gen/generic.rules
src/cmd/compile/internal/ssa/rewritegeneric.go

index 059914d9796d95ac41d353f04520957bacb220b4..d405419905ba79cb570eebc934d37a2190d92b57 100644 (file)
 (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
index 4094d862da900a3dc3dc5c60319b5e7caba20ca6..518240f6b79a832dd05a83df59a75e221c2980ed 100644 (file)
@@ -2727,13 +2727,15 @@ func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
        // 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 @@ func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
        // 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 @@ func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
        // 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 @@ func rewriteValuegeneric_OpIsInBounds(v *Value, config *Config) bool {
        // 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 @@ func rewriteValuegeneric_OpSliceCap(v *Value, config *Config) bool {
                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 {