[pypy-commit] pypy vecopt: minor simplifications, fixed some tests cases (more to go), the additional abc opt removes some opts, the tests should not check for equivalence of all instructions, but check for a sequence

plan_rich noreply at buildbot.pypy.org
Fri Jul 17 16:37:43 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78579:aa9a9d9cc94b
Date: 2015-07-17 16:37 +0200
http://bitbucket.org/pypy/pypy/changeset/aa9a9d9cc94b/

Log:	minor simplifications, fixed some tests cases (more to go), the
	additional abc opt removes some opts, the tests should not check for
	equivalence of all instructions, but check for a sequence

diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -199,10 +199,12 @@
     if loop.versions is not None:
         token = jitcell_token
         for version in loop.versions:
-            for faildescr in version.faildescrs:
+            for i, faildescr in enumerate(version.faildescrs):
                 vl = create_empty_loop(metainterp)
                 vl.inputargs = version.inputargs
-                vl.operations = version.copy_operations()
+                vl.operations = version.operations
+                if i > 0:
+                    vl.operations = vl.copy_operations()
                 vl.original_jitcell_token = jitcell_token
                 send_bridge_to_backend(jitdriver_sd, metainterp_sd,
                                        faildescr, version.inputargs,
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -746,9 +746,8 @@
 
 class LoopVersion(object):
 
-    def __init__(self, operations, aligned=False):
+    def __init__(self, operations):
         self.operations = operations
-        self.aligned = aligned
         self.faildescrs = []
         #
         idx = index_of_first(rop.LABEL, operations)
@@ -796,9 +795,6 @@
         op.setfailargs(self.inputargs)
         op.rd_snapshot = None
 
-    def copy_operations(self):
-        return [op.clone() for op in self.operations]
-
     def update_token(self, jitcell_token):
         label = self.operations[self.label_pos]
         jump = self.operations[-1]
@@ -858,18 +854,20 @@
         return index_of_first(opnum, self.operations)
 
     def snapshot(self):
-        version = LoopVersion(self.copy_operations(), [])
+        version = LoopVersion(self.copy_operations())
         self.versions.append(version)
         return version
 
     def copy_operations(self):
+        from rpython.jit.metainterp.compile import ResumeGuardDescr
         operations = []
         for op in self.operations:
             cloned = op.clone()
             operations.append(cloned)
-            if cloned.getdescr():
-                descr = cloned.getdescr().clone()
-                cloned.setdescr(descr)
+            descr = cloned.getdescr()
+            if cloned.is_guard() and descr:
+                assert isinstance(descr, ResumeGuardDescr)
+                cloned.setdescr(descr.clone())
         return operations
 
     def get_display_text(self):    # for graphpage.py
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
@@ -68,6 +68,12 @@
             unroll_factor = opt.get_unroll_count(ARCH_VEC_REG_SIZE)
             print ""
             print "unroll factor: ", unroll_factor, opt.smallest_type_bytes
+        if opt.loop.find_first_index(rop.GUARD_EARLY_EXIT) == -1:
+            idx = loop.find_first_index(rop.LABEL)
+            guard = ResOperation(rop.GUARD_EARLY_EXIT, [], None)
+            guard.setfailargs([])
+            guard.setdescr(compile.ResumeAtLoopHeaderDescr())
+            loop.operations.insert(idx+1, guard)
         opt.analyse_index_calculations()
         if opt.dependency_graph is not None:
             self._write_dot_and_convert_to_svg(opt.dependency_graph, "ee" + self.test_name)
@@ -216,7 +222,6 @@
     def test_vectorize_empty_with_early_exit(self):
         ops = """
         []
-        guard_early_exit() []
         jump()
         """
         try:
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
@@ -94,20 +94,6 @@
     return a.left.getindex() < b.left.getindex()
 packsort = listsort.make_timsort_class(lt=cmp_pack_lt)
 
-def copy_fail_descr(op, optimizer):
-    olddescr = op.getdescr()
-    exits_early = olddescr.guard_opnum == rop.GUARD_EARLY_EXIT
-    if exits_early:
-        if isinstance(olddescr, CompileLoopVersionDescr):
-            descr = CompileLoopVersionDescr()
-        else:
-            descr = ResumeAtLoopHeaderDescr()
-    else:
-        descr = invent_fail_descr_for_op(op.getopnum(), optimizer)
-    if olddescr:
-        descr.copy_all_attributes_from(olddescr)
-    return descr
-
 class VectorizingOptimizer(Optimizer):
     """ Try to unroll the loop and find instructions to group """
 
@@ -195,15 +181,9 @@
         self.emit_unrolled_operation(label_op)
 
         renamer = Renamer()
-        pure = True
         operations = []
-        ee_pos = -1
         for i in range(1,op_count-1):
             op = loop.operations[i].clone()
-            opnum = op.getopnum()
-            if opnum == rop.GUARD_EARLY_EXIT:
-                ee_pos = i
-
             if op.is_guard():
                 assert isinstance(op, GuardResOp)
                 failargs = renamer.rename_failargs(op, clone=True)
@@ -249,7 +229,9 @@
                 if copied_op.is_guard():
                     assert isinstance(copied_op, GuardResOp)
                     target_guard = copied_op
-                    copied_op.setdescr(copy_fail_descr(copied_op, self))
+                    descr = copied_op.getdescr()
+                    assert isinstance(descr, ResumeGuardDescr)
+                    copied_op.setdescr(descr.clone())
                     descr = target_guard.getdescr()
                     # copy failargs/snapshot
                     copied_op.rd_snapshot = \


More information about the pypy-commit mailing list