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