mirror of
https://github.com/golang/go
synced 2024-11-16 23:04:44 -07:00
cmd/compile: fix prove pass when upper condition is <= maxint
When the terminating condition is <= X, we need to make sure that X+step doesn't overflow. Fixes #53600 Change-Id: I36e5384d05b4d7168e48db6094200fcae409bfe5 Reviewed-on: https://go-review.googlesource.com/c/go/+/415219 Reviewed-by: Than McIntosh <thanm@google.com> Run-TryBot: David Chase <drchase@google.com> Reviewed-by: David Chase <drchase@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Keith Randall <khr@golang.org>
This commit is contained in:
parent
17083a2fdf
commit
31b8c23c57
@ -159,6 +159,13 @@ func findIndVar(f *Func) []indVar {
|
|||||||
step = -step
|
step = -step
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if flags&indVarMaxInc != 0 && max.Op == OpConst64 && max.AuxInt+step < max.AuxInt {
|
||||||
|
// For a <= comparison, we need to make sure that a value equal to
|
||||||
|
// max can be incremented without overflowing.
|
||||||
|
// (For a < comparison, the %step check below ensures no overflow.)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Up to now we extracted the induction variable (ind),
|
// Up to now we extracted the induction variable (ind),
|
||||||
// the increment delta (inc), the temporary sum (nxt),
|
// the increment delta (inc), the temporary sum (nxt),
|
||||||
// the minimum value (min) and the maximum value (max).
|
// the minimum value (min) and the maximum value (max).
|
||||||
|
42
test/fixedbugs/issue53600.go
Normal file
42
test/fixedbugs/issue53600.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// run
|
||||||
|
|
||||||
|
// Copyright 2022 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f()
|
||||||
|
g()
|
||||||
|
h()
|
||||||
|
}
|
||||||
|
func f() {
|
||||||
|
for i := int64(math.MaxInt64); i <= math.MaxInt64; i++ {
|
||||||
|
if i < 0 {
|
||||||
|
println("done")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println(i, i < 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func g() {
|
||||||
|
for i := int64(math.MaxInt64) - 1; i <= math.MaxInt64; i++ {
|
||||||
|
if i < 0 {
|
||||||
|
println("done")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println(i, i < 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func h() {
|
||||||
|
for i := int64(math.MaxInt64) - 2; i <= math.MaxInt64; i += 2 {
|
||||||
|
if i < 0 {
|
||||||
|
println("done")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println(i, i < 0)
|
||||||
|
}
|
||||||
|
}
|
8
test/fixedbugs/issue53600.out
Normal file
8
test/fixedbugs/issue53600.out
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
9223372036854775807 false
|
||||||
|
done
|
||||||
|
9223372036854775806 false
|
||||||
|
9223372036854775807 false
|
||||||
|
done
|
||||||
|
9223372036854775805 false
|
||||||
|
9223372036854775807 false
|
||||||
|
done
|
Loading…
Reference in New Issue
Block a user