Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79041:f10f772c7fb6 Date: 2015-08-18 17:22 +0200 http://bitbucket.org/pypy/pypy/changeset/f10f772c7fb6/
Log: fight, the best I got so far 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 @@ -244,11 +244,6 @@ # mapping const value -> info corresponding to it's heap cache self.const_infos = self.optimizer.cpu.ts.new_ref_dict() - 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 flush(self): self.cached_dict_reads.clear() self.corresponding_array_descrs.clear() @@ -478,6 +473,11 @@ 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/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py --- a/rpython/jit/metainterp/optimizeopt/intbounds.py +++ b/rpython/jit/metainterp/optimizeopt/intbounds.py @@ -137,7 +137,7 @@ v1, v2 = v2, v1 # if both are constant, the pure optimization will deal with it if v2.is_constant() and not v1.is_constant(): - if False and not self.optimizer.is_inputarg(arg1): + if not self.optimizer.is_inputarg(arg1): if arg1.getopnum() == rop.INT_ADD: prod_arg1 = arg1.getarg(0) prod_arg2 = arg1.getarg(1) 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 @@ -41,6 +41,7 @@ class AbstractShortOp(object): """ An operation that is potentially produced by the short preamble """ + pass class HeapOp(AbstractShortOp): def __init__(self, res, getfield_op): @@ -209,15 +210,15 @@ # of AbstractShortOp self.potential_ops = OrderedDict() self.produced_short_boxes = {} - self.short_inputargs = [] # a way to produce const boxes, e.g. setfield_gc(p0, Const). # We need to remember those, but they don't produce any new boxes self.const_short_boxes = [] - for i in range(len(inputargs)): - box = inputargs[i] + self.short_inputargs = [] + for i in range(len(label_args)): + box = label_args[i] renamed = OpHelpers.inputarg_from_tp(box.type) - self.potential_ops[box] = ShortInputArg(label_args[i], renamed) self.short_inputargs.append(renamed) + self.potential_ops[box] = ShortInputArg(box, renamed) optimizer.produce_potential_short_preamble_ops(self) @@ -302,7 +303,7 @@ renamed = OpHelpers.inputarg_from_tp(label_args[i].type) short_inpargs.append(renamed) else: - #assert isinstance(inparg, ShortInputArg) + assert isinstance(inparg.short_op, ShortInputArg) short_inpargs.append(inparg.preamble_op) return short_inpargs @@ -314,7 +315,8 @@ self.potential_ops[op] = CompoundOp(op, pop, prev_op) def add_pure_op(self, op): - assert op not in self.potential_ops + if op in self.potential_ops: + return self.add_potential_op(op, PureOp(op)) def add_loopinvariant_op(self, 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 @@ -879,7 +879,7 @@ jump(p2, p3) """ short = """ - [p1] + [p1, p2] i1 = getfield_gc_i(p1, descr=valuedescr) jump(i1) """ @@ -1221,12 +1221,10 @@ setfield_gc(p0, p1, descr=nextdescr) setfield_gc(p2, i1, descr=valuedescr) setfield_gc(p1, p2, descr=nextdescr) - jump(p1) + jump(p1, p2, i1) """ loop = """ - [p0] - p41 = getfield_gc_r(p0, descr=nextdescr) - i0 = getfield_gc_i(p41, descr=valuedescr) + [p0, p41, i0] i1 = int_add(i0, 1) p1 = new_with_vtable(descr=nodesize2) p2 = new_with_vtable(descr=nodesize2) @@ -1234,7 +1232,7 @@ setfield_gc(p0, p1, descr=nextdescr) setfield_gc(p2, i1, descr=valuedescr) setfield_gc(p1, p2, descr=nextdescr) - jump(p1) + jump(p1, p2, i1) """ self.optimize_loop(ops, loop, preamble) @@ -2397,7 +2395,11 @@ setfield_gc(p1, i2, descr=valuedescr) jump(p1, i1, i2, 1) # , i5) """ - self.optimize_loop(ops, expected, preamble) + expected_short = """ + [] + """ + self.optimize_loop(ops, expected, preamble, + expected_short=expected_short) def test_duplicate_setfield_residual_guard_2(self): # the difference with the previous test is that the field value is @@ -8718,5 +8720,16 @@ """ self.optimize_loop(ops, expected, expected_short=expected_short) + def test_simple_swap_arguments(self): + ops = """ + [i0, i1] + i2 = int_add(i1, 1) + jump(i2, i0) + """ + expected = """ + [] + """ + self.optimize_loop(ops, expected) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass diff --git a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py --- a/rpython/jit/metainterp/optimizeopt/test/test_unroll.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_unroll.py @@ -12,7 +12,7 @@ from rpython.jit.metainterp.resoperation import rop, ResOperation,\ InputArgRef from rpython.jit.metainterp.optimizeopt.shortpreamble import \ - ShortPreambleBuilder, PreambleOp + ShortPreambleBuilder, PreambleOp, ShortInputArg from rpython.jit.metainterp.compile import LoopCompileData from rpython.jit.metainterp.optimizeopt.virtualstate import \ NotVirtualStateInfo, LEVEL_CONSTANT, LEVEL_UNKNOWN, LEVEL_KNOWNCLASS,\ @@ -64,6 +64,9 @@ remap[v] = k equaloplists(short, exp, remap=remap) +def producable_short_boxes(l): + return [x for x in l if not isinstance(x.short_op, ShortInputArg)] + class TestUnroll(BaseTestUnroll): def test_simple(self): loop = """ @@ -230,7 +233,8 @@ jump(i1, p1, p2) """ es, loop, preamble = self.optimize(loop) - assert len(es.short_boxes) == 2 + assert len(producable_short_boxes(es.short_boxes)) == 2 + xxx def test_setfield_forced_virtual(self): loop = """ 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 @@ -107,7 +107,10 @@ for op in end_jump.getarglist()] jump_args = state.virtual_state.make_inputargs(orig_jump_args, self.optimizer, force_boxes=True) - extra_jump_args = self.inline_short_preamble(jump_args) + 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) # 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, @@ -166,9 +169,11 @@ for arg in label_args: infos[arg] = self.optimizer.getinfo(arg) sb = ShortBoxes() + label_args_plus_virtuals = virtual_state.make_inputargs(end_args, + self.optimizer, append_virtuals=True) short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs, - label_args) - short_inputargs = sb.create_short_inputargs(label_args) + label_args_plus_virtuals) + short_inputargs = sb.create_short_inputargs(label_args_plus_virtuals) for produced_op in short_boxes: op = produced_op.short_op.res if not isinstance(op, Const): 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 @@ -516,7 +516,8 @@ state) return state - def make_inputargs(self, inputargs, optimizer, force_boxes=False): + def make_inputargs(self, inputargs, optimizer, force_boxes=False, + append_virtuals=False): assert len(inputargs) == len(self.state) boxes = [None] * self.numnotvirtuals @@ -530,6 +531,14 @@ for i in range(len(inputargs)): self.state[i].enum_forced_boxes(boxes, inputargs[i], optimizer) + if append_virtuals: + # we append the virtuals here in case some stuff is proven + # to be not a virtual and there are getfields in the short preamble + # that will read items out of there + for i in range(len(inputargs)): + if not isinstance(self.state[i], NotVirtualStateInfo): + boxes.append(inputargs[i]) + return boxes def debug_print(self, hdr='', bad=None, metainterp_sd=None): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit