[pypy-commit] pypy vecopt-merge: conflict resolution for the new packed guards (this would have been needed in the future anyway)

plan_rich noreply at buildbot.pypy.org
Mon Oct 12 12:01:01 CEST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: vecopt-merge
Changeset: r80129:a0a5d6b95d2b
Date: 2015-10-12 12:01 +0200
http://bitbucket.org/pypy/pypy/changeset/a0a5d6b95d2b/

Log:	conflict resolution for the new packed guards (this would have been
	needed in the future anyway)

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
@@ -374,7 +374,12 @@
         """ NOT_RPTYHON """
         op_str = str(self.op)
         if self.op.is_guard():
-            args_str = [str(arg) for arg in self.op.getfailargs()]
+            args_str = []
+            for arg in self.op.getfailargs():
+                name = 'None'
+                if arg:
+                    name = arg.repr_short(arg._repr_memo)
+                args_str.append(name)
             op_str += " " + ','.join(args_str)
         return "[%d] %s" % (self.opidx, op_str)
 
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -92,6 +92,31 @@
             visited += 1
         return None
 
+    def try_to_trash_pack(self, state):
+        # one element a pack has several dependencies pointing to
+        # it thus we MUST skip this pack!
+        if len(state.worklist) > 0:
+            # break the first!
+            i = 0
+            node = state.worklist[i]
+            i += 1
+            while i < len(state.worklist) and not node.pack:
+                node = state.worklist[i]
+                i += 1
+
+            if not node.pack:
+                return False
+
+            pack = node.pack
+            for n in node.pack.operations:
+                if n.depends_count() > 0:
+                    pack.clear()
+                    return True
+            else:
+                return False
+
+        return False
+
     def delay(self, node, state):
         """ Delay this operation?
             Only if any dependency has not been resolved """
@@ -158,6 +183,9 @@
             if not state.has_more():
                 break
 
+            if self.try_to_trash_pack(state):
+                continue
+
             raise AssertionError("schedule failed cannot continue. possible reason: cycle")
 
         if not we_are_translated():
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
@@ -1315,6 +1315,32 @@
         except NotAVectorizeableLoop:
             pass
 
+    def test_remove_mew(self):
+        trace = self.parse_loop("""
+        [p0, p1, p2, p3, i4, i5, p6, p7, i8, f9, i10, i11]
+        f12 = raw_load_f(i8, i5, descr=floatarraydescr)
+        guard_not_invalidated(descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f0e5c61e990>) [p7, p6, p2, p1, p0, f12, i4, p3, i5]
+        f14 = float_mul(f12, 0.0)
+        i15 = float_eq(f14, f14)
+        guard_true(i15, descr=<rpython.jit.metainterp.compile.ResumeGuardCopiedDescr object at 0x7f0e5c63e610>) [p7, p6, p2, p1, p0, f12, i4, p3, i5]
+        f17 = call_f(1234, f12, f9, descr=writearraydescr)
+        i20 = call_i(1234444, 232, descr=writearraydescr)
+        f21 = float_mul(f17, 0.0)
+        i22 = float_eq(f21, f21)
+        guard_true(i22, descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f0e5c6a47d0>) [p7, p6, p2, p1, p0, f9, f12, i20, f21, f17, i4, p3, i5]
+        i23 = int_is_true(i20)
+        guard_false(i23, descr=<rpython.jit.metainterp.compile.ResumeGuardCopiedDescr object at 0x7f0e5c60b7d0>) [p7, p6, p2, p1, p0, f9, f12, i20, f21, f17, i4, p3, i5]
+        raw_store(i10, i5, f17, descr=floatarraydescr)
+        i25 = int_add(i4, 1)
+        i27 = int_add(i5, 8)
+        i28 = int_ge(i25, i11)
+        guard_false(i28, descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f0e5c75b690>) [i11, i25, p7, p6, p2, p1, p0, i27, None, p3, None]
+        debug_merge_point(0, 0, '(numpy_call2_inc_out_right: no get_printable_location)')
+        jump(p0, p1, p2, p3, i25, i27, p6, p7, i8, f9, i10, i11)
+        """)
+        vopt = self.schedule(trace)
+        self.debug_print_operations(trace)
+
 
 class TestLLtype(BaseTestVectorize, LLtypeMixin):
     pass
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -795,7 +795,7 @@
 
 class InputArgVector(VectorOp, AbstractInputArg):
     def __init__(self):
-        self.type = 'v'
+        pass
 
     def returns_vector(self):
         return True


More information about the pypy-commit mailing list