Author: Alex Gaynor <alex.gay...@gmail.com> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit