mirror of https://github.com/golang/go.git
cmd/compile: teach prove about bitwise OR operation
For now, only apply the rule if either of arguments are constants. That would catch a lot of real user code, without slowing down the compiler with code generated for string comparison (experience in CL 410336). Updates #57959 Fixes #45928 Change-Id: Ie2e830d6d0d71cda3947818b22c2775bd94f7971 Reviewed-on: https://go-review.googlesource.com/c/go/+/483359 Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
a3f3868c7a
commit
63a08e61bd
|
|
@ -867,6 +867,14 @@ func prove(f *Func) {
|
||||||
logicVars = make(map[*Block][]*Value)
|
logicVars = make(map[*Block][]*Value)
|
||||||
}
|
}
|
||||||
logicVars[b] = append(logicVars[b], v)
|
logicVars[b] = append(logicVars[b], v)
|
||||||
|
case OpOr64, OpOr32, OpOr16, OpOr8:
|
||||||
|
// TODO: investigate how to always add facts without much slowdown, see issue #57959.
|
||||||
|
if v.Args[0].isGenericIntConst() {
|
||||||
|
ft.update(b, v, v.Args[0], unsigned, gt|eq)
|
||||||
|
}
|
||||||
|
if v.Args[1].isGenericIntConst() {
|
||||||
|
ft.update(b, v, v.Args[1], unsigned, gt|eq)
|
||||||
|
}
|
||||||
case OpDiv64u, OpDiv32u, OpDiv16u, OpDiv8u,
|
case OpDiv64u, OpDiv32u, OpDiv16u, OpDiv8u,
|
||||||
OpRsh8Ux64, OpRsh8Ux32, OpRsh8Ux16, OpRsh8Ux8,
|
OpRsh8Ux64, OpRsh8Ux32, OpRsh8Ux16, OpRsh8Ux8,
|
||||||
OpRsh16Ux64, OpRsh16Ux32, OpRsh16Ux16, OpRsh16Ux8,
|
OpRsh16Ux64, OpRsh16Ux32, OpRsh16Ux16, OpRsh16Ux8,
|
||||||
|
|
|
||||||
|
|
@ -1111,6 +1111,11 @@ func issue51622(b []byte) int {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func issue45928(x int) {
|
||||||
|
combinedFrac := x / (x | (1 << 31)) // ERROR "Proved Neq64$"
|
||||||
|
useInt(combinedFrac)
|
||||||
|
}
|
||||||
|
|
||||||
//go:noinline
|
//go:noinline
|
||||||
func useInt(a int) {
|
func useInt(a int) {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue