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