Author: Hakan Ardo <ha...@debian.org> Branch: jit-short_from_state Changeset: r46397:ade2411fa731 Date: 2011-08-06 14:51 +0200 http://bitbucket.org/pypy/pypy/changeset/ade2411fa731/
Log: cache constant setfields across loop boundaries 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 @@ -134,6 +134,10 @@ if structvalue in self._cached_fields: if op.getopnum() == rop.SETFIELD_GC: result = op.getarg(1) + if isinstance(result, Const): + newresult = result.clonebox() + shortboxes.alias(newresult, result) + result = newresult getop = ResOperation(rop.GETFIELD_GC, [op.getarg(0)], result, op.getdescr()) getop = shortboxes.add_potential(getop) 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 @@ -6903,6 +6903,30 @@ """ self.optimize_loop(ops, expected) + def test_cache_constant_setfield(self): + ops = """ + [p5] + i10 = getfield_gc(p5, descr=valuedescr) + call(i10, descr=nonwritedescr) + setfield_gc(p5, 1, descr=valuedescr) + jump(p5) + """ + preamble = """ + [p5] + i10 = getfield_gc(p5, descr=valuedescr) + call(i10, descr=nonwritedescr) + setfield_gc(p5, 1, descr=valuedescr) + jump(p5, 1) + """ + expected = """ + [p5, i10] + call(i10, descr=nonwritedescr) + setfield_gc(p5, 1, descr=valuedescr) + jump(p5, 1) + """ + + self.optimize_loop(ops, expected, preamble) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py --- a/pypy/jit/metainterp/optimizeopt/unroll.py +++ b/pypy/jit/metainterp/optimizeopt/unroll.py @@ -494,7 +494,7 @@ short_op = self.short_boxes.producer(box) newresult = self.add_op_to_short(short_op, short, short_seen) - + short_jumpargs.append(short_op.result) inputargs.append(box) box = newresult 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 @@ -457,12 +457,12 @@ def __init__(self, optimizer, surviving_boxes): self.potential_ops = {} self.duplicates = {} + self.aliases = {} self.optimizer = optimizer for box in surviving_boxes: self.potential_ops[box] = None optimizer.produce_potential_short_preamble_ops(self) - self.aliases = {} self.short_boxes = {} for box in self.potential_ops.keys(): @@ -518,7 +518,8 @@ return box in self.short_boxes def alias(self, newbox, oldbox): - self.short_boxes[newbox] = self.short_boxes[oldbox] + if not isinstance(oldbox, Const): + self.short_boxes[newbox] = self.short_boxes[oldbox] self.aliases[newbox] = oldbox def original(self, box): diff --git a/pypy/jit/metainterp/test/test_virtualstate.py b/pypy/jit/metainterp/test/test_virtualstate.py --- a/pypy/jit/metainterp/test/test_virtualstate.py +++ b/pypy/jit/metainterp/test/test_virtualstate.py @@ -533,7 +533,7 @@ i2 = getarrayitem_gc(p1, 10, descr=arraydescr) call(i2, descr=nonwritedescr) i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend - jump(p0, i2) + jump(p0, i2, p1) """ self.optimize_bridge(loop, loop, expected) bridge = """ @@ -548,7 +548,7 @@ i2 = getarrayitem_gc(p1, 15, descr=arraydescr) i3 = arraylen_gc(p1, descr=arraydescr) # Should be killed by backend i4 = getarrayitem_gc(p1, 10, descr=arraydescr) - jump(p0, i4) + jump(p0, i4, p1) """ self.optimize_bridge(loop, bridge, expected) bridge = """ @@ -565,7 +565,7 @@ i4 = int_ge(i3, 11) guard_true(i4) [] i5 = getarrayitem_gc(p1, 10, descr=arraydescr) - jump(p0, i5) + jump(p0, i5, p1) """ self.optimize_bridge(loop, bridge, expected) bridge = """ @@ -581,7 +581,7 @@ i4 = int_ge(i3, 11) guard_true(i4) [] i5 = getarrayitem_gc(p1, 10, descr=arraydescr) - jump(p0, i5) + jump(p0, i5, p1) """ self.optimize_bridge(loop, bridge, expected, p0=self.myptr) @@ -611,6 +611,37 @@ """ self.optimize_bridge(loop, bridge, expected, p0=self.myptr) + def test_cache_constant_setfield(self): + loop = """ + [p5] + i10 = getfield_gc(p5, descr=valuedescr) + call(i10, descr=nonwritedescr) + setfield_gc(p5, 1, descr=valuedescr) + jump(p5) + """ + bridge = """ + [p0] + jump(p0) + """ + expected = """ + [p0] + guard_nonnull(p0) [] + i10 = getfield_gc(p0, descr=valuedescr) + jump(p0, i10) + """ + self.optimize_bridge(loop, bridge, expected, p0=self.myptr) + bridge = """ + [p0] + setfield_gc(p0, 7, descr=valuedescr) + jump(p0) + """ + expected = """ + [p0] + setfield_gc(p0, 7, descr=valuedescr) + jump(p0, 7) + """ + self.optimize_bridge(loop, bridge, expected, p0=self.myptr) + class TestLLtypeGuards(BaseTestGenerateGuards, LLtypeMixin): pass diff --git a/pypy/module/pypyjit/test_pypy_c/test_call.py b/pypy/module/pypyjit/test_pypy_c/test_call.py --- a/pypy/module/pypyjit/test_pypy_c/test_call.py +++ b/pypy/module/pypyjit/test_pypy_c/test_call.py @@ -187,7 +187,7 @@ guard_no_overflow(descr=...) i18 = force_token() --TICK-- - jump(p0, p1, p2, p3, p4, i8, p7, i17, p8, i9, p10, p11, p12, descr=<Loop0>) + jump(p0, p1, p2, p3, p4, i8, p7, i17, p8, i9, i17, p10, p11, p12, descr=<Loop0>) """) def test_default_and_kw(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit