[pypy-commit] pypy optimizeopt-cleanup: Don't fallback to jumping to the preamble in compile_retrace(),
rlamy
pypy.commits at gmail.com
Mon May 27 18:43:36 EDT 2019
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: optimizeopt-cleanup
Changeset: r96707:5e0d762fe4fd
Date: 2019-05-25 03:02 +0100
http://bitbucket.org/pypy/pypy/changeset/5e0d762fe4fd/
Log: Don't fallback to jumping to the preamble in compile_retrace(),
since optimize_peeled_loop() already takes care of it. And simplify
some code.
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
@@ -126,20 +126,18 @@
log_noopt = False
def __init__(self, trace, celltoken, state,
- call_pure_results=None, enable_opts=None,
- inline_short_preamble=True):
+ call_pure_results=None, enable_opts=None):
self.trace = trace
self.celltoken = celltoken
self.enable_opts = enable_opts
self.state = state
self.call_pure_results = call_pure_results
- self.inline_short_preamble = inline_short_preamble
def optimize(self, metainterp_sd, jitdriver_sd, optimizations):
from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
- return opt.optimize_peeled_loop(self.trace, self.celltoken, self.state,
- self.call_pure_results, self.inline_short_preamble)
+ return opt.optimize_peeled_loop(
+ self.trace, self.celltoken, self.state, self.call_pure_results)
def show_procedures(metainterp_sd, procedure=None, error=None):
from rpython.conftest import option
@@ -363,20 +361,9 @@
loop_info, loop_ops = loop_data.optimize_trace(
metainterp_sd, jitdriver_sd, metainterp.box_names_memo)
except InvalidLoop:
- # Fall back on jumping directly to preamble
+ metainterp_sd.jitlog.trace_aborted()
history.cut(cut)
- history.record(rop.JUMP, jumpargs[:], None, descr=loop_jitcell_token)
- loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state,
- call_pure_results=call_pure_results,
- enable_opts=enable_opts,
- inline_short_preamble=False)
- try:
- loop_info, loop_ops = loop_data.optimize_trace(
- metainterp_sd, jitdriver_sd, metainterp.box_names_memo)
- except InvalidLoop:
- metainterp_sd.jitlog.trace_aborted()
- history.cut(cut)
- return None
+ return None
label_op = loop_info.label_op
label_token = label_op.getdescr()
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
@@ -115,8 +115,7 @@
self._clean_optimization_info(self._newoperations)
return exported_state, self._newoperations
- def optimize_peeled_loop(self, trace, celltoken, state,
- call_pure_results, inline_short_preamble=True):
+ def optimize_peeled_loop(self, trace, celltoken, state, call_pure_results):
trace = trace.get_iter()
try:
label_args = self.optunroll.import_state(trace.inputargs, state)
@@ -155,18 +154,12 @@
state.virtual_state)
label_op.setdescr(target_token)
- if not inline_short_preamble:
- self.optunroll.jump_to_preamble(celltoken, end_jump, info)
- return (UnrollInfo(target_token, label_op, extra_same_as,
- self.quasi_immutable_deps),
- self._newoperations)
-
try:
new_virtual_state = self.optunroll.jump_to_existing_trace(
- end_jump, label_op, state.runtime_boxes, force_boxes=False)
+ end_jump, label_op, state.runtime_boxes, force_boxes=False)
except InvalidLoop:
# inlining short preamble failed, jump to preamble
- self.optunroll.jump_to_preamble(celltoken, end_jump, info)
+ self.jump_to_preamble(celltoken, end_jump)
return (UnrollInfo(target_token, label_op, extra_same_as,
self.quasi_immutable_deps),
self._newoperations)
@@ -176,12 +169,12 @@
# to the preamble.
try:
new_virtual_state = self.optunroll.jump_to_existing_trace(
- end_jump, label_op, state.runtime_boxes, force_boxes=True)
+ end_jump, label_op, state.runtime_boxes, force_boxes=True)
except InvalidLoop:
pass
if new_virtual_state is not None:
- self.optunroll.jump_to_preamble(celltoken, end_jump, info)
+ self.jump_to_preamble(celltoken, end_jump)
return (UnrollInfo(target_token, label_op, extra_same_as,
self.quasi_immutable_deps),
self._newoperations)
@@ -209,7 +202,8 @@
cell_token = jump_op.getdescr()
assert isinstance(cell_token, JitCellToken)
if not inline_short_preamble or len(cell_token.target_tokens) == 1:
- return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ self.jump_to_preamble(cell_token, jump_op)
+ return info, self._newoperations[:]
# force all the information that does not go to the short
# preamble at all
self.flush()
@@ -219,7 +213,8 @@
vs = self.optunroll.jump_to_existing_trace(jump_op, None, runtime_boxes,
force_boxes=False)
except InvalidLoop:
- return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ self.jump_to_preamble(cell_token, jump_op)
+ return info, self._newoperations[:]
if vs is None:
return info, self._newoperations[:]
warmrunnerdescr = self.metainterp_sd.warmrunnerdesc
@@ -237,7 +232,8 @@
if vs is None:
return info, self._newoperations[:]
debug_print("Retrace count reached, jumping to preamble")
- return self.optunroll.jump_to_preamble(cell_token, jump_op, info)
+ self.jump_to_preamble(cell_token, jump_op)
+ return info, self._newoperations[:]
exported_state = self.optunroll.export_state(info.jump_op.getarglist(),
info.inputargs, runtime_boxes,
box_names_memo)
@@ -245,6 +241,12 @@
self._clean_optimization_info(self._newoperations)
return exported_state, self._newoperations
+ def jump_to_preamble(self, cell_token, jump_op):
+ assert cell_token.target_tokens[0].virtual_state is None
+ jump_op = jump_op.copy_and_change(
+ rop.JUMP, descr=cell_token.target_tokens[0])
+ self.send_extra_operation(jump_op)
+
class OptUnroll(Optimization):
"""Unroll the loop into two iterations. The first one will
@@ -304,13 +306,6 @@
label_op.initarglist(label_op.getarglist() + sb.used_boxes)
return target_token
- def jump_to_preamble(self, cell_token, jump_op, info):
- assert cell_token.target_tokens[0].virtual_state is None
- jump_op = jump_op.copy_and_change(rop.JUMP,
- descr=cell_token.target_tokens[0])
- self.optimizer.send_extra_operation(jump_op)
- return info, self.optimizer._newoperations[:]
-
def jump_to_existing_trace(self, jump_op, label_op, runtime_boxes, force_boxes=False):
jitcelltoken = jump_op.getdescr()
@@ -346,20 +341,14 @@
continue
short_preamble = target_token.short_preamble
- try:
- extra = self.inline_short_preamble(args + virtuals, args,
- short_preamble, self.optimizer.patchguardop,
- target_token, label_op)
- except KeyError:
- # SHOULD NOT OCCUR BUT DOES: WHY?? issue #2185
- self.optimizer.metainterp_sd.logger_ops.log_short_preamble([],
- short_preamble, {})
- raise
-
+ extra = self.inline_short_preamble(args + virtuals, args,
+ short_preamble, self.optimizer.patchguardop,
+ target_token, label_op)
self.optimizer.send_extra_operation(jump_op.copy_and_change(rop.JUMP,
args=args + extra,
descr=target_token))
return None # explicit because the return can be non-None
+
return virtual_state
def _map_args(self, mapping, arglist):
More information about the pypy-commit
mailing list