Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79291:45f5f8d0c2c8 Date: 2015-08-30 12:07 +0200 http://bitbucket.org/pypy/pypy/changeset/45f5f8d0c2c8/
Log: fix some damage + force args early for preamble diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -473,11 +473,6 @@ if indexb is None or indexb.contains(idx): cf.force_lazy_setfield(self, None, can_cache) - def force_at_end_of_preamble(self): - self.cached_dict_reads.clear() - self.corresponding_array_descrs.clear() - self.force_all_lazy_setfields_and_arrayitems() - def force_all_lazy_setfields_and_arrayitems(self): items = self.cached_fields.items() if not we_are_translated(): 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 @@ -206,9 +206,6 @@ def setup(self): pass - def force_at_end_of_preamble(self): - pass - # Called after last operation has been propagated to flush out any posponed ops def flush(self): pass @@ -296,10 +293,6 @@ return self.replaces_guard[op] = value.last_guard_pos - def force_at_end_of_preamble(self): - for o in self.optimizations: - o.force_at_end_of_preamble() - def force_box_for_end_of_preamble(self, box): if box.type == 'r': info = self.getptrinfo(box) 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 @@ -343,7 +343,10 @@ empty_info = EmptyInfo() -class ShortPreambleBuilder(object): +class AbstractShortPreambleBuilder(object): + pass + +class ShortPreambleBuilder(AbstractShortPreambleBuilder): """ ShortPreambleBuilder is used during optimizing of the peeled loop, starting from short_boxes exported from the preamble. It will build the short preamble and necessary extra label arguments @@ -413,3 +416,6 @@ TreeLoop.check_consistency_of(self.short_inputargs, self.short + [jump_op], check_descr=False) return [label_op] + self.short + [jump_op] + +class ExtendedShortPreambleBuilder(AbstractShortPreambleBuilder): + pass 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 @@ -4013,9 +4013,9 @@ p3 = force_token() # p2 = new_with_vtable(descr=vref_descr) + setfield_gc(p2, p3, descr=virtualtokendescr) + setfield_gc(p2, NULL, descr=virtualforceddescr) setfield_gc(p0, p2, descr=nextdescr) - setfield_gc(p2, NULL, descr=virtualforceddescr) - setfield_gc(p2, p3, descr=virtualtokendescr) # call_may_force_n(i1, descr=mayforcevirtdescr) guard_not_forced() [p2, i1] @@ -4024,9 +4024,9 @@ setfield_gc(p2, NULL, descr=virtualtokendescr) p1 = new_with_vtable(descr=nodesize) p1b = new_with_vtable(descr=nodesize) - setfield_gc(p2, p1, descr=virtualforceddescr) setfield_gc(p1b, i1, descr=valuedescr) setfield_gc(p1, p1b, descr=nextdescr) + setfield_gc(p2, p1, descr=virtualforceddescr) jump(p0, i1) """ # the point of this test is that 'i1' should show up in the fail_args @@ -4686,8 +4686,8 @@ [i0, p0] p1 = new_array(i0, descr=gcarraydescr) i1 = arraylen_gc(p1) + ifoo = arraylen_gc(p0, descr=gcarraydescr) setarrayitem_gc(p0, 0, p1, descr=gcarraydescr) - ifoo = arraylen_gc(p0, descr=gcarraydescr) jump(i0, p0) """ self.optimize_loop(ops, 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 @@ -2,7 +2,7 @@ import sys from rpython.jit.metainterp.history import Const, TargetToken, JitCellToken from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\ - ShortPreambleBuilder, PreambleOp + ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp from rpython.jit.metainterp.optimizeopt import info, intutils from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\ Optimization, LoopInfo, MININT, MAXINT @@ -121,13 +121,15 @@ flush=False) label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr()) extra_same_as = self.short_preamble_producer.extra_same_as[:] + args = state.virtual_state.make_inputargs( + [self.get_box_replacement(x) for x in end_jump.getarglist()], + self.optimizer, force_boxes=True) + for arg in args: + self.optimizer.force_box(arg) target_token = self.finalize_short_preamble(label_op, state.virtual_state) label_op.setdescr(target_token) # force the boxes for virtual state to match - 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: celltoken = start_label.getdescr() @@ -153,7 +155,7 @@ return self.jump_to_preamble(cell_token, jump_op, info) # force all the information that does not go to the short # preamble at all - self.optimizer.force_at_end_of_preamble() + self.optimizer.flush() for a in jump_op.getarglist(): self.optimizer.force_box_for_end_of_preamble(a) vs = self.jump_to_existing_trace(jump_op) @@ -196,7 +198,7 @@ target_token.virtual_state = virtual_state target_token.short_preamble = short_preamble jitcelltoken.target_tokens.append(target_token) - self.short_preamble_producer = None # no more boxes + self.short_preamble_producer = ExtendedShortPreambleBuilder() label_op.initarglist(label_op.getarglist() + sb.used_boxes) return target_token @@ -275,7 +277,7 @@ def export_state(self, start_label, original_label_args, renamed_inputargs): end_args = [self.optimizer.force_box_for_end_of_preamble(a) for a in original_label_args] - self.optimizer.force_at_end_of_preamble() + self.optimizer.flush() virtual_state = self.get_virtual_state(end_args) end_args = [self.get_box_replacement(arg) for arg in end_args] infos = {} _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit