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

arigo at codespeak.net arigo at codespeak.net
Fri Dec 4 22:57:07 CET 2009


Author: arigo
Date: Fri Dec  4 22:57:05 2009
New Revision: 69909

Added:
   pypy/branch/virtual-forcing/pypy/jit/metainterp/virtualref.py
      - copied unchanged from r69908, pypy/branch/virtual-forcing/pypy/jit/metainterp/vref.py
Removed:
   pypy/branch/virtual-forcing/pypy/jit/metainterp/vref.py
Modified:
   pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py
   pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py
Log:
* rename vref.py to virtualref.py, to avoid confusion with local
  variables that are also called vref.

* support virtual_ref_finish in the jit; its exact use is kept
  purposefully obscure to confuse readers, but see next checkin.


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 Dec  4 22:57:05 2009
@@ -1279,8 +1279,8 @@
         return self._do_builtin_call(op, oopspec_name, args)
 
     def _do_builtin_call(self, op, oopspec_name, args):
-        if oopspec_name == 'virtual_ref':
-            self.handle_virtual_ref_call(op, args)
+        if oopspec_name.startswith('virtual_ref'):
+            self.handle_virtual_ref_call(op, oopspec_name, args)
             return
         argtypes = [v.concretetype for v in args]
         resulttype = op.result.concretetype
@@ -1302,8 +1302,8 @@
         self.emit_varargs([c_func] + non_void_args)
         self.register_var(op.result)
 
-    def handle_virtual_ref_call(self, op, args):
-        self.emit('virtual_ref')
+    def handle_virtual_ref_call(self, op, oopspec_name, args):
+        self.emit(oopspec_name)     # 'virtual_ref' or 'virtual_ref_finish'
         self.emit(self.var_position(args[0]))
         self.register_var(op.result)
 

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/optimizeopt.py	Fri Dec  4 22:57:05 2009
@@ -742,10 +742,10 @@
             raise compile.GiveUp     # results, so don't bother compiling it
         #
         # get some constants (these calls are all 'memo')
-        from pypy.jit.metainterp import vref
-        c_cls = vref.get_jit_virtual_ref_const_class(self.cpu)
-        descr_virtual_token = vref.get_descr_virtual_token(self.cpu)
-        descr_forced = vref.get_descr_forced(self.cpu)
+        from pypy.jit.metainterp import virtualref
+        c_cls = virtualref.get_jit_virtual_ref_const_class(self.cpu)
+        descr_virtual_token = virtualref.get_descr_virtual_token(self.cpu)
+        descr_forced = virtualref.get_descr_forced(self.cpu)
         #
         # Replace the VIRTUAL_REF operation with a virtual structure of type
         # 'vref.JIT_VIRTUAL_REF'.  The virtual structure may be forced soon,

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/pyjitpl.py	Fri Dec  4 22:57:05 2009
@@ -5,7 +5,7 @@
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
 
-from pypy.jit.metainterp import history, compile, resume, vref
+from pypy.jit.metainterp import history, compile, resume, virtualref
 from pypy.jit.metainterp.history import Const, ConstInt, Box
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp import codewriter, executor
@@ -889,11 +889,16 @@
     @arguments("box")
     def opimpl_virtual_ref(self, box):
         obj = box.getref_base()
-        res = vref.virtual_ref_during_tracing(obj)
-        self.metainterp.all_virtual_refs.append(res)
-        resbox = history.BoxPtr(res)
+        vref = virtualref.virtual_ref_during_tracing(obj)
+        #
+        if self.metainterp.all_virtual_refs is None:
+            self.metainterp.all_virtual_refs = []
+        self.metainterp.all_virtual_refs.append(vref)
+        #
+        resbox = history.BoxPtr(vref)
         self.metainterp.history.record(rop.VIRTUAL_REF, [box], resbox)
-        # Note: we create a JIT_VIRTUAL_REF here, in order to detect when
+        # Note: we allocate a JIT_VIRTUAL_REF here
+        # (in virtual_ref_during_tracing()), in order to detect when
         # the virtual escapes during tracing already.  We record it as a
         # VIRTUAL_REF operation, although the backend sees this operation
         # as a no-op.  The point is that the backend should not really see
@@ -901,6 +906,14 @@
         # replace it with a NEW_WITH_VTABLE followed by SETFIELD_GCs.
         self.make_result_box(resbox)
 
+    @arguments("box")
+    def opimpl_virtual_ref_finish(self, box):
+        # virtual_ref_finish() assumes that we have a stack-like, last-in
+        # first-out order.
+        if not self.metainterp.is_blackholing():
+            lastitem = self.metainterp.all_virtual_refs.pop()
+            assert box.getref_base() == lastitem
+
     # ------------------------------
 
     def setup_call(self, argboxes):
@@ -1209,6 +1222,7 @@
 
 class MetaInterp(object):
     in_recursion = 0
+    all_virtual_refs = None
     _already_allocated_resume_virtuals = None
 
     def __init__(self, staticdata):
@@ -1216,7 +1230,6 @@
         self.cpu = staticdata.cpu
         self.portal_trace_positions = []
         self.greenkey_of_huge_function = None
-        self.all_virtual_refs = []
 
     def is_blackholing(self):
         return self.history is None
@@ -1773,10 +1786,10 @@
             self.load_fields_from_virtualizable()
 
     def virtual_after_residual_call(self):
-        if self.is_blackholing():
+        if self.is_blackholing() or self.all_virtual_refs is None:
             return
         for vr in self.all_virtual_refs:
-            if vref.was_forced(vr):
+            if virtualref.was_forced(vr):
                 break
         else:
             return

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizefindnode.py	Fri Dec  4 22:57:05 2009
@@ -102,8 +102,8 @@
     mayforcevirtdescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                  EffectInfo([], [], forces_virtual_or_virtualizable=True))
 
-    from pypy.jit.metainterp.vref import jit_virtual_ref_vtable
-    from pypy.jit.metainterp.vref import JIT_VIRTUAL_REF
+    from pypy.jit.metainterp.virtualref import jit_virtual_ref_vtable
+    from pypy.jit.metainterp.virtualref import JIT_VIRTUAL_REF
     virtualtokendescr = cpu.fielddescrof(JIT_VIRTUAL_REF, 'virtual_token')
 
     cpu.class_sizes = {cpu.cast_adr_to_int(node_vtable_adr): cpu.sizeof(NODE),

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_optimizeopt.py	Fri Dec  4 22:57:05 2009
@@ -2068,6 +2068,42 @@
         """
         self.optimize_loop(ops, 'Not, Not', expected)
 
+    def test_vref_virtual_2(self):
+        self.make_fail_descr()
+        ops = """
+        [p0, i1]
+        #
+        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1b = new_with_vtable(ConstClass(node_vtable))
+        setfield_gc(p1b, i1, descr=valuedescr)
+        setfield_gc(p1, p1b, descr=nextdescr)
+        #
+        p2 = virtual_ref(p1)
+        setfield_gc(p0, p2, descr=nextdescr)
+        call_may_force(i1, descr=mayforcevirtdescr)
+        guard_not_forced(descr=fdescr) [p1]
+        setfield_gc(p0, NULL, descr=nextdescr)
+        jump(p0, i1)
+        """
+        expected = """
+        [p0, i1]
+        i3 = force_token()
+        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        setfield_gc(p2, i3, descr=virtualtokendescr)
+        setfield_gc(p0, p2, descr=nextdescr)
+        call_may_force(i1, descr=mayforcevirtdescr)
+        guard_not_forced(descr=fdescr) [i1]
+        setfield_gc(p0, NULL, descr=nextdescr)
+        jump(p0, i1)
+        """
+        # the point of this test is that 'i1' should show up in the fail_args
+        # of 'guard_not_forced', because it was stored in the virtual 'p1b'.
+        self.optimize_loop(ops, 'Not, Not', expected)
+        self.check_expanded_fail_descr('''p1
+            where p1 is a node_vtable, nextdescr=p1b
+            where p1b is a node_vtable, valuedescr=i1
+            ''')
+
 
 class TestOOtype(BaseTestOptimizeOpt, OOtypeMixin):
 

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_vref.py	Fri Dec  4 22:57:05 2009
@@ -1,5 +1,6 @@
 import py
-from pypy.rlib.jit import JitDriver, dont_look_inside, virtual_ref
+from pypy.rlib.jit import JitDriver, dont_look_inside
+from pypy.rlib.jit import virtual_ref, virtual_ref_finish
 from pypy.rlib.objectmodel import compute_unique_id
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
 
@@ -14,8 +15,9 @@
         exctx = ExCtx()
         #
         def f():
-            exctx.topframeref = virtual_ref(X())
+            exctx.topframeref = vref = virtual_ref(X())
             exctx.topframeref = None
+            virtual_ref_finish(vref)
             return 1
         #
         self.interp_operations(f, [])
@@ -43,6 +45,8 @@
                 x.n = n + 123
                 exctx.topframeref = virtual_ref(x)
                 total += force_me() - 100
+                exctx.topframeref = None
+                virtual_ref_finish(x)
             return total
         #
         res = self.meta_interp(f, [-4])

Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/warmspot.py	Fri Dec  4 22:57:05 2009
@@ -17,7 +17,7 @@
 from pypy.translator.unsimplify import call_final_function
 
 from pypy.jit.metainterp import codewriter
-from pypy.jit.metainterp import support, history, pyjitpl, gc, vref
+from pypy.jit.metainterp import support, history, pyjitpl, gc, virtualref
 from pypy.jit.metainterp.pyjitpl import MetaInterpStaticData, MetaInterp
 from pypy.jit.metainterp.policy import JitPolicy
 from pypy.jit.metainterp.typesystem import LLTypeHelper, OOTypeHelper
@@ -604,7 +604,8 @@
         if self.cpu.ts.name != 'lltype':
             py.test.skip("rewrite_force_virtual: port it to ootype")
         all_graphs = self.translator.graphs
-        vref.replace_force_virtual_with_call(self.helper_func, all_graphs)
+        virtualref.replace_force_virtual_with_call(self.helper_func,
+                                                   all_graphs)
 
 
 def decode_hp_hint_args(op):



More information about the Pypy-commit mailing list