From: Jorropo Date: Wed, 7 Aug 2024 19:40:43 +0000 (+0200) Subject: cmd/compile: do constant folding for BitLen* X-Git-Tag: go1.24rc1~1063 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=090f03fd2f276341d1d93fc289fe346d44b0f4be;p=gostls13.git cmd/compile: do constant folding for BitLen* Change-Id: I56c27d606b55ea882f4db264fd4735b0cccdf7c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/604015 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules index 61a2602af8..65cd985484 100644 --- a/src/cmd/compile/internal/ssa/_gen/generic.rules +++ b/src/cmd/compile/internal/ssa/_gen/generic.rules @@ -58,6 +58,14 @@ (Round64F x:(Const64F)) => x (CvtBoolToUint8 (ConstBool [false])) => (Const8 [0]) (CvtBoolToUint8 (ConstBool [true])) => (Const8 [1]) +(BitLen64 (Const64 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len64(uint64(c)))]) +(BitLen32 (Const32 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len32(uint32(c)))]) +(BitLen16 (Const16 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len16(uint16(c)))]) +(BitLen8 (Const8 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len8(uint8(c)))]) +(BitLen64 (Const64 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len64(uint64(c)))]) +(BitLen32 (Const32 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len32(uint32(c)))]) +(BitLen16 (Const16 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len16(uint16(c)))]) +(BitLen8 (Const8 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len8(uint8(c)))]) (Trunc16to8 (ZeroExt8to16 x)) => x (Trunc32to8 (ZeroExt8to32 x)) => x diff --git a/src/cmd/compile/internal/ssa/_gen/rulegen.go b/src/cmd/compile/internal/ssa/_gen/rulegen.go index 072df298f3..b635631501 100644 --- a/src/cmd/compile/internal/ssa/_gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/_gen/rulegen.go @@ -582,6 +582,7 @@ func fprint(w io.Writer, n Node) { "fmt", "internal/buildcfg", "math", + "math/bits", "cmd/internal/obj", "cmd/compile/internal/base", "cmd/compile/internal/types", diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index cfed828a82..beeb548ad7 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -3,6 +3,7 @@ package ssa import "math" +import "math/bits" import "cmd/internal/obj" import "cmd/compile/internal/types" import "cmd/compile/internal/ir" @@ -35,6 +36,14 @@ func rewriteValuegeneric(v *Value) bool { return rewriteValuegeneric_OpAndB(v) case OpArraySelect: return rewriteValuegeneric_OpArraySelect(v) + case OpBitLen16: + return rewriteValuegeneric_OpBitLen16(v) + case OpBitLen32: + return rewriteValuegeneric_OpBitLen32(v) + case OpBitLen64: + return rewriteValuegeneric_OpBitLen64(v) + case OpBitLen8: + return rewriteValuegeneric_OpBitLen8(v) case OpCeil: return rewriteValuegeneric_OpCeil(v) case OpCom16: @@ -5288,6 +5297,150 @@ func rewriteValuegeneric_OpArraySelect(v *Value) bool { } return false } +func rewriteValuegeneric_OpBitLen16(v *Value) bool { + v_0 := v.Args[0] + b := v.Block + config := b.Func.Config + // match: (BitLen16 (Const16 [c])) + // cond: config.PtrSize == 8 + // result: (Const64 [int64(bits.Len16(uint16(c)))]) + for { + if v_0.Op != OpConst16 { + break + } + c := auxIntToInt16(v_0.AuxInt) + if !(config.PtrSize == 8) { + break + } + v.reset(OpConst64) + v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c)))) + return true + } + // match: (BitLen16 (Const16 [c])) + // cond: config.PtrSize == 4 + // result: (Const32 [int32(bits.Len16(uint16(c)))]) + for { + if v_0.Op != OpConst16 { + break + } + c := auxIntToInt16(v_0.AuxInt) + if !(config.PtrSize == 4) { + break + } + v.reset(OpConst32) + v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c)))) + return true + } + return false +} +func rewriteValuegeneric_OpBitLen32(v *Value) bool { + v_0 := v.Args[0] + b := v.Block + config := b.Func.Config + // match: (BitLen32 (Const32 [c])) + // cond: config.PtrSize == 8 + // result: (Const64 [int64(bits.Len32(uint32(c)))]) + for { + if v_0.Op != OpConst32 { + break + } + c := auxIntToInt32(v_0.AuxInt) + if !(config.PtrSize == 8) { + break + } + v.reset(OpConst64) + v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c)))) + return true + } + // match: (BitLen32 (Const32 [c])) + // cond: config.PtrSize == 4 + // result: (Const32 [int32(bits.Len32(uint32(c)))]) + for { + if v_0.Op != OpConst32 { + break + } + c := auxIntToInt32(v_0.AuxInt) + if !(config.PtrSize == 4) { + break + } + v.reset(OpConst32) + v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c)))) + return true + } + return false +} +func rewriteValuegeneric_OpBitLen64(v *Value) bool { + v_0 := v.Args[0] + b := v.Block + config := b.Func.Config + // match: (BitLen64 (Const64 [c])) + // cond: config.PtrSize == 8 + // result: (Const64 [int64(bits.Len64(uint64(c)))]) + for { + if v_0.Op != OpConst64 { + break + } + c := auxIntToInt64(v_0.AuxInt) + if !(config.PtrSize == 8) { + break + } + v.reset(OpConst64) + v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c)))) + return true + } + // match: (BitLen64 (Const64 [c])) + // cond: config.PtrSize == 4 + // result: (Const32 [int32(bits.Len64(uint64(c)))]) + for { + if v_0.Op != OpConst64 { + break + } + c := auxIntToInt64(v_0.AuxInt) + if !(config.PtrSize == 4) { + break + } + v.reset(OpConst32) + v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c)))) + return true + } + return false +} +func rewriteValuegeneric_OpBitLen8(v *Value) bool { + v_0 := v.Args[0] + b := v.Block + config := b.Func.Config + // match: (BitLen8 (Const8 [c])) + // cond: config.PtrSize == 8 + // result: (Const64 [int64(bits.Len8(uint8(c)))]) + for { + if v_0.Op != OpConst8 { + break + } + c := auxIntToInt8(v_0.AuxInt) + if !(config.PtrSize == 8) { + break + } + v.reset(OpConst64) + v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c)))) + return true + } + // match: (BitLen8 (Const8 [c])) + // cond: config.PtrSize == 4 + // result: (Const32 [int32(bits.Len8(uint8(c)))]) + for { + if v_0.Op != OpConst8 { + break + } + c := auxIntToInt8(v_0.AuxInt) + if !(config.PtrSize == 4) { + break + } + v.reset(OpConst32) + v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c)))) + return true + } + return false +} func rewriteValuegeneric_OpCeil(v *Value) bool { v_0 := v.Args[0] // match: (Ceil (Const64F [c]))