Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit