[pypy-svn] r67127 - in pypy/branch/pyjitpl5/pypy: jit/metainterp jit/metainterp/test jit/tl rlib

pedronis at codespeak.net pedronis at codespeak.net
Sun Aug 23 18:11:01 CEST 2009


Author: pedronis
Date: Sun Aug 23 18:11:00 2009
New Revision: 67127

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
   pypy/branch/pyjitpl5/pypy/jit/tl/tl.py
   pypy/branch/pyjitpl5/pypy/rlib/jit.py
Log:
(cfbolz, pedronis)

introduce fresh_virtualizable hint to use to expose the construction of virtualizables to the jit, to be used carefully



Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	Sun Aug 23 18:11:00 2009
@@ -384,6 +384,7 @@
         self.var_positions = {}
         self.vable_array_vars = {}
         self.immutable_arrays = {}
+        self.vable_flags = {}
         for arg in self.force_block_args_order(block):
             self.register_var(arg, verbose=False)
         self.emit(label(block))
@@ -914,11 +915,19 @@
             return False
         if not vinfo.is_vtypeptr(op.args[0].concretetype):
             return False
+        res = False
         if op.args[1].value in vinfo.static_field_to_extra_box:
-            return True
+            res = True
         if op.args[1].value in vinfo.array_fields:
-            raise VirtualizableArrayField(self.graph)
-        return False
+            res = VirtualizableArrayField(self.graph)
+
+        if res:
+            flags = self.vable_flags[op.args[0]]
+            if 'fresh_virtualizable' in flags:
+                return False
+        if isinstance(res, Exception):
+            raise res
+        return res
 
     def handle_getfield_typeptr(self, op):
         # special-casing for getting the typeptr of an object
@@ -1376,6 +1385,7 @@
         vinfo = self.codewriter.metainterp_sd.virtualizable_info
         assert vinfo is not None
         assert vinfo.is_vtypeptr(op.args[0].concretetype)
+        self.vable_flags[op.args[0]] = op.args[2].value
 
     serialize_op_oostring  = handle_builtin_call
     serialize_op_oounicode = handle_builtin_call

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py	Sun Aug 23 18:11:00 2009
@@ -171,6 +171,9 @@
                 del meth_func._look_inside_me_
 
 class TestOOtype(ToyLanguageTests, OOJitMixin):
+    def test_tl_call(self):
+        py.test.skip("virtualizables: in-progress with ootype")
+        
     def test_tl_call_full_of_residuals(self):
         py.test.skip("virtualizables: in-progress with ootype")
 

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py	Sun Aug 23 18:11:00 2009
@@ -73,6 +73,7 @@
                 x = xy.inst_x
                 xy.inst_x = x + 1
                 n -= 1
+            promote_virtualizable(xy, 'inst_x')                
             return xy.inst_x
         res = self.meta_interp(f, [20])
         assert res == 30
@@ -96,6 +97,7 @@
                     x = xy.inst_x
                     xy.inst_x = x + 10
                 n -= 1
+            promote_virtualizable(xy, 'inst_x')                
             return xy.inst_x
         assert f(5) == 185
         res = self.meta_interp(f, [5])
@@ -115,8 +117,10 @@
                 x = xy.inst_x
                 if n <= 10:
                     x += 1000
+                promote_virtualizable(xy, 'inst_x')                    
                 xy.inst_x = x + 1
                 n -= 1
+            promote_virtualizable(xy, 'inst_x')                
             return xy.inst_x
         res = self.meta_interp(f, [18])
         assert res == 10118
@@ -159,6 +163,7 @@
                 xy.inst_x = x + 1
                 m = (m+1) & 3     # the loop gets unrolled 4 times
                 n -= 1
+            promote_virtualizable(xy, 'inst_x')                
             return xy.inst_x
         def f(n):
             res = 0
@@ -188,6 +193,7 @@
                 promote_virtualizable(xy, 'inst_x')
                 xy.inst_x = value + 100      # virtualized away
                 n -= 1
+            promote_virtualizable(xy, 'inst_x')                
             return xy.inst_x
         res = self.meta_interp(f, [20])
         assert res == 134
@@ -296,8 +302,11 @@
             while n > 0:
                 myjitdriver.can_enter_jit(xy2=xy2, n=n)
                 myjitdriver.jit_merge_point(xy2=xy2, n=n)
+                promote_virtualizable(xy2, 'inst_l1')                
+                promote_virtualizable(xy2, 'inst_l2')
                 xy2.inst_l1[2] += xy2.inst_l2[0]
                 n -= 1
+            promote_virtualizable(xy2, 'inst_l1')                
             return xy2.inst_l1[2]
         res = self.meta_interp(f, [16])
         assert res == 3001 + 16 * 80
@@ -312,6 +321,8 @@
             while n > 0:
                 myjitdriver.can_enter_jit(xy2=xy2, n=n)
                 myjitdriver.jit_merge_point(xy2=xy2, n=n)
+                promote_virtualizable(xy2, 'inst_x')
+                promote_virtualizable(xy2, 'inst_l2')
                 xy2.inst_l2[0] += xy2.inst_x
                 n -= 1
         def f(n):
@@ -341,6 +352,8 @@
             while n > 0:
                 myjitdriver.can_enter_jit(xy2=xy2, n=n)
                 myjitdriver.jit_merge_point(xy2=xy2, n=n)
+                promote_virtualizable(xy2, 'inst_l1')
+                promote_virtualizable(xy2, 'inst_l2')                
                 xy2.inst_l1[1] += len(xy2.inst_l2)
                 n -= 1
         def f(n):
@@ -374,6 +387,7 @@
             while n > 0:
                 myjitdriver.can_enter_jit(xy2=xy2, n=n)
                 myjitdriver.jit_merge_point(xy2=xy2, n=n)
+                promote_virtualizable(xy2, 'inst_l1')
                 xy2.inst_l1[1] = xy2.inst_l1[1] + len(h(xy2))
                 n -= 1
         def f(n):
@@ -420,6 +434,7 @@
                 promote_virtualizable(xy2, 'inst_l2')
                 xy2.inst_l2[0] = value + 100      # virtualized away
                 n -= 1
+            promote_virtualizable(xy2, 'inst_l2')                
             return xy2.inst_l2[0]
         expected = f(20)
         res = self.meta_interp(f, [20], optimizer=simple_optimize)
@@ -451,7 +466,10 @@
             while n > 0:
                 myjitdriver.can_enter_jit(xy2=xy2, n=n)
                 myjitdriver.jit_merge_point(xy2=xy2, n=n)
-                xy2.parent.inst_l2[0] += xy2.parent.inst_x
+                parent = xy2.parent
+                promote_virtualizable(parent, 'inst_x')                
+                promote_virtualizable(parent, 'inst_l2')                
+                parent.inst_l2[0] += parent.inst_x
                 n -= 1
         def f(n):
             xy2 = self.setup2sub()
@@ -811,16 +829,15 @@
         self.check_loops(new_with_vtable=0)
 
     def test_virtual_child_frame_with_arrays(self):
-        py.test.skip("WIP")
         myjitdriver = JitDriver(greens = [], reds = ['frame'],
                                 virtualizables = ['frame'])
 
         class Frame(object):
             _virtualizable2_ = ['x[*]']
 
-            #@dont_look_inside
             def __init__(self, x, y):
-                self = hint(self, access_directly=True)
+                self = hint(self, access_directly=True,
+                                  fresh_virtualizable=True)
                 self.x = [x, y]
 
         class SomewhereElse:
@@ -846,7 +863,12 @@
 class TestOOtype(#ExplicitVirtualizableTests,
                  ImplicitVirtualizableTests,
                  OOJitMixin):
-    pass
+
+    def test_subclass_of_virtualizable(self):
+        py.test.skip("oo virtualizable support incomplete")
+        
+    def test_virtual_child_frame_with_arrays(self):
+        py.test.skip("oo virtualizable support incomplete")
 
 class TestLLtype(ExplicitVirtualizableTests,
                  ImplicitVirtualizableTests,

Modified: pypy/branch/pyjitpl5/pypy/jit/tl/tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/tl/tl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/tl/tl.py	Sun Aug 23 18:11:00 2009
@@ -13,9 +13,8 @@
 class Stack(object):
     _virtualizable2_ = ['stackpos', 'stack[*]']
 
-    @dont_look_inside
     def __init__(self, size):
-        self = hint(self, access_directly=True)
+        self = hint(self, access_directly=True, fresh_virtualizable=True)
         self.stack = [0] * size
         self.stackpos = 0
 

Modified: pypy/branch/pyjitpl5/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/rlib/jit.py	(original)
+++ pypy/branch/pyjitpl5/pypy/rlib/jit.py	Sun Aug 23 18:11:00 2009
@@ -19,7 +19,10 @@
     def compute_result_annotation(self, s_x, **kwds_s):
         from pypy.annotation import model as annmodel
         s_x = annmodel.not_const(s_x)
-        if 's_access_directly' in kwds_s:
+        access_directly = 's_access_directly' in kwds_s
+        fresh_virtualizable = 's_fresh_virtualizable' in kwds_s
+        if  access_directly or fresh_virtualizable:
+            assert access_directly, "lone fresh_virtualizable hint"
             if isinstance(s_x, annmodel.SomeInstance):
                 from pypy.objspace.flow.model import Constant
                 classdesc = s_x.classdef.classdesc
@@ -28,6 +31,8 @@
                 if virtualizable is not None:
                     flags = s_x.flags.copy()
                     flags['access_directly'] = True
+                    if fresh_virtualizable:
+                        flags['fresh_virtualizable'] = True
                     s_x = annmodel.SomeInstance(s_x.classdef,
                                                 s_x.can_be_None,
                                                 flags)        



More information about the Pypy-commit mailing list