Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r67133:7bf619e411bf
Date: 2013-09-28 19:19 -0700
http://bitbucket.org/pypy/pypy/changeset/7bf619e411bf/
Log: Fish the descr in the tracing HeapCache when optimizing LL_ARRAYCOPY
diff --git a/rpython/jit/metainterp/heapcache.py
b/rpython/jit/metainterp/heapcache.py
--- a/rpython/jit/metainterp/heapcache.py
+++ b/rpython/jit/metainterp/heapcache.py
@@ -117,12 +117,15 @@
# effects are so well defined.
elif effectinfo.oopspecindex == effectinfo.OS_ARRAYCOPY:
# The destination box
- if argboxes[2] in self.new_boxes:
- # XXX: no descr here so we invalidate any of them, not just
- # of the correct type
- # XXX: in theory the indices of the copy could be looked at
- # as well
- for descr, cache in self.heap_array_cache.iteritems():
+ if (
+ argboxes[2] in self.new_boxes and
+ len(effectinfo.write_descrs_arrays) == 1
+ ):
+ # Fish the descr out of the effectinfo
+ cache =
self.heap_array_cache.get(effectinfo.write_descrs_arrays[0])
+ if cache is not None:
+ # XXX: in theory the indices of the copy could be
+ # looked at
for idx, cache in cache.iteritems():
for frombox in cache.keys():
if not self.is_unescaped(frombox):
diff --git a/rpython/jit/metainterp/test/test_heapcache.py
b/rpython/jit/metainterp/test/test_heapcache.py
--- a/rpython/jit/metainterp/test/test_heapcache.py
+++ b/rpython/jit/metainterp/test/test_heapcache.py
@@ -29,17 +29,24 @@
OS_ARRAYCOPY = 0
- def __init__(self, extraeffect, oopspecindex):
+ def __init__(self, extraeffect, oopspecindex, write_descrs_arrays):
self.extraeffect = extraeffect
self.oopspecindex = oopspecindex
+ self.write_descrs_arrays = write_descrs_arrays
+
class FakeCallDescr(object):
- def __init__(self, extraeffect, oopspecindex=None):
+ def __init__(self, extraeffect, oopspecindex=None, write_descrs_arrays=[]):
self.extraeffect = extraeffect
self.oopspecindex = oopspecindex
+ self.write_descrs_arrays = write_descrs_arrays
def get_extra_info(self):
- return FakeEffectinfo(self.extraeffect, self.oopspecindex)
+ return FakeEffectinfo(
+ self.extraeffect, self.oopspecindex,
+ write_descrs_arrays=self.write_descrs_arrays
+ )
+
class TestHeapCache(object):
def test_known_class_box(self):
@@ -364,13 +371,13 @@
# Just need the destination box for this call
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]),
[None, None, box2, None, None]
)
assert h.getarrayitem(box1, index1, descr1) is box2
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]),
[None, None, box3, None, None]
)
assert h.getarrayitem(box1, index1, descr1) is None
@@ -379,11 +386,24 @@
assert h.getarrayitem(box4, index1, descr1) is box2
h.invalidate_caches(
rop.CALL,
- FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY),
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr1]),
[None, None, box2, None, None]
)
assert h.getarrayitem(box4, index1, descr1) is None
+ def test_ll_arraycopy_differing_descrs(self):
+ h = HeapCache()
+ h.setarrayitem(box1, index1, box2, descr1)
+ assert h.getarrayitem(box1, index1, descr1) is box2
+ h.new_array(box2, lengthbox2)
+ h.invalidate_caches(
+ rop.CALL,
+ FakeCallDescr(FakeEffectinfo.EF_CANNOT_RAISE,
FakeEffectinfo.OS_ARRAYCOPY, write_descrs_arrays=[descr2]),
+ [None, None, box2, None, None]
+ )
+ assert h.getarrayitem(box1, index1, descr1) is box2
+
+
def test_unescaped(self):
h = HeapCache()
assert not h.is_unescaped(box1)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit