[pypy-svn] r69709 - in pypy/branch/virtual-forcing/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Fri Nov 27 17:40:33 CET 2009


Author: arigo
Date: Fri Nov 27 17:40:33 2009
New Revision: 69709

Modified:
   pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py
Log:
(pedronis, arigo)

Store in the EffectInfo attached to calldescrs a flag that tells us if
the residual call can possibly access a virtualizable's virtualized
fields.


Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py	Fri Nov 27 17:40:33 2009
@@ -14,6 +14,7 @@
 from pypy.translator.backendopt.writeanalyze import WriteAnalyzer
 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
 
 import py, sys
 from pypy.tool.ansi_print import ansi_log
@@ -182,8 +183,10 @@
         self.metainterp_sd = metainterp_sd
         self.cpu = metainterp_sd.cpu
         self.portal_runner_ptr = portal_runner_ptr
-        self.raise_analyzer = RaiseAnalyzer(self.rtyper.annotator.translator)
-        self.write_analyzer = WriteAnalyzer(self.rtyper.annotator.translator)
+        translator = self.rtyper.annotator.translator
+        self.raise_analyzer = RaiseAnalyzer(translator)
+        self.write_analyzer = WriteAnalyzer(translator)
+        self.virtualizable_analyzer = VirtualizableAnalyzer(translator)
 
     def make_portal_bytecode(self, graph):
         log.info("making JitCodes...")
@@ -323,7 +326,9 @@
         # ok
         if consider_effects_of is not None:
             effectinfo = effectinfo_from_writeanalyze(
-                    self.write_analyzer.analyze(consider_effects_of), self.cpu)
+                    self.write_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)
         else:
             calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT)

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py	Fri Nov 27 17:40:33 2009
@@ -2,21 +2,25 @@
 from pypy.rpython.lltypesystem.rclass import OBJECT
 from pypy.rpython.lltypesystem import lltype
 from pypy.rpython.ootypesystem import ootype
+from pypy.translator.backendopt.graphanalyze import BoolGraphAnalyzer
 
 class EffectInfo(object):
     _cache = {}
 
-    def __new__(cls, write_descrs_fields, write_descrs_arrays):
-        key = frozenset(write_descrs_fields), frozenset(write_descrs_arrays)
+    def __new__(cls, write_descrs_fields, write_descrs_arrays,
+                promotes_virtualizables):
+        key = (frozenset(write_descrs_fields), frozenset(write_descrs_arrays),
+               promotes_virtualizables)
         if key in cls._cache:
             return cls._cache[key]
         result = object.__new__(cls)
         result.write_descrs_fields = write_descrs_fields
         result.write_descrs_arrays = write_descrs_arrays
+        result.promotes_virtualizables = promotes_virtualizables
         cls._cache[key] = result
         return result
 
-def effectinfo_from_writeanalyze(effects, cpu):
+def effectinfo_from_writeanalyze(effects, cpu, promotes_virtualizables=False):
     from pypy.translator.backendopt.writeanalyze import top_set
     if effects is top_set:
         return None
@@ -39,7 +43,8 @@
             write_descrs_arrays.append(descr)
         else:
             assert 0
-    return EffectInfo(write_descrs_fields, write_descrs_arrays)
+    return EffectInfo(write_descrs_fields, write_descrs_arrays,
+                      promotes_virtualizables)
 
 def consider_struct(TYPE, fieldname):
     if fieldType(TYPE, fieldname) is lltype.Void:
@@ -55,7 +60,6 @@
         return False
     return True
 
-
 def consider_array(ARRAY):
     if arrayItem(ARRAY) is lltype.Void:
         return False
@@ -64,3 +68,9 @@
     if not isinstance(ARRAY, lltype.GcArray): # can be a non-GC-array
         return False
     return True
+
+# ____________________________________________________________
+
+class VirtualizableAnalyzer(BoolGraphAnalyzer):
+    def analyze_simple_operation(self, op):
+        return op.opname == 'promote_virtualizable'

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py	Fri Nov 27 17:40:33 2009
@@ -121,8 +121,8 @@
             supports_floats = False
             def fielddescrof(self, STRUCT, fieldname):
                 return ('fielddescr', STRUCT, fieldname)
-            def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT, stuff=None):
-                return ('calldescr', FUNC, NON_VOID_ARGS, RESULT)
+            def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT, effectinfo=None):
+                return ('calldescr', FUNC, NON_VOID_ARGS, RESULT, effectinfo)
             def typedescrof(self, CLASS):
                 return ('typedescr', CLASS)
             def methdescrof(self, CLASS, methname):
@@ -386,6 +386,47 @@
         assert cw.list_of_addr2name[0][1].endswith('.A1')
         assert cw.list_of_addr2name[1][1] == 'A1.g'
 
+    def test_promote_virtualizable_effectinfo(self):
+        class Frame(object):
+            _virtualizable2_ = ['x']
+            
+            def __init__(self, x, y):
+                self.x = x
+                self.y = y
+
+        def g1(f):
+            f.x += 1
+
+        def g2(f):
+            return f.x
+
+        def h(f):
+            f.y -= 1
+
+        def f(n):
+            f_inst = Frame(n+1, n+2)
+            g1(f_inst)
+            r = g2(f_inst)
+            h(f_inst)
+            return r
+
+        graphs = self.make_graphs(f, [5])
+        cw = CodeWriter(self.rtyper)
+        cw.candidate_graphs = [graphs[0]]
+        cw._start(self.metainterp_sd, None)
+        jitcode = cw.make_one_bytecode((graphs[0], None), False)
+        calldescrs = [calldescr for calldescr in jitcode.constants
+                                if isinstance(calldescr, tuple) and
+                                   calldescr[0] == 'calldescr']
+        assert len(calldescrs) == 4    # for __init__, g1, g2, h.
+        effectinfo_g1 = calldescrs[1][4]
+        effectinfo_g2 = calldescrs[2][4]
+        effectinfo_h  = calldescrs[3][4]
+        assert effectinfo_g1.promotes_virtualizables
+        assert effectinfo_g2.promotes_virtualizables
+        assert not effectinfo_h.promotes_virtualizables
+
+
 class ImmutableFieldsTests:
 
     def test_fields(self):



More information about the Pypy-commit mailing list