[pypy-svn] r70258 - in pypy/branch/jit-delayed-write/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Dec 23 12:48:08 CET 2009
Author: arigo
Date: Wed Dec 23 12:48:08 2009
New Revision: 70258
Modified:
pypy/branch/jit-delayed-write/pypy/jit/metainterp/codewriter.py
pypy/branch/jit-delayed-write/pypy/jit/metainterp/effectinfo.py
pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_effectinfo.py
Log:
Bring the info about which fields are read into the EffectInfo
class in the jit. Improve tests a little bit.
Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/codewriter.py Wed Dec 23 12:48:08 2009
@@ -11,7 +11,7 @@
from pypy.tool.udir import udir
from pypy.translator.simplify import get_funcobj, get_functype
from pypy.translator.backendopt.canraise import RaiseAnalyzer
-from pypy.translator.backendopt.writeanalyze import WriteAnalyzer
+from pypy.translator.backendopt.writeanalyze import ReadWriteAnalyzer
from pypy.jit.metainterp.typesystem import deref, arrayItem, fieldType
from pypy.jit.metainterp.effectinfo import effectinfo_from_writeanalyze
from pypy.jit.metainterp.effectinfo import VirtualizableAnalyzer
@@ -185,7 +185,7 @@
self.portal_runner_ptr = portal_runner_ptr
translator = self.rtyper.annotator.translator
self.raise_analyzer = RaiseAnalyzer(translator)
- self.write_analyzer = WriteAnalyzer(translator)
+ self.readwrite_analyzer = ReadWriteAnalyzer(translator)
self.virtualizable_analyzer = VirtualizableAnalyzer(translator)
def make_portal_bytecode(self, graph):
@@ -326,7 +326,7 @@
# ok
if consider_effects_of is not None:
effectinfo = effectinfo_from_writeanalyze(
- self.write_analyzer.analyze(consider_effects_of),
+ self.readwrite_analyzer.analyze(consider_effects_of),
self.cpu,
self.virtualizable_analyzer.analyze(consider_effects_of))
calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT, effectinfo)
Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/effectinfo.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/effectinfo.py (original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/effectinfo.py Wed Dec 23 12:48:08 2009
@@ -7,13 +7,16 @@
class EffectInfo(object):
_cache = {}
- def __new__(cls, write_descrs_fields, write_descrs_arrays,
- promotes_virtualizables=False):
- key = (frozenset(write_descrs_fields), frozenset(write_descrs_arrays),
+ def __new__(cls, read_descrs_fields, write_descrs_fields,
+ write_descrs_arrays, promotes_virtualizables=False):
+ key = (frozenset(read_descrs_fields),
+ frozenset(write_descrs_fields),
+ frozenset(write_descrs_arrays),
promotes_virtualizables)
if key in cls._cache:
return cls._cache[key]
result = object.__new__(cls)
+ result.read_descrs_fields = read_descrs_fields
result.write_descrs_fields = write_descrs_fields
result.write_descrs_arrays = write_descrs_arrays
result.promotes_virtualizables = promotes_virtualizables
@@ -24,26 +27,37 @@
from pypy.translator.backendopt.writeanalyze import top_set
if effects is top_set:
return None
+ read_descrs_fields = []
+ # read_descrs_arrays = [] --- not enabled for now
write_descrs_fields = []
write_descrs_arrays = []
+
+ def add_struct(descrs_fields, (_, T, fieldname)):
+ T = deref(T)
+ if consider_struct(T, fieldname):
+ descr = cpu.fielddescrof(T, fieldname)
+ descrs_fields.append(descr)
+
+ def add_array(descrs_arrays, (_, T)):
+ ARRAY = deref(T)
+ if consider_array(ARRAY):
+ descr = cpu.arraydescrof(ARRAY)
+ descrs_arrays.append(descr)
+
for tup in effects:
if tup[0] == "struct":
- _, T, fieldname = tup
- T = deref(T)
- if not consider_struct(T, fieldname):
- continue
- descr = cpu.fielddescrof(T, fieldname)
- write_descrs_fields.append(descr)
+ add_struct(write_descrs_fields, tup)
+ elif tup[0] == "readstruct":
+ add_struct(read_descrs_fields, tup)
elif tup[0] == "array":
- _, T = tup
- ARRAY = deref(T)
- if not consider_array(ARRAY):
- continue
- descr = cpu.arraydescrof(ARRAY)
- write_descrs_arrays.append(descr)
+ add_array(write_descrs_arrays, tup)
+ elif tup[0] == "readarray":
+ pass
else:
assert 0
- return EffectInfo(write_descrs_fields, write_descrs_arrays,
+ return EffectInfo(read_descrs_fields,
+ write_descrs_fields,
+ write_descrs_arrays,
promotes_virtualizables)
def consider_struct(TYPE, fieldname):
Modified: pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_effectinfo.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_effectinfo.py (original)
+++ pypy/branch/jit-delayed-write/pypy/jit/metainterp/test/test_effectinfo.py Wed Dec 23 12:48:08 2009
@@ -3,32 +3,68 @@
from pypy.rpython.ootypesystem import ootype
from pypy.jit.metainterp.effectinfo import effectinfo_from_writeanalyze
+class FakeCPU:
+ def fielddescrof(self, T, fieldname):
+ return ('fielddescr', T, fieldname)
+ def arraydescrof(self, A):
+ return ('arraydescr', A)
+
+def test_include_read_field():
+ S = lltype.GcStruct("S", ("a", lltype.Signed))
+ effects = frozenset([("readstruct", lltype.Ptr(S), "a")])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert list(effectinfo.read_descrs_fields) == [('fielddescr', S, "a")]
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
+
+def test_include_write_field():
+ S = lltype.GcStruct("S", ("a", lltype.Signed))
+ effects = frozenset([("struct", lltype.Ptr(S), "a")])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert list(effectinfo.write_descrs_fields) == [('fielddescr', S, "a")]
+ assert not effectinfo.read_descrs_fields
+ assert not effectinfo.write_descrs_arrays
+
+def test_include_write_array():
+ A = lltype.GcArray(lltype.Signed)
+ effects = frozenset([("array", lltype.Ptr(A))])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.read_descrs_fields
+ 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")])
effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.read_descrs_fields
assert not effectinfo.write_descrs_fields
assert not effectinfo.write_descrs_arrays
def test_filter_out_array_of_void():
effects = frozenset([("array", lltype.Ptr(lltype.GcArray(lltype.Void)))])
effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.read_descrs_fields
assert not effectinfo.write_descrs_fields
assert not effectinfo.write_descrs_arrays
def test_filter_out_struct_with_void():
effects = frozenset([("struct", lltype.Ptr(lltype.GcStruct("x", ("a", lltype.Void))), "a")])
effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.read_descrs_fields
assert not effectinfo.write_descrs_fields
assert not effectinfo.write_descrs_arrays
def test_filter_out_ooarray_of_void():
effects = frozenset([("array", ootype.Array(ootype.Void))])
effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.read_descrs_fields
assert not effectinfo.write_descrs_fields
assert not effectinfo.write_descrs_arrays
def test_filter_out_instance_with_void():
effects = frozenset([("struct", ootype.Instance("x", ootype.ROOT, {"a": ootype.Void}), "a")])
effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.read_descrs_fields
assert not effectinfo.write_descrs_fields
assert not effectinfo.write_descrs_arrays
More information about the Pypy-commit
mailing list