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

Reply via email to