Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79051:73dadee30d14 Date: 2015-08-19 12:18 +0200 http://bitbucket.org/pypy/pypy/changeset/73dadee30d14/
Log: pass the first inlining of short preamble in the bridge, yay! 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 @@ -266,6 +266,8 @@ descr=start_descr) mid_descr_token = TargetToken(jitcell_token, original_jitcell_token=jitcell_token) + mid_descr_token.short_preamble = loop_info.short_preamble + mid_descr_token.virtual_state = start_state.virtual_state mid_label = ResOperation(rop.LABEL, loop_info.label_args, descr=mid_descr_token) # XXX assign short preamble and virtual state @@ -1043,10 +1045,12 @@ call_pure_results=call_pure_results, enable_opts=enable_opts) try: - info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data) + try: + info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data) + finally: + forget_optimization_info(inputargs) + forget_optimization_info(operations) except InvalidLoop: - forget_optimization_info(inputargs) - forget_optimization_info(operations) debug_print("compile_new_bridge: got an InvalidLoop") # XXX I am fairly convinced that optimize_bridge cannot actually raise # InvalidLoop @@ -1056,9 +1060,9 @@ new_trace = create_empty_loop(metainterp) new_trace.inputargs = info.inputargs new_trace.operations = newops + target_token = new_trace.operations[-1].getdescr() resumekey.compile_and_attach(metainterp, new_trace) record_loop_or_bridge(metainterp_sd, new_trace) - target_token = new_trace.operations[-1].getdescr() return target_token xxxx if new_trace.operations[-1].getopnum() != rop.LABEL: diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py @@ -18,6 +18,8 @@ info = self.unroll_and_optimize(loop, None) jitcell_token = compile.make_jitcell_token(None) mid_label_descr = TargetToken(jitcell_token) + mid_label_descr.short_preamble = info.short_preamble + mid_label_descr.virtual_state = info.virtual_state start_label_descr = TargetToken(jitcell_token) jitcell_token.target_tokens = [mid_label_descr, start_label_descr] loop.operations[0].setdescr(mid_label_descr) @@ -28,6 +30,7 @@ bridge = self.parse(bridge_ops, postprocess=self.postprocess) start_label = ResOperation(rop.LABEL, bridge.inputargs) bridge.operations[-1].setdescr(jitcell_token) + self.add_guard_future_condition(bridge) data = compile.BridgeCompileData(start_label, bridge.operations, enable_opts=self.enable_opts, inline_short_preamble=inline_short_preamble) @@ -85,4 +88,9 @@ [i0, i1, i2] jump(i0, i1, i2) """ - self.optimize(loop, bridge, bridge) + expected = """ + [i0, i1, i2] + i3 = int_add(i0, 1) + jump(i0, i1, i2, i3) + """ + self.optimize(loop, bridge, expected) 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 @@ -395,9 +395,10 @@ return "" class Info(object): - def __init__(self, preamble, short_preamble=None): + def __init__(self, preamble, short_preamble=None, virtual_state=None): self.preamble = preamble self.short_preamble = short_preamble + self.virtual_state = virtual_state class Storage(compile.ResumeGuardDescr): "for tests." @@ -494,7 +495,8 @@ loop_info.extra_same_as + [emit_end_label]) loop.inputargs = inputargs loop.operations = [emit_end_label] + ops - return Info(preamble, loop_info.short_preamble) + return Info(preamble, loop_info.short_preamble, + start_state.virtual_state) class FakeDescr(compile.ResumeGuardDescr): 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 @@ -79,11 +79,12 @@ modifier = VirtualStateConstructor(self.optimizer) return modifier.get_virtual_state(args) - def _check_no_forwarding(self, lsts): + def _check_no_forwarding(self, lsts, check_newops=True): for lst in lsts: for op in lst: assert op.get_forwarded() is None - assert not self.optimizer._newoperations + if check_newops: + assert not self.optimizer._newoperations def optimize_preamble(self, start_label, end_label, ops, call_pure_results): self._check_no_forwarding([[start_label, end_label], ops]) @@ -110,7 +111,12 @@ pass_to_short = state.virtual_state.make_inputargs(orig_jump_args, self.optimizer, force_boxes=True, append_virtuals=True) - extra_jump_args = self.inline_short_preamble(pass_to_short) + sb = self.short_preamble_producer + self.optimizer._clean_optimization_info(sb.short_inputargs) + extra_jump_args = self.inline_short_preamble(pass_to_short, + sb.short_inputargs, sb.short, + sb.short_preamble_jump, + self.optimizer.patchguardop) # remove duplicates, removes stuff from used boxes too label_args, jump_args = self.filter_extra_jump_args( start_label.getarglist() + self.short_preamble_producer.used_boxes, @@ -125,6 +131,8 @@ def optimize_bridge(self, start_label, operations, call_pure_results, inline_short_preamble): assert inline_short_preamble + self._check_no_forwarding([start_label.getarglist(), + operations]) info, ops = self.optimizer.propagate_all_forward( start_label.getarglist()[:], operations[:-1], call_pure_results, True) @@ -134,9 +142,15 @@ def jump_to_existing_trace(self, jump_op, inline_short_preamble): jitcelltoken = jump_op.getdescr() - args = jump_op.getarglist() + args = [self.get_box_replacement(op) for op in jump_op.getarglist()] + target_token = jitcelltoken.target_tokens[0] virtual_state = self.get_virtual_state(args) + short_preamble = target_token.short_preamble + extra = self.inline_short_preamble(args, + short_preamble[0].getarglist(), short_preamble[1:-1], + short_preamble[-1].getarglist(), self.optimizer.patchguardop) self.send_extra_operation(jump_op.copy_and_change(rop.JUMP, + args=args + extra, descr=jitcelltoken.target_tokens[0])) def filter_extra_jump_args(self, label_args, jump_args): @@ -153,22 +167,24 @@ d[arg] = None return new_label_args, new_jump_args - def inline_short_preamble(self, jump_args): - sb = self.short_preamble_producer - assert len(sb.short_inputargs) == len(jump_args) + def inline_short_preamble(self, jump_args, short_inputargs, short_ops, + short_jump_op, patchguardop): + self._check_no_forwarding([short_inputargs, short_ops], False) + assert len(short_inputargs) == len(jump_args) for i in range(len(jump_args)): - sb.short_inputargs[i].set_forwarded(None) - self.make_equal_to(sb.short_inputargs[i], jump_args[i]) - patchguardop = self.optimizer.patchguardop - for op in sb.short: + short_inputargs[i].set_forwarded(None) + self.make_equal_to(short_inputargs[i], jump_args[i]) + for op in short_ops: if op.is_guard(): op = self.replace_op_with(op, op.getopnum()) op.rd_snapshot = patchguardop.rd_snapshot op.rd_frame_info_list = patchguardop.rd_frame_info_list self.optimizer.send_extra_operation(op) res = [self.optimizer.get_box_replacement(op) for op in - sb.short_preamble_jump] - for op in sb.short_inputargs: + short_jump_op] + for op in short_inputargs: + op.set_forwarded(None) + for op in short_ops: op.set_forwarded(None) return res _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit