Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: remember-tracing-counts
Changeset: r79613:6e6ac7561485
Date: 2015-09-14 10:50 +0200
http://bitbucket.org/pypy/pypy/changeset/6e6ac7561485/

Log:    implement trace at next iteration

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
@@ -168,8 +168,12 @@
             loop(30, s)
             assert jit_hooks.get_jitcell_at_key("jit", s)
             assert not jit_hooks.get_jitcell_at_key("jit", s + 1)
+            jit_hooks.trace_next_iteration("jit", s + 1)
+            loop(s + 3, s + 1)
+            assert jit_hooks.get_jitcell_at_key("jit", s + 1)
 
         self.meta_interp(main, [5])
+        self.check_jitcell_token_count(2)
 
 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
@@ -129,6 +129,17 @@
                     results.append((graph, block, i))
     return results
 
+def _find_jit_markers(graphs, marker_names):
+    results = []
+    for graph in graphs:
+        for block in graph.iterblocks():
+            for i in range(len(block.operations)):
+                op = block.operations[i]
+                if (op.opname == 'jit_marker' and
+                    op.args[0].value in marker_names):
+                    results.append((graph, block, i))
+    return results
+
 def find_can_enter_jit(graphs):
     return _find_jit_marker(graphs, 'can_enter_jit')
 
@@ -605,12 +616,12 @@
             name = jd.jitdriver.name
             if name != 'jitdriver':
                 jitdrivers_by_name[name] = jd
-        m = _find_jit_marker(self.translator.graphs, 'get_jitcell_at_key',
-                             False)
+        m = _find_jit_markers(self.translator.graphs,
+                              ('get_jitcell_at_key', 'trace_next_iteration'))
         accessors = {}
 
-        def get_accessor(jitdriver_name, function, ARGS):
-            a = accessors.get(jitdriver_name)
+        def get_accessor(name, jitdriver_name, function, ARGS):
+            a = accessors.get((name, jitdriver_name))
             if a:
                 return a
             d = {'function': function,
@@ -622,7 +633,7 @@
             """ % (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
+            accessors[(name, jitdriver_name)] = ll_ptr
             return ll_ptr
 
         for graph, block, index in m:
@@ -630,7 +641,12 @@
             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,
+            if op.args[0].value == 'get_jitcell_at_key':
+                func = JitCell.get_jitcell
+            else:
+                func = JitCell._trace_next_iteration
+            accessor = get_accessor(op.args[0].value,
+                                    jitdriver_name, func,
                                     ARGS)
             v_result = op.result
             c_accessor = Constant(accessor, concretetype=lltype.Void)
diff --git a/rpython/jit/metainterp/warmstate.py 
b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -545,6 +545,10 @@
             @staticmethod
             def trace_next_iteration(greenkey):
                 greenargs = unwrap_greenkey(greenkey)
+                JitCell._trace_next_iteration(*greenargs)
+
+            @staticmethod
+            def _trace_next_iteration(*greenargs):
                 hash = JitCell.get_uhash(*greenargs)
                 jitcounter.change_current_fraction(hash, 0.98)
 
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
@@ -149,3 +149,21 @@
                   for i, arg in enumerate(hop.args_r[1:])]
         return hop.genop('jit_marker', [c_name, c_jitdriver] + args_v,
                          resulttype=hop.r_result)
+
+def trace_next_iteration(name, *greenkey):
+    raise Exception("need to run translated")
+
+class TraceNextIterationEntry(ExtRegistryEntry):
+    _about_ = trace_next_iteration
+
+    def compute_result_annotation(self, s_name, *args_s):
+        assert s_name.is_constant()
+
+    def specialize_call(self, hop):
+        c_jitdriver = Constant(hop.args_s[0].const, concretetype=lltype.Void)
+        c_name = Constant("trace_next_iteration", 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