[pypy-commit] pypy vecopt: rpython hints, saving the loop version the compileloopversion descr

plan_rich noreply at buildbot.pypy.org
Thu Jul 16 16:06:37 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78559:841f77615665
Date: 2015-07-16 16:06 +0200
http://bitbucket.org/pypy/pypy/changeset/841f77615665/

Log:	rpython hints, saving the loop version the compileloopversion descr

diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -612,7 +612,7 @@
             addr = rawstart + tok.pos_jump_offset
             tok.faildescr.adr_jump_offset = addr
             descr = tok.faildescr
-            if isinstance(descr, CompileLoopVersionDescr):
+            if descr.loop_version():
                 continue # patch them later
             relative_target = tok.pos_recovery_stub - (tok.pos_jump_offset + 4)
             assert rx86.fits_in_32bits(relative_target)
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
@@ -725,6 +725,7 @@
     operations = None
     inputargs = None
     faillocs = None
+    version = None
 
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         assert 0, "this guard must never fail"
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
@@ -553,7 +553,7 @@
     def save_to_descr(self, descr, position):
         from rpython.jit.metainterp.compile import ResumeGuardDescr
         from rpython.jit.metainterp.resume import AccumInfo
-        assert isinstance(descr,ResumeGuardDescr)
+        assert isinstance(descr, ResumeGuardDescr)
         ai = AccumInfo(descr.rd_accum_list, position, self.operator, self.var)
         descr.rd_accum_list = ai
 
@@ -758,6 +758,7 @@
         self.inputargs = label.getarglist()
 
     def register_all_guards(self, opt_ops, invariant_arg_count=0):
+        from rpython.jit.metainterp.compile import CompileLoopVersionDescr
         idx = index_of_first(rop.LABEL, opt_ops)
         assert idx >= 0
         version_failargs = opt_ops[idx].getarglist()
@@ -771,21 +772,26 @@
 
         for op in opt_ops:
             if op.is_guard():
-                import pdb; pdb.set_trace()
                 assert isinstance(op, GuardResOp)
                 descr = op.getdescr()
                 if descr.loop_version():
-                    # currently there is only ONE versioning,
-                    # that is the original loop after unrolling.
-                    # if there are more possibilites, let the descr
-                    # know which loop version he preferes
-                    self.faildescrs.append(descr)
-                    op.setfailargs(version_failargs)
-                    op.rd_snapshot = None
+                    assert isinstance(descr, CompileLoopVersionDescr)
+                    if descr.version is None:
+                        # currently there is only ONE versioning,
+                        # that is the original loop after unrolling.
+                        # if there are more possibilites, let the descr
+                        # know which loop version he preferes
+                        descr.version = self
+                        self.faildescrs.append(descr)
+                        op.setfailargs(version_failargs)
+                        op.rd_snapshot = None
 
     def register_guard(self, op):
+        from rpython.jit.metainterp.compile import CompileLoopVersionDescr
         assert isinstance(op, GuardResOp)
         descr = op.getdescr()
+        assert isinstance(descr, CompileLoopVersionDescr)
+        descr.version = self
         self.faildescrs.append(descr)
         op.setfailargs(self.inputargs)
         op.rd_snapshot = None
diff --git a/rpython/jit/metainterp/optimizeopt/guard.py b/rpython/jit/metainterp/optimizeopt/guard.py
--- a/rpython/jit/metainterp/optimizeopt/guard.py
+++ b/rpython/jit/metainterp/optimizeopt/guard.py
@@ -16,12 +16,12 @@
     """ An object wrapper around a guard. Helps to determine
         if one guard implies another
     """
+    _attrs_ = ('index', 'op', 'cmp_op', 'rhs', 'lhs')
+
     def __init__(self, index, op, cmp_op, index_vars):
         self.index = index
         self.op = op
         self.cmp_op = cmp_op
-        self.lhs_key = None
-        self.rhs_key = None
         lhs = cmp_op.getarg(0)
         self.lhs = index_vars.get(lhs, None)
         if self.lhs is None:
@@ -32,6 +32,15 @@
         if self.rhs is None:
             self.rhs = IndexVar(rhs)
 
+    def setindex(self, index):
+        self.index = index
+
+    def setoperation(self, op):
+        self.op = op
+
+    def setcmp(self, c):
+        self.cmp_op = c
+
     def getleftkey(self):
         return self.lhs.getvariable()
 
@@ -108,11 +117,10 @@
         self.index = other.index
 
         descr = myop.getdescr()
-        if we_are_translated():
-            descr.copy_all_attributes_from(other.op.getdescr())
-            myop.rd_frame_info_list = otherop.rd_frame_info_list
-            myop.rd_snapshot = otherop.rd_snapshot
-            myop.setfailargs(otherop.getfailargs())
+        descr.copy_all_attributes_from(other.op.getdescr())
+        myop.rd_frame_info_list = otherop.rd_frame_info_list
+        myop.rd_snapshot = otherop.rd_snapshot
+        myop.setfailargs(otherop.getfailargs())
 
     def emit_varops(self, opt, var, old_arg):
         assert isinstance(var, IndexVar)
@@ -134,9 +142,9 @@
         guard = self.op.clone()
         guard.setarg(0, box_result)
         opt.emit_operation(guard)
-        guard.index = opt.operation_position()-1
-        guard.op = guard
-        guard.cmp_op = cmp_op
+        self.setindex(opt.operation_position()-1)
+        self.setoperation(guard)
+        self.setcmp(cmp_op)
 
     def set_to_none(self, operations):
         assert operations[self.index] is self.op
@@ -249,7 +257,7 @@
         self.collect_guard_information(loop)
         self.eliminate_guards(loop)
 
-        if user_code:
+        if user_code or True:
             version = loop.snapshot()
             self.eliminate_array_bound_checks(loop, version)
 
@@ -278,23 +286,3 @@
         loop.operations = self._newoperations + \
                 [op for op in loop.operations if op]
 
-    # OLD
-    #def _get_key(self, cmp_op):
-    #    assert cmp_op
-    #    lhs_arg = cmp_op.getarg(0)
-    #    rhs_arg = cmp_op.getarg(1)
-    #    lhs_index_var = self.index_vars.get(lhs_arg, None)
-    #    rhs_index_var = self.index_vars.get(rhs_arg, None)
-
-    #    cmp_opnum = cmp_op.getopnum()
-    #    # get the key, this identifies the guarded operation
-    #    if lhs_index_var and rhs_index_var:
-    #        return (lhs_index_var.getvariable(), cmp_opnum, rhs_index_var.getvariable())
-    #    elif lhs_index_var:
-    #        return (lhs_index_var.getvariable(), cmp_opnum, None)
-    #    elif rhs_index_var:
-    #        return (None, cmp_opnum, rhs_index_var)
-    #    else:
-    #        return (None, cmp_opnum, None)
-    #    return key
-
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
@@ -1366,8 +1366,6 @@
         guard_not_invalidated(descr=<ResumeGuardNotInvalidated object at 0x7fc657d7be20>) [p1, p0, p5, p6, p7, p12, p13]
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #120 LOAD_CONST')
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #123 COMPARE_OP')
-        i22 = int_lt(i14, 2024)
-        guard_true(i22, descr=<ResumeGuardTrueDescr object at 0x7fc657d7bdc0>) [p1, p0, p5, p6, p7, p12, p13, i14]
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #126 POP_JUMP_IF_FALSE')
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #129 LOAD_NAME')
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #132 LOAD_NAME')
@@ -1400,6 +1398,8 @@
         i36 = int_lt(i33, 0)
         guard_false(i36, descr=<ResumeGuardFalseDescr object at 0x7fc657d7be80>) [p1, p0, p5, p6, p7, p12, p13, None, None, None]
         debug_merge_point(0, 0, '<code object <module>. file '/home/rich/proj/da/thesis/bench/user1.py'. line 2> #117 LOAD_NAME')
+        i22 = int_lt(i14, 2024)
+        guard_true(i22, descr=<ResumeGuardTrueDescr object at 0x7fc657d7bdc0>) [p1, p0, p5, p6, p7, p12, p13, i14]
         jump(p0, p1, p5, p6, p7, p12, p13, i31, i15, i16, i17, i18, i19, i20)
         """
         # schedule 885 -> ptype is non for raw_load?
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
@@ -49,14 +49,13 @@
         start = time.clock()
         #
         #
-        opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, loop, cost_threshold)
+        opt = VectorizingOptimizer(metainterp_sd, jitdriver_sd, loop, 0)
         opt.propagate_all_forward()
         gso = GuardStrengthenOpt(opt.dependency_graph.index_vars)
         user_code = not jitdriver_sd.vectorize and warmstate.vectorize_user
         gso.propagate_all_forward(opt.loop, user_code)
-        # loop versioning
+        # connect all compile loop version fail descriptors to this version
         version.register_all_guards(loop.operations, opt.appended_arg_count)
-        loop.versions.append(version)
         #
         #
         end = time.clock()
@@ -66,20 +65,23 @@
         #
         nano = int((end-start)*10.0**9)
         debug_print("# vecopt factor: %d opcount: (%d -> %d) took %dns" % \
-                      (opt.unroll_count+1, len(orig_ops), len(loop.operations), nano))
+                      (opt.unroll_count+1, len(version.operations), len(loop.operations), nano))
         debug_stop("vec-opt-loop")
         #
     except NotAVectorizeableLoop:
         debug_stop("vec-opt-loop")
         # vectorization is not possible
-        loop.operations = orig_ops
+        loop.operations = version.operations
+        loop.versions = None
     except NotAProfitableLoop:
         debug_stop("vec-opt-loop")
         # cost model says to skip this loop
-        loop.operations = orig_ops
+        loop.operations = version.operations
+        loop.versions = None
     except Exception as e:
         debug_stop("vec-opt-loop")
-        loop.operations = orig_ops
+        loop.operations = version.operations
+        loop.versions = None
         debug_print("failed to vectorize loop. THIS IS A FATAL ERROR!")
         if we_are_translated():
             from rpython.rtyper.lltypesystem import lltype


More information about the pypy-commit mailing list