Author: Ronan Lamy <ronan.l...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit