Author: Richard Plangger <planri...@gmail.com> Branch: vecopt-merge Changeset: r79586:50d4f3bd716c Date: 2015-09-10 19:15 +0200 http://bitbucket.org/pypy/pypy/changeset/50d4f3bd716c/
Log: finished the new dependency model. label and jump are tracked no more. this greatly reduces the edge count in the graph 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 @@ -450,32 +450,30 @@ def definition(self, arg, node=None, argcell=None): if arg.is_constant(): return None - if arg.is_inputarg(): + def_chain = self.defs.get(arg,None) + if not def_chain: return None - def_chain = self.defs[arg] - if len(def_chain) == 1: - return def_chain[0][0] + if not argcell: + return def_chain[-1][0] else: - if not argcell: - return def_chain[-1][0] - else: - assert node is not None - i = len(def_chain)-1 - try: - mref = node.memory_ref - while i >= 0: - def_node = def_chain[i][0] - oref = def_node.memory_ref - if oref is not None and mref.alias(oref): - return def_node - elif oref is None: - return def_node - i -= 1 - except KeyError: - # when a key error is raised, this means - # no information is available, safe default - pass - return def_chain[-1][0] + assert node is not None + i = len(def_chain)-1 + try: + mref = node.memory_ref + while i >= 0: + def_node = def_chain[i][0] + oref = def_node.memory_ref + if oref is not None and mref.alias(oref): + return def_node + elif oref is None: + return def_node + i -= 1 + return None + except KeyError: + # when a key error is raised, this means + # no information is available, safe default + pass + return def_chain[-1][0] def depends_on_arg(self, arg, to, argcell=None): try: @@ -703,7 +701,9 @@ # handle fail args if guard_op.getfailargs(): for arg in guard_op.getfailargs(): - if arg is None or not tracker.is_defined(arg): + if arg is None: + continue + if not tracker.is_defined(arg): continue try: for at in tracker.redefinitions(arg): diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py --- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py @@ -333,7 +333,7 @@ """ self.assert_dependencies(ops, full_check=True) - def test_not_forced(self): + def test_call_not_forced_exception(self): ops=""" [p0, p1, i2, i5] # 0: 1,2,4?,5,6 i4 = call_i(i5, i2, descr=nonwritedescr) # 1: 2,4,6 @@ -344,8 +344,8 @@ jump(p2, p1, i2, i5) # 6: """ self.assert_dependencies(ops, full_check=True) + assert self.last_graph.nodes[1].priority == 100 assert self.last_graph.nodes[2].priority == 100 - assert self.last_graph.nodes[3].priority == 100 def test_setarrayitem_dependency(self): ops=""" @@ -368,7 +368,6 @@ """ self.assert_dependencies(ops, full_check=True) self.assert_dependent(1,2) - self.assert_dependent(0,3) def test_setarrayitem_dont_depend_with_memref_info(self): ops=""" @@ -424,7 +423,7 @@ def test_cyclic(self): trace = """ [p0, p1, p5, p6, p7, p9, p11, p12] # 0: 1,6 - guard_early_exit() [] # 1: 2,4,6,7 + guard_early_exit() [] # 1: p13 = getfield_gc_r(p9) # 2: 3,5,6 guard_nonnull(p13) [] # 3: 5,6 i14 = getfield_gc_i(p9) # 4: 6 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit