Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: better-storesink
Changeset: r87155:a5ab790844f4
Date: 2016-09-06 19:06 +0200
http://bitbucket.org/pypy/pypy/changeset/a5ab790844f4/

Log:    a few corner cases

diff --git a/rpython/translator/backendopt/all.py 
b/rpython/translator/backendopt/all.py
--- a/rpython/translator/backendopt/all.py
+++ b/rpython/translator/backendopt/all.py
@@ -8,7 +8,7 @@
 from rpython.translator.backendopt import mallocprediction
 from rpython.translator.backendopt.removeassert import remove_asserts
 from rpython.translator.backendopt.support import log
-from rpython.translator.backendopt.storesink import storesink_graph
+from rpython.translator.backendopt.cse import common_subexpression_elimination
 from rpython.translator.backendopt import gilanalysis
 from rpython.flowspace.model import checkgraph
 
@@ -101,8 +101,7 @@
             print_statistics(translator.graphs[0], translator)
 
     if config.storesink:
-        for graph in graphs:
-            storesink_graph(graph)
+        common_subexpression_elimination(translator, graphs)
 
     if config.profile_based_inline and not secondary:
         threshold = config.profile_based_inline_threshold
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
@@ -42,7 +42,7 @@
                 self.heapcache.copy())
 
 
-    def merge(self, firstlink, tuples):
+    def merge(self, firstlink, tuples, backedges):
         purecache = {}
         block = firstlink.target
         # copy all operations that exist in *all* blocks over. need to add a 
new
@@ -82,6 +82,8 @@
                         for linkindex, (link, cache) in enumerate(tuples):
                             link.args.append(results[linkindex])
                         block.inputargs.append(newres)
+                        for backedge in backedges:
+                            backedge.args.append(newres)
                     purecache[newkey] = newres
 
         for key, res in self.purecache.iteritems():
@@ -97,6 +99,8 @@
                     for link, cache in tuples:
                         link.args.append(cache.purecache[key])
                     block.inputargs.append(newres)
+                    for backedge in backedges:
+                        backedge.args.append(newres)
                 purecache[key] = newres
 
         # ______________________
@@ -132,6 +136,8 @@
                         for linkindex, (link, cache) in enumerate(tuples):
                             link.args.append(results[linkindex])
                         block.inputargs.append(newres)
+                        for backedge in backedges:
+                            backedge.args.append(newres)
                     heapcache[newkey] = newres
 
         # regular merge
@@ -147,6 +153,8 @@
                     for link, cache in tuples:
                         link.args.append(cache.heapcache[key])
                     block.inputargs.append(newres)
+                    for backedge in backedges:
+                        backedge.args.append(newres)
                 heapcache[key] = newres
 
 
@@ -220,7 +228,7 @@
                 self.purecache[key] = op.result
         return added_some_same_as
 
-def _merge(tuples, variable_families, analyzer, loop_blocks=None):
+def _merge(tuples, variable_families, analyzer, loop_blocks, backedges):
     if not tuples:
         return Cache(variable_families, analyzer)
     if len(tuples) == 1:
@@ -228,7 +236,7 @@
         result = cache.copy()
     else:
         firstlink, firstcache = tuples[0]
-        result = firstcache.merge(firstlink, tuples)
+        result = firstcache.merge(firstlink, tuples, backedges)
     if loop_blocks:
         # for all blocks in the loop, clean the heapcache for their effects
         # that way, loop-invariant reads can be removed, if no one writes to
@@ -261,13 +269,19 @@
 
         while todo:
             block = todo.popleft()
+            assert block not in done
+
+            current_backedges = [link for link in entrymap[block]
+                                    if link in backedges]
 
             if block.operations:
                 cache = _merge(
                     caches_to_merge[block], variable_families, self.analyzer,
-                    loops.get(block, None))
+                    loops.get(block, None), current_backedges)
                 changed_block = cache.cse_block(block)
                 added_some_same_as = changed_block or added_some_same_as
+            else:
+                cache = Cache(variable_families, self.analyzer)
             done.add(block)
             # add all target blocks where all predecessors are already done
             for exit in block.exits:
@@ -275,7 +289,7 @@
                     if lnk.prevblock not in done and lnk not in backedges:
                         break
                 else:
-                    if exit.target not in done:
+                    if exit.target not in done and exit.target not in todo: # 
XXX
                         todo.append(exit.target)
                 caches_to_merge[exit.target].append((exit, cache))
         if added_some_same_as:
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
@@ -293,3 +293,33 @@
                 res += a.x
             return res
         self.check(f, [int], getfield=0)
+
+    def test_loopinvariant_heap_merge(self):
+        class A(object):
+            pass
+        def f(i):
+            res = 0
+            x = i
+            a = A()
+            if i == 0:
+                a.x = 1
+            else:
+                a.x = i
+            while x:
+                x -= 1
+                res += a.x
+            return res
+        self.check(f, [int], getfield=0)
+
+    def test_direct_merge(self):
+        def f(i):
+            a = i + 1
+            if i:
+                x = a
+            else:
+                x = a
+            res = 0
+            while a:
+                res += i + 1
+            return a + (i + 1)
+        self.check(f, [int], add=0)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to