Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r77969:b0c01840baea
Date: 2015-06-08 21:40 +0200
http://bitbucket.org/pypy/pypy/changeset/b0c01840baea/
Log: Merge disable-unroll-for-short-loops (which actually is supposed to
be for *long* looops)
This disables unrolling if the loops are longer than 100 operations
(tunable)
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,7 @@
# ____________________________________________________________
+
def compile_loop(metainterp, greenkey, start,
inputargs, jumpargs,
full_preamble_needed=True,
@@ -148,27 +149,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 start_state is not None:
+ 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/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -154,6 +154,19 @@
loop.operations = self.optimizer.get_newoperations()
if export_state:
+ jd_sd = self.optimizer.jitdriver_sd
+ threshold = jd_sd.warmstate.disable_unrolling_threshold
+ if 1 or len(loop.operations) > threshold:
+ if loop.operations[0].getopnum() == rop.LABEL:
+ # abandoning unrolling, too long
+ new_descr = stop_label.getdescr()
+ if loop.operations[0].getopnum() == rop.LABEL:
+ new_descr = loop.operations[0].getdescr()
+ stop_label = stop_label.copy_and_change(rop.JUMP,
+ descr=new_descr)
+ self.optimizer.send_extra_operation(stop_label)
+ loop.operations = self.optimizer.get_newoperations()
+ return None
final_state = self.export_state(stop_label)
else:
final_state = None
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': 100,
'enable_opts': 'all',
'max_unroll_recursion': 7,
}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit