Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79176:0e3a0ea12d66 Date: 2015-08-24 10:12 +0200 http://bitbucket.org/pypy/pypy/changeset/0e3a0ea12d66/
Log: rework the retracing 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 @@ -289,18 +289,11 @@ original_jitcell_token=jitcell_token) start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs, 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 - loop_ops[-1].setdescr(mid_descr_token) loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as + - [mid_label] + loop_ops) + [loop_info.label_op] + loop_ops) loop.check_consistency() - jitcell_token.target_tokens = [start_descr, mid_descr_token] + jitcell_token.target_tokens = [start_descr] + jitcell_token.target_tokens send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop") record_loop_or_bridge(metainterp_sd, loop) return start_descr @@ -333,33 +326,13 @@ loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd, loop_data) except InvalidLoop: + # Fall back on jumping to preamble xxx - # Fall back on jumping to preamble - target_token = label.getdescr() - assert isinstance(target_token, TargetToken) - part.operations = [orignial_label] + \ - [ResOperation(rop.JUMP, inputargs[:], - descr=loop_jitcell_token)] - try: - optimize_trace(metainterp_sd, jitdriver_sd, part, - jitdriver_sd.warmstate.enable_opts, - inline_short_preamble=False, start_state=start_state, - export_state=False) - except InvalidLoop: - xxx # XXX forget optimizations - return None loop = partial_trace - target_token = TargetToken(loop_jitcell_token) - target_token.original_jitcell_token = loop_jitcell_token - target_token.short_preamble = loop_info.short_preamble - target_token.virtual_state = start_state.virtual_state - loop_ops[-1].setdescr(target_token) - mid_label = ResOperation(rop.LABEL, loop_info.label_args, - descr=target_token) - loop.operations = (loop.operations + loop_info.extra_same_as + [mid_label] + loop.operations = (loop.operations + loop_info.extra_same_as + + [loop_info.label_op] + loop_ops) - loop_jitcell_token.target_tokens.append(target_token) #quasi_immutable_deps = {} #if loop.quasi_immutable_deps: @@ -369,6 +342,7 @@ #if quasi_immutable_deps: # loop.quasi_immutable_deps = quasi_immutable_deps + target_token = loop.operations[-1].getdescr() resumekey.compile_and_attach(metainterp, loop) record_loop_or_bridge(metainterp_sd, loop) 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 @@ -336,6 +336,8 @@ sb = self.optunroll.short_preamble_producer sb.add_preamble_op(preamble_op) if info is not None: + if op.type == 'i' and info.is_constant(): + return ConstInt(info.getint()) return info.force_box(op, self) return op diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py --- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py +++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py @@ -393,9 +393,9 @@ self.used_boxes.append(preamble_op.op) self.short_preamble_jump.append(preamble_op.preamble_op) - def build_short_preamble(self): + def build_short_preamble(self, sb_jump): label_op = ResOperation(rop.LABEL, self.short_inputargs[:]) - jump_op = ResOperation(rop.JUMP, self.short_preamble_jump) + jump_op = ResOperation(rop.JUMP, sb_jump) TreeLoop.check_consistency_of(self.short_inputargs, self.short + [jump_op], check_descr=False) return [label_op] + self.short + [jump_op] diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -8122,7 +8122,7 @@ i4 = int_add(i3, i3) i5 = int_add(i4, i4) i6 = int_add(i5, i5) - jump(i6, i3) + jump(i6) """ self.optimize_loop(ops, expected, expected_short=short) 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 @@ -483,7 +483,9 @@ jump_op = loop.operations[-1] assert jump_op.getopnum() == rop.JUMP ops = loop.operations[:-1] - start_label = ResOperation(rop.LABEL, loop.inputargs) + jump_op.setdescr(JitCellToken()) + start_label = ResOperation(rop.LABEL, loop.inputargs, + jump_op.getdescr()) end_label = jump_op.copy_and_change(opnum=rop.LABEL) call_pure_results = self._convert_call_pure_results(call_pure_results) preamble_data = compile.LoopCompileData(start_label, end_label, ops, @@ -497,12 +499,11 @@ preamble = TreeLoop('preamble') preamble.inputargs = start_state.renamed_inputargs start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs) - emit_end_label = ResOperation(rop.LABEL, loop_info.label_args) preamble.operations = ([start_label] + preamble_ops + - loop_info.extra_same_as + [emit_end_label]) - loop.inputargs = loop_info.label_args[:] - loop.operations = [emit_end_label] + ops - return Info(preamble, loop_info.short_preamble, + loop_info.extra_same_as + [loop_info.label_op]) + loop.inputargs = loop_info.label_op.getarglist()[:] + loop.operations = [loop_info.label_op] + ops + return Info(preamble, loop_info.target_token.short_preamble, start_state.virtual_state) 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 @@ -1,6 +1,6 @@ import sys -from rpython.jit.metainterp.history import Const +from rpython.jit.metainterp.history import Const, TargetToken from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\ ShortPreambleBuilder, PreambleOp from rpython.jit.metainterp.optimizeopt import info, intutils @@ -58,10 +58,10 @@ elif isinstance(preamble_info, intutils.IntBound): if preamble_info.lower > MININT/2 or preamble_info.upper < MAXINT/2: intbound = self.getintbound(op) - if preamble_info.lower > MININT/2: + if preamble_info.has_lower and preamble_info.lower > MININT/2: intbound.has_lower = True intbound.lower = preamble_info.lower - if preamble_info.upper < MAXINT/2: + if preamble_info.has_upper and preamble_info.upper < MAXINT/2: intbound.has_upper = True intbound.upper = preamble_info.upper @@ -108,29 +108,24 @@ label_args = state.virtual_state.make_inputargs( start_label.getarglist(), self.optimizer) self.optimizer.init_inparg_dict_from(label_args) - self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops, - call_pure_results, False) - orig_jump_args = [self.get_box_replacement(op) - for op in end_jump.getarglist()] - jump_args = state.virtual_state.make_inputargs(orig_jump_args, - self.optimizer, force_boxes=True) - pass_to_short = state.virtual_state.make_inputargs(orig_jump_args, - self.optimizer, force_boxes=True, - append_virtuals=True) - 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( - label_args + self.short_preamble_producer.used_boxes, - jump_args + extra_jump_args) - jump_op = ResOperation(rop.JUMP, jump_args) - self.optimizer.send_extra_operation(jump_op) - return (UnrollInfo(self.short_preamble_producer.build_short_preamble(), - label_args, + info, _ = self.optimizer.propagate_all_forward( + start_label.getarglist()[:], ops, call_pure_results, False) + label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr()) + target_token, extra = self.finalize_short_preamble(label_op, + state.virtual_state) + label_op.setdescr(target_token) + label_op.initarglist(label_op.getarglist() + extra) + # force the boxes for virtual state to match + x = state.virtual_state.make_inputargs( + [self.get_box_replacement(x) for x in end_jump.getarglist()], + self.optimizer, force_boxes=True) + new_virtual_state = self.jump_to_existing_trace(end_jump) + if new_virtual_state is not None: + res = self.jump_to_preamble(start_label.getdescr(), end_jump, + info) + xxx + #return new_virtual_state, self.optimizer._newoperations + return (UnrollInfo(target_token, label_op, self.short_preamble_producer.extra_same_as), self.optimizer._newoperations) @@ -145,7 +140,7 @@ cell_token = jump_op.getdescr() if not inline_short_preamble or len(cell_token.target_tokens) == 1: return self.jump_to_preamble(cell_token, jump_op, info) - vs = self.jump_to_existing_trace(jump_op, inline_short_preamble) + vs = self.jump_to_existing_trace(jump_op) if vs is None: return info, self.optimizer._newoperations[:] warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc @@ -171,6 +166,32 @@ self.optimizer._clean_optimization_info(self.optimizer._newoperations) return exported_state, self.optimizer._newoperations + def finalize_short_preamble(self, label_op, virtual_state): + sb = self.short_preamble_producer + self.optimizer._clean_optimization_info(sb.short_inputargs) + d = {} + for arg in label_op.getarglist(): + d[arg] = None + new_used_boxes = [] + new_sb_jump = [] + for i in range(len(sb.used_boxes)): + ub = sb.used_boxes[i] + if ub in d: + continue + new_used_boxes.append(ub) + new_sb_jump.append(sb.short_preamble_jump[i]) + short_preamble = sb.build_short_preamble(new_sb_jump) + jitcelltoken = label_op.getdescr() + if jitcelltoken.target_tokens is None: + jitcelltoken.target_tokens = [] + target_token = TargetToken(jitcelltoken, + original_jitcell_token=jitcelltoken) + target_token.original_jitcell_token = jitcelltoken + target_token.virtual_state = virtual_state + target_token.short_preamble = short_preamble + jitcelltoken.target_tokens.append(target_token) + return target_token, new_used_boxes + 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, @@ -179,7 +200,7 @@ return info, self.optimizer._newoperations[:] - def jump_to_existing_trace(self, jump_op, inline_short_preamble): + def jump_to_existing_trace(self, jump_op): jitcelltoken = jump_op.getdescr() args = [self.get_box_replacement(op) for op in jump_op.getarglist()] virtual_state = self.get_virtual_state(args) @@ -203,7 +224,7 @@ continue short_preamble = target_token.short_preamble pass_to_short = target_virtual_state.make_inputargs(args, - self.optimizer, force_boxes=True, append_virtuals=True) + self.optimizer, append_virtuals=True) args = target_virtual_state.make_inputargs(args, self.optimizer) extra = self.inline_short_preamble(pass_to_short, @@ -215,22 +236,6 @@ return None # explicit because the return can be non-None return virtual_state - def filter_extra_jump_args(self, label_args, jump_args): - label_args = [self.get_box_replacement(x, True) for x in label_args] - jump_args = [self.get_box_replacement(x) for x in jump_args] - new_label_args = [] - new_jump_args = [] - assert len(label_args) == len(jump_args) - d = {} - for i in range(len(label_args)): - arg = label_args[i] - if arg in d: - continue - new_label_args.append(arg) - new_jump_args.append(jump_args[i]) - d[arg] = None - return new_label_args, new_jump_args - def inline_short_preamble(self, jump_args, short_inputargs, short_ops, short_jump_op, patchguardop): try: @@ -318,13 +323,13 @@ class UnrollInfo(LoopInfo): """ A state after optimizing the peeled loop, contains the following: - * short_preamble - list of operations that go into short preamble - * label_args - additional things to put in the label + * target_token - generated target token + * label_args - label operations at the beginning * extra_same_as - list of extra same as to add at the end of the preamble """ - def __init__(self, short_preamble, label_args, extra_same_as): - self.short_preamble = short_preamble - self.label_args = label_args + def __init__(self, target_token, label_op, extra_same_as): + self.target_token = target_token + self.label_op = label_op self.extra_same_as = extra_same_as def final(self): diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -133,12 +133,18 @@ if box is not None: fieldbox = opinfo._fields[self.fielddescrs[i].get_index()] # must be there - fieldinfo = get_forwarded(fieldbox) + if fieldbox is not None: + fieldinfo = get_forwarded(fieldbox) + else: + fieldinfo = None else: fieldbox = None fieldinfo = None - self.fieldstate[i].generate_guards(other.fieldstate[i], fieldbox, - fieldinfo, state) + # XXX all those ifs are for tests, not sure what to do + if self.fieldstate[i] is not None: + self.fieldstate[i].generate_guards(other.fieldstate[i], + fieldbox, + fieldinfo, state) def _generalization_of_structpart(self, other): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit