Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r78546:cde47437fc67 Date: 2015-07-13 17:20 +0200 http://bitbucket.org/pypy/pypy/changeset/cde47437fc67/
Log: handle consts better 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 @@ -58,9 +58,7 @@ op = optimizer.get_box_replacement(op) opnum = OpHelpers.getfield_for_descr(descr) getfield_op = ResOperation(opnum, [structbox], descr=descr) - if not op.is_constant(): - # XXXX why? - shortboxes.add_potential(op, getfield_op) + shortboxes.add_potential(op, getfield_op) return for structvalue in self._cached_fields_getfield_op.keys(): op = self._cached_fields_getfield_op[structvalue] 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 @@ -8,6 +8,7 @@ class ShortBoxes(object): def __init__(self): self.potential_ops = [] + self.produced_short_boxes = {} self.ops_used = {} self.extra_same_as = [] @@ -16,21 +17,25 @@ self.ops_used[box] = None optimizer.produce_potential_short_preamble_ops(self) - self.short_boxes = {} - # short boxes has a map of "op from preamble" -> - # "op going to short preamble", where "op from preamble" can be - # anything, but the one going to short_preamble has to be either pure + self.short_boxes = [] + # short boxes is a list of (op, preamble_op) + # where op can be + # anything, but the preamble_op has to be either pure # or a heap cache op for op, preamble_op in self.potential_ops: self.produce_short_preamble_op(op, preamble_op) + self.produced_short_boxes = None return self.short_boxes def add_to_short(self, op, short_op): - self.short_boxes[op] = short_op + self.short_boxes.append((op, short_op)) + self.produced_short_boxes[op] = None def produce_short_preamble_op(self, op, preamble_op): - if isinstance(op, AbstractInputArg): + if isinstance(op, Const): + pass + elif isinstance(op, AbstractInputArg): if op not in self.ops_used: return else: @@ -41,7 +46,7 @@ pass else: return # can't produce - if op in self.short_boxes: + if op in self.produced_short_boxes: opnum = OpHelpers.same_as_for_type(op.type) same_as_op = ResOperation(opnum, [op]) self.extra_same_as.append(same_as_op) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_short.py b/rpython/jit/metainterp/optimizeopt/test/test_short.py --- a/rpython/jit/metainterp/optimizeopt/test/test_short.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_short.py @@ -28,7 +28,7 @@ op = ResOperation(rop.INT_ADD, [i0, i1]) sb = ShortBoxes() sb.create_short_boxes(Opt([op]), [i0, i1]) - assert sb.short_boxes == {op: op} + assert sb.short_boxes == [(op, op)] def test_pure_ops_does_not_work(self): i0 = InputArgInt() @@ -36,7 +36,7 @@ op = ResOperation(rop.INT_ADD, [i0, i1]) sb = ShortBoxes() sb.create_short_boxes(Opt([op]), [i0]) - assert sb.short_boxes == {} + assert sb.short_boxes == [] def test_multiple_similar_ops(self): """ This can happen e.g. if heap cache and pure ops produce @@ -56,10 +56,9 @@ sb = ShortBoxes() sb.create_short_boxes(Opt([op, (op, op1)]), [i0, i1]) assert len(sb.short_boxes) == 2 - l = [x.getopnum() for x in sb.short_boxes.keys()] + l = [x.getopnum() for x, _ in sb.short_boxes] l.sort() assert l == [rop.INT_ADD, rop.SAME_AS_I] - assert op1 in sb.short_boxes.values() - assert op in sb.short_boxes.values() - assert op in sb.short_boxes.keys() + assert [x for x, y in sb.short_boxes][0] == op + assert [y for x, y in sb.short_boxes] == [op, op1] 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 @@ -69,7 +69,7 @@ # we have exported values for i1, which happens to be an inputarg assert es.inputarg_mapping[0][1].getint() == 1 assert isinstance(es.inputarg_mapping[0][1], ConstInt) - assert es.short_boxes == {} + assert es.short_boxes == [] def test_not_constant(self): loop = """ @@ -82,7 +82,7 @@ assert isinstance(vs.state[0], NotVirtualStateInfo) assert vs.state[0].level == LEVEL_UNKNOWN op = preamble.operations[0] - assert es.short_boxes == {op: op} + assert es.short_boxes == [(op, op)] def test_guard_class(self): loop = """ @@ -131,7 +131,7 @@ jump(p0, i0) """ es, loop, preamble = self.optimize(loop) - assert es.short_boxes[preamble.operations[0]] + assert es.short_boxes[0][0] == preamble.operations[0] def test_int_is_true(self): loop = """ @@ -142,5 +142,14 @@ """ es, loop, preamble = self.optimize(loop) op = preamble.operations[0] - assert es.short_boxes == {op:op} + assert es.short_boxes == [(op,op)] assert es.exported_infos[op].is_constant() + + def test_only_setfield(self): + loop = """ + [p0] + setfield_gc(p0, 5, descr=valuedescr) + jump(p0) + """ + es, loop, preamble = self.optimize(loop) + assert es.short_boxes[0][0] == preamble.operations[0].getarg(1) 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 @@ -235,8 +235,9 @@ infos = {} for arg in end_args: infos[arg] = self.optimizer.getinfo(arg) - for box in sb.short_boxes: - infos[box] = self.optimizer.getinfo(box) + for box, _ in sb.short_boxes: + if not isinstance(box, Const): + infos[box] = self.optimizer.getinfo(box) label_args = virtual_state.make_inputargs(end_args, self.optimizer) self.optimizer._clean_optimization_info(end_args) self.optimizer._clean_optimization_info(start_label.getarglist()) @@ -300,8 +301,9 @@ self.optimizer.setinfo_from_preamble(source, info) # import the optimizer state, starting from boxes that can be produced # by short preamble - for op, preamble_op in exported_state.short_boxes.items(): - self.ops_to_import[op] = preamble_op + for op, preamble_op in exported_state.short_boxes: + if not isinstance(op, Const): + self.ops_to_import[op] = preamble_op if preamble_op.is_always_pure(): self.pure(op.getopnum(), PreambleOp(op, preamble_op, exported_state.exported_infos.get(op, None))) @@ -311,7 +313,7 @@ if optheap is None: continue opinfo = self.optimizer.ensure_ptr_info_arg0(preamble_op) - pre_info = exported_state.exported_infos[op] + pre_info = exported_state.exported_infos.get(op, None) pop = PreambleOp(op, preamble_op, pre_info) assert not opinfo.is_virtual() opinfo._fields[preamble_op.getdescr().get_index()] = pop _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit