Author: Spenser Bauman <saba...@gmail.com> Branch: clean-exported-state Changeset: r87740:5cd2c26cc719 Date: 2016-10-12 20:57 -0400 http://bitbucket.org/pypy/pypy/changeset/5cd2c26cc719/
Log: Remove runtime_boxes from ExportedState and require the appropriate values be explicitly passed into each optimization method This prevents the runtime_boxes from getting out of sync during a retrace 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 @@ -108,7 +108,7 @@ """ log_noopt = False - def __init__(self, trace, celltoken, state, + def __init__(self, trace, celltoken, state, runtime_boxes, call_pure_results=None, enable_opts=None, inline_short_preamble=True): self.trace = trace @@ -117,6 +117,8 @@ self.state = state self.call_pure_results = call_pure_results self.inline_short_preamble = inline_short_preamble + assert runtime_boxes is not None + self.runtime_boxes = runtime_boxes def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer @@ -124,7 +126,7 @@ assert unroll # we should not be here if it's disabled 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) + self.runtime_boxes, self.call_pure_results, self.inline_short_preamble) def forget_optimization_info(self): self.state.forget_optimization_info() @@ -294,7 +296,7 @@ start_descr = TargetToken(jitcell_token, original_jitcell_token=jitcell_token) jitcell_token.target_tokens = [start_descr] - loop_data = UnrolledLoopData(trace, jitcell_token, start_state, + loop_data = UnrolledLoopData(trace, jitcell_token, start_state, jumpargs, call_pure_results=call_pure_results, enable_opts=enable_opts) try: @@ -363,7 +365,7 @@ history.record(rop.JUMP, jumpargs[:], None, descr=loop_jitcell_token) enable_opts = jitdriver_sd.warmstate.enable_opts call_pure_results = metainterp.call_pure_results - loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state, + loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state, jumpargs, call_pure_results=call_pure_results, enable_opts=enable_opts) try: @@ -375,6 +377,7 @@ history.cut(cut) history.record(rop.JUMP, jumpargs[:], None, descr=loop_jitcell_token) loop_data = UnrolledLoopData(trace, loop_jitcell_token, start_state, + jumpargs, call_pure_results=call_pure_results, enable_opts=enable_opts, inline_short_preamble=False) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -621,7 +621,7 @@ start_state, preamble_ops = self._do_optimize_loop(preamble_data) preamble_data.forget_optimization_info() loop_data = compile.UnrolledLoopData(preamble_data.trace, - celltoken, start_state, call_pure_results) + celltoken, start_state, runtime_boxes, call_pure_results) loop_info, ops = self._do_optimize_loop(loop_data) preamble = TreeLoop('preamble') preamble.inputargs = start_state.renamed_inputargs 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 @@ -126,15 +126,14 @@ info, newops = self.optimizer.propagate_all_forward( trace.get_iter(), call_pure_results, flush=False) exported_state = self.export_state(info.jump_op.getarglist(), - info.inputargs, - runtime_boxes, memo) + info.inputargs, memo) exported_state.quasi_immutable_deps = info.quasi_immutable_deps # we need to absolutely make sure that we've cleaned up all # the optimization info self.optimizer._clean_optimization_info(self.optimizer._newoperations) return exported_state, self.optimizer._newoperations - def optimize_peeled_loop(self, trace, celltoken, state, + def optimize_peeled_loop(self, trace, celltoken, state, runtime_boxes, call_pure_results, inline_short_preamble=True): trace = trace.get_iter() try: @@ -186,7 +185,7 @@ try: new_virtual_state = self.jump_to_existing_trace( - end_jump, label_op, state.runtime_boxes, force_boxes=False) + end_jump, label_op, runtime_boxes, force_boxes=False) except InvalidLoop: # inlining short preamble failed, jump to preamble self.jump_to_preamble(celltoken, end_jump, info) @@ -199,7 +198,7 @@ # to the preamble. try: new_virtual_state = self.jump_to_existing_trace( - end_jump, label_op, state.runtime_boxes, force_boxes=True) + end_jump, label_op, runtime_boxes, force_boxes=True) except InvalidLoop: pass @@ -276,8 +275,7 @@ debug_print("Retrace count reached, jumping to preamble") return self.jump_to_preamble(cell_token, jump_op, info) exported_state = self.export_state(info.jump_op.getarglist(), - info.inputargs, runtime_boxes, - box_names_memo) + info.inputargs, box_names_memo) exported_state.quasi_immutable_deps = self.optimizer.quasi_immutable_deps self.optimizer._clean_optimization_info(self.optimizer._newoperations) return exported_state, self.optimizer._newoperations @@ -440,8 +438,7 @@ continue self._expand_info(item, infos) - def export_state(self, original_label_args, renamed_inputargs, - runtime_boxes, memo): + def export_state(self, original_label_args, renamed_inputargs, memo): end_args = [self.optimizer.force_box_for_end_of_preamble(a) for a in original_label_args] self.optimizer.flush() @@ -464,7 +461,7 @@ self._expand_info(op, infos) return ExportedState(label_args, end_args, virtual_state, infos, short_boxes, renamed_inputargs, - short_inputargs, runtime_boxes, memo) + short_inputargs, memo) def import_state(self, targetargs, exported_state): # the mapping between input args (from old label) and what we need @@ -527,13 +524,11 @@ * renamed_inputargs - the start label arguments in optimized version * short_inputargs - the renamed inputargs for short preamble * quasi_immutable_deps - for tracking quasi immutables - * runtime_boxes - runtime values for boxes, necessary when generating - guards to jump to """ def __init__(self, end_args, next_iteration_args, virtual_state, exported_infos, short_boxes, renamed_inputargs, - short_inputargs, runtime_boxes, memo): + short_inputargs, memo): self.end_args = end_args self.next_iteration_args = next_iteration_args self.virtual_state = virtual_state @@ -541,7 +536,6 @@ self.short_boxes = short_boxes self.renamed_inputargs = renamed_inputargs self.short_inputargs = short_inputargs - self.runtime_boxes = runtime_boxes self.dump(memo) self.forget_optimization_info() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit