From: Jorropo Date: Sun, 9 Mar 2025 13:39:49 +0000 (+0100) Subject: cmd/compile: compute bits.OnesCount's limits from argument's limits X-Git-Tag: go1.25rc1~745 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=99411d784760992cc86596fc24ac5fd37e88515d;p=gostls13.git cmd/compile: compute bits.OnesCount's limits from argument's limits Change-Id: Ia90d48ea0fab363c8592221fad88958b522edefe Reviewed-on: https://go-review.googlesource.com/c/go/+/656159 Reviewed-by: David Chase Auto-Submit: Jorropo Reviewed-by: Keith Randall Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI --- diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index 9fedbdbbc9..1b5989e6e5 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -1732,6 +1732,14 @@ func (ft *factsTable) flowLimit(v *Value) bool { return ft.unsignedMax(v, uint64(bits.Len8(uint8(a.umax))-1)) } + case OpPopCount64, OpPopCount32, OpPopCount16, OpPopCount8: + a := ft.limits[v.Args[0].ID] + changingBitsCount := uint64(bits.Len64(a.umax ^ a.umin)) + sharedLeadingMask := ^(uint64(1)< bits.OnesCount64(maxv) { // ERROR "Disproved Less64$" + return 42 + } + if ensureAllBranchesCouldHappen() && z <= bits.OnesCount64(maxv) { // ERROR "Proved Leq64$" + return 4242 + } + if ensureAllBranchesCouldHappen() && z < bits.OnesCount64(minv) { // ERROR "Disproved Less64$" + return 424242 + } + if ensureAllBranchesCouldHappen() && z >= bits.OnesCount64(minv) { // ERROR "Proved Leq64$" + return 42424242 + } + return z +} + func main() { }