Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: remember-tracing-counts
Changeset: r79611:60a87ed91e06
Date: 2015-09-14 10:26 +0200
http://bitbucket.org/pypy/pypy/changeset/60a87ed91e06/

Log:    access JitCell from the interpreter

diff --git a/rpython/jit/metainterp/test/test_jitiface.py 
b/rpython/jit/metainterp/test/test_jitiface.py
--- a/rpython/jit/metainterp/test/test_jitiface.py
+++ b/rpython/jit/metainterp/test/test_jitiface.py
@@ -156,6 +156,20 @@
             assert jit_hooks.stats_get_times_value(None, Counters.TRACING) == 0
         self.meta_interp(main, [], ProfilerClass=EmptyProfiler)
 
+    def test_get_jitcell_at_key(self):
+        driver = JitDriver(greens = ['s'], reds = ['i'], name='jit')
+
+        def loop(i, s):
+            while i > s:
+                driver.jit_merge_point(i=i, s=s)
+                i -= 1
+
+        def main(s):
+            loop(30, s)
+            assert jit_hooks.get_jitcell_at_key("jit", s)
+            assert not jit_hooks.get_jitcell_at_key("jit", s + 1)
+
+        self.meta_interp(main, [5])
 
 class LLJitHookInterfaceTests(JitHookInterfaceTests):
     # use this for any backend, instead of the super class
diff --git a/rpython/jit/metainterp/warmspot.py 
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -1,9 +1,9 @@
-import sys
+import sys, py
 
 from rpython.tool.sourcetools import func_with_new_name
 from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rtyper.annlowlevel import (llhelper, MixLevelHelperAnnotator,
-    cast_base_ptr_to_instance, hlstr)
+    cast_base_ptr_to_instance, hlstr, cast_instance_to_gcref)
 from rpython.rtyper.llannotation import lltype_to_annotation
 from rpython.annotator import model as annmodel
 from rpython.rtyper.llinterp import LLException
@@ -236,6 +236,7 @@
         self.rewrite_can_enter_jits()
         self.rewrite_set_param_and_get_stats()
         self.rewrite_force_virtual(vrefinfo)
+        self.rewrite_jitcell_accesses()
         self.rewrite_force_quasi_immutable()
         self.add_finish()
         self.metainterp_sd.finish_setup(self.codewriter)
@@ -598,6 +599,45 @@
         (_, jd._PTR_ASSEMBLER_HELPER_FUNCTYPE) = self.cpu.ts.get_FuncType(
             [llmemory.GCREF, llmemory.GCREF], ASMRESTYPE)
 
+    def rewrite_jitcell_accesses(self):
+        jitdrivers_by_name = {}
+        for jd in self.jitdrivers_sd:
+            name = jd.jitdriver.name
+            if name != 'jitdriver':
+                jitdrivers_by_name[name] = jd
+        m = _find_jit_marker(self.translator.graphs, 'get_jitcell_at_key',
+                             False)
+        accessors = {}
+
+        def get_accessor(jitdriver_name, function, ARGS):
+            a = accessors.get(jitdriver_name)
+            if a:
+                return a
+            d = {'function': function,
+                 'cast_instance_to_gcref': cast_instance_to_gcref}
+            arg_spec = ", ".join([("arg%d" % i) for i in range(len(ARGS))])
+            exec py.code.Source("""
+            def accessor(%s):
+                return cast_instance_to_gcref(function(%s))
+            """ % (arg_spec, arg_spec)).compile() in d
+            FUNC = lltype.Ptr(lltype.FuncType(ARGS, llmemory.GCREF))
+            ll_ptr = self.helper_func(FUNC, d['accessor'])
+            accessors[jitdriver_name] = ll_ptr
+            return ll_ptr
+
+        for graph, block, index in m:
+            op = block.operations[index]
+            jitdriver_name = op.args[1].value
+            JitCell = jitdrivers_by_name[jitdriver_name].warmstate.JitCell
+            ARGS = [x.concretetype for x in op.args[2:]]
+            accessor = get_accessor(jitdriver_name, JitCell.get_jitcell,
+                                    ARGS)
+            v_result = op.result
+            c_accessor = Constant(accessor, concretetype=lltype.Void)
+            newop = SpaceOperation('direct_call', [c_accessor] + op.args[2:],
+                                   v_result)
+            block.operations[index] = newop
+
     def rewrite_can_enter_jits(self):
         sublists = {}
         for jd in self.jitdrivers_sd:
diff --git a/rpython/rlib/jit_hooks.py b/rpython/rlib/jit_hooks.py
--- a/rpython/rlib/jit_hooks.py
+++ b/rpython/rlib/jit_hooks.py
@@ -5,6 +5,7 @@
     cast_base_ptr_to_instance, llstr)
 from rpython.rtyper.extregistry import ExtRegistryEntry
 from rpython.rtyper.lltypesystem import llmemory, lltype
+from rpython.flowspace.model import Constant
 from rpython.rtyper import rclass
 
 
@@ -127,3 +128,24 @@
 @register_helper(lltype.Ptr(LOOP_RUN_CONTAINER))
 def stats_get_loop_run_times(warmrunnerdesc):
     return warmrunnerdesc.metainterp_sd.cpu.get_all_loop_runs()
+
+# ---------------------- jitcell interface ----------------------
+
+def get_jitcell_at_key(name, *greenkey):
+    raise Exception("need to run translated")
+
+class GetJitCellEntry(ExtRegistryEntry):
+    _about_ = get_jitcell_at_key
+
+    def compute_result_annotation(self, s_name, *args_s):
+        assert s_name.is_constant()
+        return SomePtr(llmemory.GCREF)
+
+    def specialize_call(self, hop):
+        c_jitdriver = Constant(hop.args_s[0].const, concretetype=lltype.Void)
+        c_name = Constant("get_jitcell_at_key", concretetype=lltype.Void)
+        hop.exception_cannot_occur()
+        args_v = [hop.inputarg(arg, arg=i + 1)
+                  for i, arg in enumerate(hop.args_r[1:])]
+        return hop.genop('jit_marker', [c_name, c_jitdriver] + args_v,
+                         resulttype=hop.r_result)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to