From: Jorropo Date: Wed, 14 Aug 2024 19:25:08 +0000 (+0200) Subject: cmd/compile: compute Trunc's limits from argument's limits X-Git-Tag: go1.24rc1~1041 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4f2c0e5d0806a2f6fbe2d0704683d2b71d8191be;p=gostls13.git cmd/compile: compute Trunc's limits from argument's limits Change-Id: I419faa781db085b98ea25008ca127d0317fb34e1 Reviewed-on: https://go-review.googlesource.com/c/go/+/605695 Reviewed-by: Keith Randall Reviewed-by: David Chase Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Carlos Amedee --- diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index f76e863453..8a351545c9 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -1643,6 +1643,11 @@ func (ft *factsTable) flowLimit(v *Value) bool { case OpSignExt8to64, OpSignExt8to32, OpSignExt8to16, OpSignExt16to64, OpSignExt16to32, OpSignExt32to64: a := ft.limits[v.Args[0].ID] return ft.signedMinMax(v, a.min, a.max) + case OpTrunc64to8, OpTrunc64to16, OpTrunc64to32, OpTrunc32to8, OpTrunc32to16, OpTrunc16to8: + a := ft.limits[v.Args[0].ID] + if a.umax <= 1<<(uint64(v.Type.Size())*8)-1 { + return ft.unsignedMinMax(v, a.umin, a.umax) + } // math/bits case OpCtz64: diff --git a/test/prove.go b/test/prove.go index 28b950ce41..16f7b7de96 100644 --- a/test/prove.go +++ b/test/prove.go @@ -1586,6 +1586,26 @@ func div64s(a, b int64, ensureAllBranchesCouldHappen func() bool) int64 { return z } +func trunc64to16(a uint64, ensureAllBranchesCouldHappen func() bool) uint16 { + a &= 0xfff + a |= 0xff + + z := uint16(a) + if ensureAllBranchesCouldHappen() && z > 0xfff { // ERROR "Disproved Less16U$" + return 42 + } + if ensureAllBranchesCouldHappen() && z <= 0xfff { // ERROR "Proved Leq16U$" + return 1337 + } + if ensureAllBranchesCouldHappen() && z < 0xff { // ERROR "Disproved Less16U$" + return 42 + } + if ensureAllBranchesCouldHappen() && z >= 0xff { // ERROR "Proved Leq16U$" + return 1337 + } + return z +} + //go:noinline func useInt(a int) { }