Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit