Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79048:2f2f6319cdd2 Date: 2015-08-19 11:09 +0200 http://bitbucket.org/pypy/pypy/changeset/2f2f6319cdd2/
Log: start working on direct tests for bridges 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 @@ -76,6 +76,26 @@ return opt.propagate_all_forward(self.start_label.getarglist(), self.operations, self.call_pure_results, self.enable_opts) +class BridgeCompileData(CompileData): + """ This represents ops() with a jump at the end that goes to some + loop, we need to deal with virtual state and inlining of short preamble + """ + def __init__(self, start_label, operations, call_pure_results=None, + enable_opts=None, inline_short_preamble=False): + self.start_label = start_label + self.operations = operations + self.call_pure_results = call_pure_results + self.enable_opts = enable_opts + self.inline_short_preamble = inline_short_preamble + + def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll): + from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer + + opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) + return opt.optimize_bridge(self.start_label, self.operations, + self.call_pure_results, + self.inline_short_preamble) + class UnrolledLoopData(CompileData): """ This represents label() ops jump with extra info that's from the run of LoopCompileData. Jump goes to the same label @@ -253,7 +273,7 @@ loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as + [mid_label] + loop_ops) loop.check_consistency() - jitcell_token.all_target_tokens = [start_descr, mid_descr_token] + jitcell_token.target_tokens = [mid_descr_token, start_descr] send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop") record_loop_or_bridge(metainterp_sd, loop) return start_descr @@ -783,10 +803,10 @@ # to the corresponding guard_op and compile from there assert metainterp.resumekey_original_loop_token is not None new_loop.original_jitcell_token = metainterp.resumekey_original_loop_token - inputargs = metainterp.history.inputargs + inputargs = new_loop.inputargs if not we_are_translated(): self._debug_suboperations = new_loop.operations - propagate_original_jitcell_token(new_loop) + #propagate_original_jitcell_token(new_loop) send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata, self, inputargs, new_loop.operations, new_loop.original_jitcell_token) @@ -1001,11 +1021,10 @@ metainterp_sd = metainterp.staticdata jitdriver_sd = metainterp.jitdriver_sd state = jitdriver_sd.warmstate - #if isinstance(resumekey, ResumeAtPositionDescr): - # inline_short_preamble = False - #else: - # xxx - # inline_short_preamble = True + if isinstance(resumekey, ResumeAtPositionDescr): + inline_short_preamble = False + else: + inline_short_preamble = True inputargs = metainterp.history.inputargs[:] operations = metainterp.history.operations label = ResOperation(rop.LABEL, inputargs) @@ -1014,9 +1033,15 @@ call_pure_results = metainterp.call_pure_results - data = SimpleCompileData(label, operations, - call_pure_results=call_pure_results, - enable_opts=enable_opts) + if operations[-1].getopnum() == rop.JUMP: + data = BridgeCompileData(label, operations[:], + call_pure_results=call_pure_results, + enable_opts=enable_opts, + inline_short_preamble=inline_short_preamble) + else: + data = SimpleCompileData(label, operations[:], + call_pure_results=call_pure_results, + enable_opts=enable_opts) try: info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data) except InvalidLoop: diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -521,6 +521,10 @@ def _emit_operation(self, op): assert not op.is_call_pure() orig_op = op + op = self.get_box_replacement(op) + if op.is_constant(): + return # can happen e.g. if we postpone the operation that becomes + # constant op = self.replace_op_with(op, op.getopnum()) for i in range(op.numargs()): arg = self.force_box(op.getarg(i)) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py new file mode 100644 --- /dev/null +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py @@ -0,0 +1,56 @@ + +from rpython.jit.metainterp.optimizeopt.test.test_util import BaseTest,\ + LLtypeMixin, convert_old_style_to_targets +from rpython.jit.metainterp import compile +from rpython.jit.metainterp.resoperation import ResOperation, rop +from rpython.jit.metainterp.history import TargetToken + +class TestOptimizeBridge(BaseTest, LLtypeMixin): + enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll" + + def optimize(self, ops, bridge_ops, expected, inline_short_preamble=True): + loop = self.parse(ops, postprocess=self.postprocess) + info = self.unroll_and_optimize(loop, None) + jitcell_token = compile.make_jitcell_token(None) + mid_label_descr = TargetToken(jitcell_token) + start_label_descr = TargetToken(jitcell_token) + jitcell_token.target_tokens = [mid_label_descr, start_label_descr] + loop.operations[0].setdescr(mid_label_descr) + loop.operations[-1].setdescr(mid_label_descr) + info.preamble.operations[0].setdescr(start_label_descr) + guards = [op for op in loop.operations if op.is_guard()] + assert len(guards) == 1, "more than one guard in the loop" + bridge = self.parse(bridge_ops, postprocess=self.postprocess) + start_label = ResOperation(rop.LABEL, bridge.inputargs) + bridge.operations[-1].setdescr(jitcell_token) + data = compile.BridgeCompileData(start_label, bridge.operations, + enable_opts=self.enable_opts, + inline_short_preamble=inline_short_preamble) + bridge_info, ops = self._do_optimize_loop(data) + loop.check_consistency(check_descr=False) + info.preamble.check_consistency(check_descr=False) + bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] + + ops) + bridge.inputargs = bridge_info.inputargs + bridge.check_consistency(check_descr=False) + expected = self.parse(expected, postprocess=self.postprocess) + self.assert_equal(bridge, convert_old_style_to_targets(expected, + jump=True)) + + def test_simple(self): + loop = """ + [i0] + i1 = int_add(i0, 1) + i2 = int_is_true(i1) + guard_true(i2) [i1, i2] + jump(i1) + """ + bridge = """ + [i0, i1] + jump(i1) + """ + expected = """ + [i0, i1] + jump(i1) + """ + self.optimize(loop, bridge, expected) 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 @@ -122,6 +122,23 @@ self.short_preamble_producer.extra_same_as), self.optimizer._newoperations) + def optimize_bridge(self, start_label, operations, call_pure_results, + inline_short_preamble): + assert inline_short_preamble + info, ops = self.optimizer.propagate_all_forward( + start_label.getarglist()[:], operations[:-1], + call_pure_results, True) + jump_op = operations[-1] + self.jump_to_existing_trace(jump_op, inline_short_preamble) + return info, self.optimizer._newoperations[:] + + def jump_to_existing_trace(self, jump_op, inline_short_preamble): + jitcelltoken = jump_op.getdescr() + args = jump_op.getarglist() + virtual_state = self.get_virtual_state(args) + self.send_extra_operation(jump_op.copy_and_change(rop.JUMP, + descr=jitcelltoken.target_tokens[0])) + def filter_extra_jump_args(self, label_args, jump_args): new_label_args = [] new_jump_args = [] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit