Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit