From: Alexandru Moșoi Date: Tue, 22 Mar 2016 16:34:36 +0000 (+0100) Subject: cmd/compile: simplify SliceCap when it equals SliceLen X-Git-Tag: go1.7beta1~1155 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e61db3119ca0767b255b784005d2636f8d4b611e;p=gostls13.git 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 Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 059914d979..d405419905 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 4094d862da..518240f6b7 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -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 {