Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r59228:97f0ffc6c659
Date: 2012-12-02 11:50 -0800
http://bitbucket.org/pypy/pypy/changeset/97f0ffc6c659/
Log: Made the invalidation of boxes more intelligent at calls in the
heapcache.
diff --git a/pypy/jit/metainterp/heapcache.py b/pypy/jit/metainterp/heapcache.py
--- a/pypy/jit/metainterp/heapcache.py
+++ b/pypy/jit/metainterp/heapcache.py
@@ -128,6 +128,18 @@
if frombox not in self.new_boxes:
del cache[frombox]
return
+ else:
+ # Only invalidate things that are either escaped or arguments
+ for descr, boxes in self.heap_cache.iteritems():
+ for box in boxes.keys():
+ if not self.is_unescaped(box) or box in argboxes:
+ del boxes[box]
+ for descr, indices in self.heap_array_cache.iteritems():
+ for boxes in indices.itervalues():
+ for box in boxes.keys():
+ if not self.is_unescaped(box) or box in argboxes:
+ del boxes[box]
+ return
self.heap_cache.clear()
self.heap_array_cache.clear()
diff --git a/pypy/jit/metainterp/test/test_heapcache.py
b/pypy/jit/metainterp/test/test_heapcache.py
--- a/pypy/jit/metainterp/test/test_heapcache.py
+++ b/pypy/jit/metainterp/test/test_heapcache.py
@@ -18,7 +18,7 @@
index2 = ConstInt(1)
-class FakeEffektinfo(object):
+class FakeEffectinfo(object):
EF_ELIDABLE_CANNOT_RAISE = 0 #elidable function (and cannot
raise)
EF_LOOPINVARIANT = 1 #special: call it only once per loop
EF_CANNOT_RAISE = 2 #a function which cannot raise
@@ -39,7 +39,7 @@
self.oopspecindex = oopspecindex
def get_extra_info(self):
- return FakeEffektinfo(self.extraeffect, self.oopspecindex)
+ return FakeEffectinfo(self.extraeffect, self.oopspecindex)
class TestHeapCache(object):
def test_known_class_box(self):
@@ -252,7 +252,7 @@
assert h.getarrayitem(box1, index2, descr1) is box4
h.invalidate_caches(
- rop.CALL, FakeCallDescr(FakeEffektinfo.EF_ELIDABLE_CANNOT_RAISE),
[])
+ rop.CALL, FakeCallDescr(FakeEffectinfo.EF_ELIDABLE_CANNOT_RAISE),
[])
assert h.getfield(box1, descr1) is box2
assert h.getarrayitem(box1, index1, descr1) is box2
assert h.getarrayitem(box1, index2, descr1) is box4
@@ -263,10 +263,10 @@
assert h.getarrayitem(box1, index2, descr1) is box4
h.invalidate_caches(
- rop.CALL_LOOPINVARIANT,
FakeCallDescr(FakeEffektinfo.EF_LOOPINVARIANT), [])
+ rop.CALL_LOOPINVARIANT,
FakeCallDescr(FakeEffectinfo.EF_LOOPINVARIANT), [])
h.invalidate_caches(
- rop.CALL, FakeCallDescr(FakeEffektinfo.EF_RANDOM_EFFECTS), [])
+ rop.CALL, FakeCallDescr(FakeEffectinfo.EF_RANDOM_EFFECTS), [])
assert h.getfield(box1, descr1) is None
assert h.getarrayitem(box1, index1, descr1) is None
assert h.getarrayitem(box1, index2, descr1) is None
@@ -364,13 +364,13 @@
# Just need the destination box for this call
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffektinfo.EF_CANNOT_RAISE,
FakeEffektinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
[None, None, box2, None, None]
)
assert h.getarrayitem(box1, index1, descr1) is box2
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffektinfo.EF_CANNOT_RAISE,
FakeEffektinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
[None, None, box3, None, None]
)
assert h.getarrayitem(box1, index1, descr1) is None
@@ -379,7 +379,7 @@
assert h.getarrayitem(box4, index1, descr1) is box2
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffektinfo.EF_CANNOT_RAISE,
FakeEffektinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
[None, None, box2, None, None]
)
assert h.getarrayitem(box4, index1, descr1) is None
@@ -451,7 +451,29 @@
assert h.is_unescaped(box1)
assert h.is_unescaped(box2)
h.invalidate_caches(
- rop.CALL, FakeCallDescr(FakeEffektinfo.EF_RANDOM_EFFECTS), [box1]
+ rop.CALL, FakeCallDescr(FakeEffectinfo.EF_RANDOM_EFFECTS), [box1]
)
assert not h.is_unescaped(box1)
assert not h.is_unescaped(box2)
+
+ def test_call_doesnt_invalidate_unescaped_boxes(self):
+ h = HeapCache()
+ h.new(box1)
+ assert h.is_unescaped(box1)
+ h.setfield(box1, box2, descr1)
+ h.invalidate_caches(rop.CALL,
+ FakeCallDescr(FakeEffectinfo.EF_CAN_RAISE),
+ []
+ )
+ assert h.getfield(box1, descr1) is box2
+
+ def test_call_doesnt_invalidate_unescaped_array_boxes(self):
+ h = HeapCache()
+ h.new_array(box1, lengthbox1)
+ assert h.is_unescaped(box1)
+ h.setarrayitem(box1, index1, box3, descr1)
+ h.invalidate_caches(rop.CALL,
+ FakeCallDescr(FakeEffectinfo.EF_CAN_RAISE),
+ []
+ )
+ assert h.getarrayitem(box1, index1, descr1) is box3
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit