Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r46279:262a9d9d8cf2
Date: 2011-08-04 13:47 -0700
http://bitbucket.org/pypy/pypy/changeset/262a9d9d8cf2/
Log: Use intbounds information to decide if a {get,set}arrayitem_gc can
alias a previous setfield which became lazy.
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
@@ -239,13 +239,14 @@
return
cf.force_lazy_setfield(self, can_cache)
- def force_lazy_setarrayitem(self, arraydescr, can_cache=True):
+ def force_lazy_setarrayitem(self, arraydescr, indexvalue=None,
can_cache=True):
try:
submap = self.cached_arrayitems[arraydescr]
except KeyError:
return
- for cf in submap.values():
- cf.force_lazy_setfield(self, can_cache)
+ for idx, cf in submap.iteritems():
+ if indexvalue is None or indexvalue.intbound.contains(idx):
+ cf.force_lazy_setfield(self, can_cache)
def fixup_guard_situation(self):
# hackish: reverse the order of the last two operations if it makes
@@ -357,7 +358,7 @@
return
else:
# variable index, so make sure the lazy setarrayitems are done
- self.force_lazy_setarrayitem(op.getdescr())
+ self.force_lazy_setarrayitem(op.getdescr(), indexvalue=indexvalue)
# default case: produce the operation
arrayvalue.ensure_nonnull()
self.emit_operation(op)
@@ -381,7 +382,7 @@
cf.do_setfield(self, op)
else:
# variable index, so make sure the lazy setarrayitems are done
- self.force_lazy_setarrayitem(op.getdescr(), can_cache=False)
+ self.force_lazy_setarrayitem(op.getdescr(), indexvalue=indexvalue,
can_cache=False)
# and then emit the operation
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -4687,6 +4687,30 @@
py.test.skip("harder")
self.optimize_loop(ops, expected)
+ def test_bounded_lazy_setfield(self):
+ ops = """
+ [p0, i0]
+ i1 = int_gt(i0, 2)
+ guard_true(i1) []
+ setarrayitem_gc(p0, 0, 3)
+ setarrayitem_gc(p0, 2, 4)
+ setarrayitem_gc(p0, i0, 15)
+ i2 = getarrayitem_gc(p0, 2)
+ jump(p0, i2)
+ """
+ # Remove the getarrayitem_gc, because we know that p[i0] does not alias
+ # p0[2]
+ expected = """
+ [p0, i0]
+ i1 = int_gt(i0, 2)
+ guard_true(i1) []
+ setarrayitem_gc(p0, i0, 15)
+ setarrayitem_gc(p0, 0, 3)
+ setarrayitem_gc(p0, 2, 4)
+ jump(p0, 4)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit