Author: Hakan Ardo <ha...@debian.org> Branch: Changeset: r48691:d9708bf78c40 Date: 2011-11-03 11:46 +0100 http://bitbucket.org/pypy/pypy/changeset/d9708bf78c40/
Log: break up circular dependencies among short_boxes and give up 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 @@ -146,8 +146,6 @@ 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) 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 @@ -7450,6 +7450,55 @@ """ self.optimize_loop(ops, expected) + def test_setarrayitem_p0_p0(self): + ops = """ + [i0, i1] + p0 = escape() + setarrayitem_gc(p0, 2, p0, descr=arraydescr) + jump(i0, i1) + """ + expected = """ + [i0, i1] + p0 = escape() + setarrayitem_gc(p0, 2, p0, descr=arraydescr) + jump(i0, i1) + """ + self.optimize_loop(ops, expected) + + def test_setfield_p0_p0(self): + ops = """ + [i0, i1] + p0 = escape() + setfield_gc(p0, p0, descr=arraydescr) + jump(i0, i1) + """ + expected = """ + [i0, i1] + p0 = escape() + setfield_gc(p0, p0, descr=arraydescr) + jump(i0, i1) + """ + self.optimize_loop(ops, expected) + + def test_setfield_p0_p1_p0(self): + ops = """ + [i0, i1] + p0 = escape() + p1 = escape() + setfield_gc(p0, p1, descr=adescr) + setfield_gc(p1, p0, descr=bdescr) + jump(i0, i1) + """ + expected = """ + [i0, i1] + p0 = escape() + p1 = escape() + setfield_gc(p0, p1, descr=adescr) + setfield_gc(p1, p0, descr=bdescr) + jump(i0, i1) + """ + self.optimize_loop(ops, expected) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py --- a/pypy/jit/metainterp/optimizeopt/virtualstate.py +++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py @@ -551,6 +551,7 @@ optimizer.produce_potential_short_preamble_ops(self) self.short_boxes = {} + self.short_boxes_in_production = {} for box in self.potential_ops.keys(): try: @@ -606,6 +607,10 @@ return if isinstance(box, Const): return + if box in self.short_boxes_in_production: + raise BoxNotProducable + self.short_boxes_in_production[box] = True + if box in self.potential_ops: ops = self.prioritized_alternatives(box) produced_one = False _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit