[pypy-commit] pypy store-sink-array: Must include support for readonly_descrs_arrays.
arigo
noreply at buildbot.pypy.org
Sun Jun 19 19:52:47 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: store-sink-array
Changeset: r45019:81c0cc74a8f1
Date: 2011-06-19 19:50 +0200
http://bitbucket.org/pypy/pypy/changeset/81c0cc74a8f1/
Log: Must include support for readonly_descrs_arrays.
diff --git a/pypy/jit/codewriter/effectinfo.py b/pypy/jit/codewriter/effectinfo.py
--- a/pypy/jit/codewriter/effectinfo.py
+++ b/pypy/jit/codewriter/effectinfo.py
@@ -75,12 +75,13 @@
#
OS_MATH_SQRT = 100
- def __new__(cls, readonly_descrs_fields,
+ def __new__(cls, readonly_descrs_fields, readonly_descrs_arrays,
write_descrs_fields, write_descrs_arrays,
extraeffect=EF_CAN_RAISE,
oopspecindex=OS_NONE,
can_invalidate=False):
key = (frozenset(readonly_descrs_fields),
+ frozenset(readonly_descrs_arrays),
frozenset(write_descrs_fields),
frozenset(write_descrs_arrays),
extraeffect,
@@ -89,6 +90,7 @@
return cls._cache[key]
result = object.__new__(cls)
result.readonly_descrs_fields = readonly_descrs_fields
+ result.readonly_descrs_arrays = readonly_descrs_arrays
if extraeffect == EffectInfo.EF_LOOPINVARIANT or \
extraeffect == EffectInfo.EF_PURE:
result.write_descrs_fields = []
@@ -119,7 +121,7 @@
if effects is top_set:
return None
readonly_descrs_fields = []
- # readonly_descrs_arrays = [] --- not enabled for now
+ readonly_descrs_arrays = []
write_descrs_fields = []
write_descrs_arrays = []
@@ -145,10 +147,13 @@
elif tup[0] == "array":
add_array(write_descrs_arrays, tup)
elif tup[0] == "readarray":
- pass
+ tupw = ("array",) + tup[1:]
+ if tupw not in effects:
+ add_array(readonly_descrs_arrays, tup)
else:
assert 0
return EffectInfo(readonly_descrs_fields,
+ readonly_descrs_arrays,
write_descrs_fields,
write_descrs_arrays,
extraeffect,
diff --git a/pypy/jit/codewriter/test/test_effectinfo.py b/pypy/jit/codewriter/test/test_effectinfo.py
--- a/pypy/jit/codewriter/test/test_effectinfo.py
+++ b/pypy/jit/codewriter/test/test_effectinfo.py
@@ -34,6 +34,15 @@
assert not effectinfo.readonly_descrs_fields
assert not effectinfo.write_descrs_arrays
+def test_include_read_array():
+ A = lltype.GcArray(lltype.Signed)
+ effects = frozenset([("readarray", lltype.Ptr(A))])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert list(effectinfo.readonly_descrs_arrays) == [('arraydescr', A)]
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
+
def test_include_write_array():
A = lltype.GcArray(lltype.Signed)
effects = frozenset([("array", lltype.Ptr(A))])
@@ -51,6 +60,16 @@
assert list(effectinfo.write_descrs_fields) == [('fielddescr', S, "a")]
assert not effectinfo.write_descrs_arrays
+def test_dont_include_read_and_write_array():
+ A = lltype.GcArray(lltype.Signed)
+ effects = frozenset([("readarray", lltype.Ptr(A)),
+ ("array", lltype.Ptr(A))])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.readonly_descrs_arrays
+ assert not effectinfo.write_descrs_fields
+ assert list(effectinfo.write_descrs_arrays) == [('arraydescr', A)]
+
def test_filter_out_typeptr():
effects = frozenset([("struct", lltype.Ptr(OBJECT), "typeptr")])
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
@@ -201,6 +201,8 @@
# XXX stored on effectinfo are large
for fielddescr in effectinfo.readonly_descrs_fields:
self.force_lazy_setfield(fielddescr)
+ for arraydescr in effectinfo.readonly_descrs_arrays:
+ self.force_lazy_setarrayitem(arraydescr)
for fielddescr in effectinfo.write_descrs_fields:
self.force_lazy_setfield(fielddescr)
try:
More information about the pypy-commit
mailing list