Author: Richard Plangger <r...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit