]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: in prove, shortcircuit self-facts
authorGiovanni Bajo <rasky@develer.com>
Mon, 12 Mar 2018 23:25:06 +0000 (00:25 +0100)
committerGiovanni Bajo <rasky@develer.com>
Sat, 24 Mar 2018 03:06:21 +0000 (03:06 +0000)
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>
src/cmd/compile/internal/ssa/prove.go

index ec31d46d0294f2fdf8635cc2041a67d14f325cb8..cf0118ac3c389951c587a6535aee7d2fb8750f38 100644 (file)
@@ -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]