aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Bajo <rasky@develer.com>2018-03-13 00:25:06 +0100
committerGiovanni Bajo <rasky@develer.com>2018-03-24 03:06:21 +0000
commitd54902ece907d55d937b7b2fa294e0cc22b57a32 (patch)
tree79c6b8bd3d130360392daadad41865d992182c3d
parent385d936fb287cfe3a491ced2d77d52d71b7705a8 (diff)
downloadgo-d54902ece907d55d937b7b2fa294e0cc22b57a32.tar.xz
cmd/compile: in prove, shortcircuit self-facts
Sometimes, we can end up calling update with a self-relation about a variable (x REL x). In this case, there is no need to record anything: the relation is unsatisfiable if and only if it doesn't contain eq. This also helps avoiding infinite loop in next CL that will introduce transitive closure of relations. Passes toolstash -cmp. Change-Id: Ic408452ec1c13653f22ada35466ec98bc14aaa8e Reviewed-on: https://go-review.googlesource.com/100276 Reviewed-by: Austin Clements <austin@google.com>
-rw-r--r--src/cmd/compile/internal/ssa/prove.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go
index ec31d46d02..cf0118ac3c 100644
--- a/src/cmd/compile/internal/ssa/prove.go
+++ b/src/cmd/compile/internal/ssa/prove.go
@@ -193,6 +193,15 @@ func (ft *factsTable) update(parent *Block, v, w *Value, d domain, r relation) {
return
}
+ // Self-fact. It's wasteful to register it into the facts
+ // table, so just note whether it's satisfiable
+ if v == w {
+ if r&eq == 0 {
+ ft.unsat = true
+ }
+ return
+ }
+
if lessByID(w, v) {
v, w = w, v
r = reverseBits[r]