Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: better-storesink
Changeset: r87172:50199f21c3b9
Date: 2016-09-16 14:54 +0200
http://bitbucket.org/pypy/pypy/changeset/50199f21c3b9/

Log:    be more careful about merging value, never make the results of
        find_rep the result of the merge. it's only for keys. add that as a
        comment.

diff --git a/rpython/translator/backendopt/cse.py 
b/rpython/translator/backendopt/cse.py
--- a/rpython/translator/backendopt/cse.py
+++ b/rpython/translator/backendopt/cse.py
@@ -53,6 +53,14 @@
                 self.heapcache.copy())
 
     def _var_rep(self, var):
+        # return the representative variable for var. All variables that must
+        # be equal to each other always have the same representative. The
+        # representative's definition dominates the use of all variables that
+        # it represents. casted pointers are considered the same objects.
+        # NB: it's very important to use _var_rep only when computing keys in
+        # the *cache dictionaries, never to actually put any new variable into
+        # the graph, because the concretetypes can change when calling
+        # _var_rep.
         var = self.new_unions.find_rep(var)
         return self.variable_families.find_rep(var)
 
@@ -75,10 +83,10 @@
                 break
         else:
             # all the same!
-            return first, False
+            return results[0], False
         if newres is None:
             newres = Variable()
-            newres.concretetype = first.concretetype
+            newres.concretetype = results[0].concretetype
         return newres, True
 
     def _merge_results(self, tuples, results, backedges):
diff --git a/rpython/translator/backendopt/test/test_cse.py 
b/rpython/translator/backendopt/test/test_cse.py
--- a/rpython/translator/backendopt/test/test_cse.py
+++ b/rpython/translator/backendopt/test/test_cse.py
@@ -520,3 +520,9 @@
     assert not needs_adding
     assert res == c1
 
+    # different vars, but same reps, 2
+    reps = {v2: v1}
+    res, needs_adding = c._find_new_res([v2, v2])
+    assert not needs_adding
+    assert res is v2
+
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to