Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79191:260ee146ed8f Date: 2015-08-24 11:13 +0200 http://bitbucket.org/pypy/pypy/changeset/260ee146ed8f/
Log: rework short preamble a bit 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 @@ -346,8 +346,8 @@ starting from short_boxes exported from the preamble. It will build the short preamble and necessary extra label arguments """ - def __init__(self, short_boxes, short_inputargs, exported_infos, - optimizer=None): + def __init__(self, label_args, short_boxes, short_inputargs, + exported_infos, optimizer=None): for produced_op in short_boxes: op = produced_op.short_op.res preamble_op = produced_op.preamble_op @@ -359,6 +359,9 @@ info = empty_info preamble_op.set_forwarded(info) self.short = [] + self.label_dict = {} + for arg in label_args: + self.label_dict[arg] = None self.used_boxes = [] self.short_preamble_jump = [] self.extra_same_as = [] @@ -390,12 +393,17 @@ def add_preamble_op(self, preamble_op): if preamble_op.invented_name: self.extra_same_as.append(preamble_op.op) - self.used_boxes.append(preamble_op.op) + op = preamble_op.op + if op in self.label_dict: + return + self.label_dict[op] = None + self.used_boxes.append(op) self.short_preamble_jump.append(preamble_op.preamble_op) - def build_short_preamble(self, sb_jump): + def build_short_preamble(self): label_op = ResOperation(rop.LABEL, self.short_inputargs[:]) - jump_op = ResOperation(rop.JUMP, sb_jump) + jump_op = ResOperation(rop.JUMP, self.short_preamble_jump) + # WARNING! the short_preamble_jump is shared on purpose 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/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py --- a/rpython/jit/metainterp/optimizeopt/unroll.py +++ b/rpython/jit/metainterp/optimizeopt/unroll.py @@ -103,23 +103,28 @@ def optimize_peeled_loop(self, start_label, end_jump, ops, state, call_pure_results): self._check_no_forwarding([[start_label, end_jump], ops]) - self.import_state(start_label, state) - self.potential_extra_ops = {} label_args = state.virtual_state.make_inputargs( start_label.getarglist(), self.optimizer) + self.import_state(start_label, state, label_args) + self.potential_extra_ops = {} self.optimizer.init_inparg_dict_from(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, + target_token = self.finalize_short_preamble(label_op, state.virtual_state) label_op.setdescr(target_token) - label_op.initarglist(label_op.getarglist() + extra) + extra = self.short_preamble_producer.used_boxes + label_args = [self.get_box_replacement(op) for op in label_args] + label_op.initarglist(label_args + 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) + # the short preamble could have grown, we reinitialize + # the label_op again + label_op.initarglist(label_args + extra) if new_virtual_state is not None: res = self.jump_to_preamble(start_label.getdescr(), end_jump, info) @@ -169,18 +174,7 @@ 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) + short_preamble = sb.build_short_preamble() jitcelltoken = label_op.getdescr() if jitcelltoken.target_tokens is None: jitcelltoken.target_tokens = [] @@ -190,7 +184,7 @@ target_token.virtual_state = virtual_state target_token.short_preamble = short_preamble jitcelltoken.target_tokens.append(target_token) - return target_token, new_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 @@ -238,6 +232,7 @@ def inline_short_preamble(self, jump_args, short_inputargs, short_ops, short_jump_op, patchguardop): + # warning!!!! short_jump_op might have arguments appended IN PLACE try: self._check_no_forwarding([short_inputargs, short_ops], False) assert len(short_inputargs) == len(jump_args) @@ -285,7 +280,7 @@ short_boxes, renamed_inputargs, short_inputargs) - def import_state(self, targetop, exported_state): + def import_state(self, targetop, exported_state, label_args): # the mapping between input args (from old label) and what we need # to actually emit. Update the info assert (len(exported_state.next_iteration_args) == @@ -301,8 +296,9 @@ # import the optimizer state, starting from boxes that can be produced # by short preamble self.short_preamble_producer = ShortPreambleBuilder( - exported_state.short_boxes, exported_state.short_inputargs, - exported_state.exported_infos, self.optimizer) + label_args, exported_state.short_boxes, + exported_state.short_inputargs, exported_state.exported_infos, + self.optimizer) for produced_op in exported_state.short_boxes: produced_op.produce_op(self, exported_state.exported_infos) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit