aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJorropo <jorropo.pgm@gmail.com>2025-07-04 09:25:23 +0200
committerGopher Robot <gobot@golang.org>2025-07-24 13:49:03 -0700
commitd574856482859d259a95826dea404e648cbb8fef (patch)
tree28d24d102c305ac460c254554e653fa2a46436a3 /src
parent1a72920f0907259ca9c8fa73679242ca9774e353 (diff)
downloadgo-d574856482859d259a95826dea404e648cbb8fef.tar.xz
cmd/compile: learn transitive proofs for safe negative signed adds
I've split this into it's own CL to make git bisect more effective. Change-Id: Ib2c6dbc82fb04f50f2d17fbe6626c9fc322fb478 Reviewed-on: https://go-review.googlesource.com/c/go/+/685820 Auto-Submit: Michael Knyszek <mknyszek@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/ssa/prove.go14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go
index da42a675bf..cf045629cb 100644
--- a/src/cmd/compile/internal/ssa/prove.go
+++ b/src/cmd/compile/internal/ssa/prove.go
@@ -2212,6 +2212,20 @@ func addLocalFacts(ft *factsTable, b *Block) {
}
ft.update(b, v, v.Args[0], signed, r)
}
+ if x.max <= 0 && !signedAddOverflowsOrUnderflows(x.min, y.min, v.Type) {
+ r := lt
+ if !x.nonzero() {
+ r |= eq
+ }
+ ft.update(b, v, v.Args[1], signed, r)
+ }
+ if y.max <= 0 && !signedAddOverflowsOrUnderflows(x.min, y.min, v.Type) {
+ r := lt
+ if !y.nonzero() {
+ r |= eq
+ }
+ ft.update(b, v, v.Args[0], signed, r)
+ }
case OpAnd64, OpAnd32, OpAnd16, OpAnd8:
ft.update(b, v, v.Args[0], unsigned, lt|eq)
ft.update(b, v, v.Args[1], unsigned, lt|eq)