Author: Hakan Ardo <ha...@debian.org> Branch: Changeset: r48686:8b75e3ece413 Date: 2011-11-03 11:02 +0100 http://bitbucket.org/pypy/pypy/changeset/8b75e3ece413/
Log: allow setarrayitem to update the cache exported from the preamble to the loop the same way setfield does diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py --- a/pypy/jit/metainterp/optimizeopt/heap.py +++ b/pypy/jit/metainterp/optimizeopt/heap.py @@ -140,6 +140,17 @@ getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)], result, op.getdescr()) shortboxes.add_potential(getop, synthetic=True) + if op.getopnum() == rop.SETARRAYITEM_GC: + result = op.getarg(2) + if isinstance(result, Const): + newresult = result.clonebox() + optimizer.make_constant(newresult, result) + result = newresult + if result is op.getarg(0): # FIXME: Unsupported corner case?? + continue + getop = ResOperation(rop.GETARRAYITEM_GC, [op.getarg(0), op.getarg(1)], + result, op.getdescr()) + shortboxes.add_potential(getop, synthetic=True) elif op.result is not None: shortboxes.add_potential(op) diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -7412,6 +7412,44 @@ """ self.optimize_loop(ops, expected, preamble, expected_short=short) + def test_cache_setfield_across_loop_boundaries(self): + ops = """ + [p1] + p2 = getfield_gc(p1, descr=valuedescr) + guard_nonnull_class(p2, ConstClass(node_vtable)) [] + call(p2, descr=nonwritedescr) + p3 = new_with_vtable(ConstClass(node_vtable)) + setfield_gc(p1, p3, descr=valuedescr) + jump(p1) + """ + expected = """ + [p1, p2] + call(p2, descr=nonwritedescr) + p3 = new_with_vtable(ConstClass(node_vtable)) + setfield_gc(p1, p3, descr=valuedescr) + jump(p1, p3) + """ + self.optimize_loop(ops, expected) + + def test_cache_setarrayitem_across_loop_boundaries(self): + ops = """ + [p1] + p2 = getarrayitem_gc(p1, 3, descr=arraydescr) + guard_nonnull_class(p2, ConstClass(node_vtable)) [] + call(p2, descr=nonwritedescr) + p3 = new_with_vtable(ConstClass(node_vtable)) + setarrayitem_gc(p1, 3, p3, descr=arraydescr) + jump(p1) + """ + expected = """ + [p1, p2] + call(p2, descr=nonwritedescr) + p3 = new_with_vtable(ConstClass(node_vtable)) + setarrayitem_gc(p1, 3, p3, descr=arraydescr) + jump(p1, p3) + """ + self.optimize_loop(ops, expected) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit