[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