Author: Richard Plangger <r...@pasra.at>
Branch: vecopt2
Changeset: r77090:bce7c27122a3
Date: 2015-03-25 10:53 +0100
http://bitbucket.org/pypy/pypy/changeset/bce7c27122a3/

Log:    impl. follow use def chains (similar to def use chains)

diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py 
b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -181,18 +181,15 @@
                 dep.args.append(arg)
 
     def get_uses(self, idx):
-        deps = []
         for dep in self.adjacent_list[idx]:
             if idx < dep.idx_to:
-                deps.append(dep)
-        return deps
+                yield dep
 
     def get_defs(self, idx):
         deps = []
         for dep in self.adjacent_list[idx]:
             if idx > dep.idx_from:
-                deps.append(dep)
-        return deps
+                yield dep
 
     def instr_dependencies(self, idx):
         edges = self.adjacent_list[idx]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py 
b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -682,6 +682,7 @@
         """
         loop = self.parse_loop(ops)
         vopt = self.extend_pack_set(loop,1)
+        self.debug_print_operations(loop)
         assert len(vopt.vec_info.memory_refs) == 2
         assert vopt.dependency_graph.independant(5,10) == True
         assert len(vopt.pack_set.packs) == 2
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py 
b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -228,8 +228,26 @@
                                                    a_memref, b_memref)
 
     def extend_pack_set(self):
-        for p in self.pack_set.packs:
-            self.follow_def_uses(p)
+        pack_count = self.pack_set.pack_count()
+        while True:
+            for pack in self.pack_set.packs:
+                self.follow_use_defs(pack)
+                self.follow_def_uses(pack)
+            if pack_count == self.pack_set.pack_count():
+                break
+            pack_count = self.pack_set.pack_count()
+
+    def follow_use_defs(self, pack):
+        assert isinstance(pack, Pair)
+        for ldef in self.dependency_graph.get_defs(pack.left.opidx):
+            for rdef in self.dependency_graph.get_defs(pack.right.opidx):
+                ldef_idx = ldef.idx_from
+                rdef_idx = rdef.idx_from
+                if ldef_idx != rdef_idx and \
+                   self.pack_set.can_be_packed(ldef_idx, rdef_idx):
+                    savings = self.pack_set.estimate_savings(ldef_idx, 
rdef_idx)
+                    if savings >= 0:
+                        self.pack_set.add_pair(ldef_idx, rdef_idx)
 
     def follow_def_uses(self, pack):
         assert isinstance(pack, Pair)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to