Author: Richard Plangger <[email protected]>
Branch: vecopt-merge
Changeset: r80152:32dc0789de74
Date: 2015-10-13 09:52 +0200
http://bitbucket.org/pypy/pypy/changeset/32dc0789de74/

Log:    guard dependency construction moved to the first pass

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
@@ -133,9 +133,6 @@
         self.emitted = False
         self.schedule_position = -1
         self.priority = 0
-        # save the operation that produces the result for the first argument
-        # only for guard_true/guard_false
-        self.guard_bool_bool_node = None
         self._stack = False
 
     def is_imaginary(self):
@@ -625,11 +622,9 @@
                         nonpure.edge_to(node, failarg=True, label="nonpure")
                     tracker.non_pure = []
                 self.guards.append(node)
+                self.build_guard_dependencies(node, tracker)
             else:
                 self.build_non_pure_dependencies(node, tracker)
-        # pass 2 correct guard dependencies
-        for guard_node in self.guards:
-            self.build_guard_dependencies(guard_node, tracker)
 
     def guard_argument_protection(self, guard_node, tracker):
         """ the parameters the guard protects are an indicator for
@@ -642,27 +637,15 @@
         """
         guard_op = guard_node.getoperation()
         guard_opnum = guard_op.getopnum()
-        if guard_opnum in (rop.GUARD_TRUE, rop.GUARD_FALSE):
-            for dep in guard_node.depends():
-                op = dep.to.getoperation()
-                if op.returns_bool_result() and op is guard_op.getarg(0):
-                    guard_node.guard_bool_bool_node = dep.to
-                    for arg in op.getarglist():
-                        if not arg.is_constant():
-                            self.guard_exit_dependence(guard_node, arg, 
tracker)
-                    break
-            else:
-                # in this case the guard protects an integer
-                # example:
-                # i = int_and(j, 255)
-                # guard_true(i) [...]
-                pass
-        elif guard_op.is_foldable_guard():
-            # these guards carry their protected variables directly as a 
parameter
-            for arg in guard_node.getoperation().getarglist():
-                if not arg.is_constant():
-                    self.guard_exit_dependence(guard_node, arg, tracker)
-        elif guard_opnum == rop.GUARD_NOT_FORCED_2:
+        for arg in guard_op.getarglist():
+            if not arg.is_constant() and arg.type not in ('i','f'):
+                # redefine pointers, consider the following example
+                # guard_nonnull(r1)
+                # i1 = getfield(r1, ...)
+                # guard must be emitted before the getfield, thus
+                # redefine r1 at guard_nonnull
+                tracker.define(arg, guard_node)
+        if guard_opnum == rop.GUARD_NOT_FORCED_2:
             # must be emitted before finish, thus delayed the longest
             guard_node.setpriority(-10)
         elif guard_opnum in (rop.GUARD_OVERFLOW, rop.GUARD_NO_OVERFLOW):
@@ -695,7 +678,7 @@
             else:
                 raise AssertionError("(no)exception/not_forced: not op raises 
for them")
         else:
-            pass # not invalidated, early exit, future condition!
+            pass # not invalidated, future condition!
 
     def guard_exit_dependence(self, guard_node, var, tracker):
         def_node = tracker.definition(var)
@@ -721,7 +704,7 @@
             return
         # handle fail args
         if guard_op.getfailargs():
-            for arg in guard_op.getfailargs():
+            for i,arg in enumerate(guard_op.getfailargs()):
                 if arg is None:
                     continue
                 if not tracker.is_defined(arg):
@@ -748,6 +731,7 @@
                         tracker.depends_on_arg(index_var, node)
                     else:
                         tracker.depends_on_arg(cobj, node)
+                    break
         else:
             for arg, argcell, destroyed in node.side_effect_arguments():
                 if argcell is not None:
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
@@ -170,7 +170,7 @@
                     assert dependency is not None or node_b.getopnum() == 
rop.JUMP, \
                        " it is expected that instruction at index" + \
                        " %s depends on instr on index %s but it does not.\n%s" 
\
-                            % (node_a, node_b, graph)
+                            % (node_a.getindex(), node_b.getindex(), graph)
                 elif dependency is not None:
                     dependencies.remove(dependency)
             assert dependencies == [], \
@@ -489,31 +489,33 @@
 
     def test_dependency_complex_trace(self):
         graph = self.build_dependency("""
-        [i0, i1, i2, i3, i4, i5, i6, i7] # 0: 
1,2,3,4,6,7,8,9,10,12,14,17,19,20,21
+        [i0, i1, i2, i3, i4, i5, i6, i7] # 0:
         i9 = int_mul(i0, 8) # 1: 2
         i10 = raw_load_i(i3, i9, descr=arraydescr) # 2: 5, 10
         i11 = int_mul(i0, 8) # 3: 4
         i12 = raw_load_i(i4, i11, descr=arraydescr) # 4: 5,10
         i13 = int_add(i10, i12) # 5: 7,10
         i14 = int_mul(i0, 8) # 6: 7
-        raw_store(i5, i14, i13, descr=arraydescr) # 7: 21
+        raw_store(i3, i14, i13, descr=arraydescr) # 7: 10,12,20
         i16 = int_add(i0, 1) # 8: 9,10,11,13,16,18
         i17 = int_lt(i16, i7) # 9: 10
-        guard_true(i17) [i7, i13, i5, i4, i3, i12, i10, i16] # 10: 
11,13,16,18,19,21
-        i18 = int_mul(i16, 8) # 11:
-        i19 = raw_load_i(i3, i18, descr=arraydescr) # 12:
-        i20 = int_mul(i16, 8) # 13:
-        i21 = raw_load_i(i4, i20, descr=arraydescr) # 14:
-        i22 = int_add(i19, i21) # 15:
-        i23 = int_mul(i16, 8) # 16:
-        raw_store(i5, i23, i22, descr=arraydescr) # 17:
-        i24 = int_add(i16, 1) # 18:
-        i25 = int_lt(i24, i7) # 19:
+        guard_true(i17) [i7, i13, i5, i4, i3, i12, i10, i16] # 10: 17, 20
+        i18 = int_mul(i16, 9) # 11: 12
+        i19 = raw_load_i(i3, i18, descr=arraydescr) # 12: 15, 20
+        i20 = int_mul(i16, 8) # 13: 14
+        i21 = raw_load_i(i4, i20, descr=arraydescr) # 14: 15, 20
+        i22 = int_add(i19, i21) # 15: 17, 20
+        i23 = int_mul(i16, 8) # 16: 17
+        raw_store(i5, i23, i22, descr=arraydescr) # 17: 20
+        i24 = int_add(i16, 1) # 18: 19, 20
+        i25 = int_lt(i24, i7) # 19: 20
         guard_true(i25) [i7, i22, i5, i4, i3, i21, i19, i24] # 20:
         jump(i24, i19, i21, i3, i4, i5, i22, i7) # 21:
         """)
-        self.assert_dependencies(graph, full_check=False)
+        self.assert_dependencies(graph, full_check=True)
         self.assert_dependent(graph, 2,12)
+        self.assert_dependent(graph, 7,12)
+        self.assert_dependent(graph, 4,12)
 
     def test_getfield(self):
         graph = self.build_dependency("""
@@ -529,7 +531,7 @@
     def test_cyclic(self):
         graph = self.build_dependency("""
         [p0, p1, p5, p6, p7, p9, p11, p12] # 0: 1,6
-        p13 = getfield_gc_r(p9) # 1: 2,4,5
+        p13 = getfield_gc_r(p9) # 1: 2,5
         guard_nonnull(p13) [] # 2: 4,5
         i14 = getfield_gc_i(p9) # 3: 5
         p15 = getfield_gc_r(p13) # 4: 5
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to