Author: Maciej Fijalkowski <fij...@gmail.com> Branch: disable-unroll-for-short-loops Changeset: r77918:bdf385bc3c7c Date: 2015-06-05 18:57 +0200 http://bitbucket.org/pypy/pypy/changeset/bdf385bc3c7c/
Log: an attempt to disable unrolling if we hit a certain threshold 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 @@ -103,6 +103,35 @@ # ____________________________________________________________ + +def disable_unrolling_if_loop_too_long(loop, metainterp): + threshold = metainterp.jitdriver_sd.warmstate.disable_unrolling_threshold + if len(loop.operations) < threshold: + return False + # now we need to patch label, like in simplify.py + last_op = loop.operations[-1] + descr = last_op.getdescr() + assert isinstance(descr, TargetToken) + descr = descr.targeting_jitcell_token + assert isinstance (descr, JitCellToken) + last_op = last_op.copy_and_change(rop.JUMP) + if not descr.target_tokens: + # fish the first label + for op in loop.operations: + if op.getopnum() == rop.LABEL: + target_token = op.getdescr() + break + else: + assert False, "can't find a label" + assert isinstance(target_token, TargetToken) + assert target_token.targeting_jitcell_token is descr + last_op.setdescr(target_token) + else: + assert len(descr.target_tokens) == 1 + last_op.setdescr(descr.target_tokens[0]) + loop.operations[-1] = last_op + return True + def compile_loop(metainterp, greenkey, start, inputargs, jumpargs, full_preamble_needed=True, @@ -148,27 +177,28 @@ if part.quasi_immutable_deps: loop.quasi_immutable_deps.update(part.quasi_immutable_deps) if part.operations[-1].getopnum() == rop.LABEL: - inliner = Inliner(inputargs, jumpargs) - part.quasi_immutable_deps = None - part.operations = [part.operations[-1]] + \ - [inliner.inline_op(h_ops[i]) for i in range(start, len(h_ops))] + \ - [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jumpargs], - None, descr=jitcell_token)] - target_token = part.operations[0].getdescr() - assert isinstance(target_token, TargetToken) - all_target_tokens.append(target_token) - inputargs = jumpargs - jumpargs = part.operations[-1].getarglist() + if not disable_unrolling_if_loop_too_long(part, metainterp): + inliner = Inliner(inputargs, jumpargs) + part.quasi_immutable_deps = None + part.operations = [part.operations[-1]] + \ + [inliner.inline_op(h_ops[i]) for i in range(start, len(h_ops))] + \ + [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jumpargs], + None, descr=jitcell_token)] + target_token = part.operations[0].getdescr() + assert isinstance(target_token, TargetToken) + all_target_tokens.append(target_token) + inputargs = jumpargs + jumpargs = part.operations[-1].getarglist() - try: - optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts, - start_state=start_state, export_state=False) - except InvalidLoop: - return None + try: + optimize_trace(metainterp_sd, jitdriver_sd, part, enable_opts, + start_state=start_state, export_state=False) + except InvalidLoop: + return None - loop.operations = loop.operations[:-1] + part.operations - if part.quasi_immutable_deps: - loop.quasi_immutable_deps.update(part.quasi_immutable_deps) + loop.operations = loop.operations[:-1] + part.operations + if part.quasi_immutable_deps: + loop.quasi_immutable_deps.update(part.quasi_immutable_deps) assert part.operations[-1].getopnum() != rop.LABEL if not loop.quasi_immutable_deps: diff --git a/rpython/jit/metainterp/warmstate.py b/rpython/jit/metainterp/warmstate.py --- a/rpython/jit/metainterp/warmstate.py +++ b/rpython/jit/metainterp/warmstate.py @@ -256,6 +256,9 @@ def set_param_inlining(self, value): self.inlining = value + def set_param_disable_unrolling(self, value): + self.disable_unrolling_threshold = value + def set_param_enable_opts(self, value): from rpython.jit.metainterp.optimizeopt import ALL_OPTS_DICT, ALL_OPTS_NAMES diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py --- a/rpython/rlib/jit.py +++ b/rpython/rlib/jit.py @@ -549,6 +549,7 @@ 'retrace_limit': 'how many times we can try retracing before giving up', 'max_retrace_guards': 'number of extra guards a retrace can cause', 'max_unroll_loops': 'number of extra unrollings a loop can cause', + 'disable_unrolling': 'after how many operations we should not unroll', 'enable_opts': 'INTERNAL USE ONLY (MAY NOT WORK OR LEAD TO CRASHES): ' 'optimizations to enable, or all = %s' % ENABLE_ALL_OPTS, 'max_unroll_recursion': 'how many levels deep to unroll a recursive function' @@ -564,6 +565,7 @@ 'retrace_limit': 5, 'max_retrace_guards': 15, 'max_unroll_loops': 0, + 'disable_unrolling': 1000, 'enable_opts': 'all', 'max_unroll_recursion': 7, } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit