[pypy-svn] r66843 - in pypy/branch/pyjitpl5/pypy: jit/metainterp jit/metainterp/test rlib
arigo at codespeak.net
arigo at codespeak.net
Sat Aug 15 17:05:13 CEST 2009
Author: arigo
Date: Sat Aug 15 17:05:12 2009
New Revision: 66843
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
pypy/branch/pyjitpl5/pypy/rlib/jit.py
Log:
Support jitdriver.set_param(), encoded as jit_markers by pypy/rlib/jit.py.
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_basic.py Sat Aug 15 17:05:12 2009
@@ -747,6 +747,28 @@
optimizer=simple_optimize)
assert res == 42
+ def test_set_param(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'x'])
+ def g(n):
+ x = 0
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n, x=x)
+ myjitdriver.jit_merge_point(n=n, x=x)
+ n -= 1
+ x += n
+ return x
+ def f(n, threshold):
+ myjitdriver.set_param('threshold', threshold)
+ return g(n)
+
+ res = self.meta_interp(f, [10, 3])
+ assert res == 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
+ self.check_tree_loop_count(1)
+
+ res = self.meta_interp(f, [10, 13])
+ assert res == 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
+ self.check_tree_loop_count(0)
+
class TestOOtype(BasicTests, OOJitMixin):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py Sat Aug 15 17:05:12 2009
@@ -79,33 +79,33 @@
return ll_meta_interp(function, args, backendopt=backendopt,
translate_support_code=True, **kwds)
-def find_can_enter_jit(graphs):
+def _find_jit_marker(graphs, marker_name):
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 == 'can_enter_jit'):
+ op.args[0].value == marker_name):
results.append((graph, block, i))
+ return results
+
+def find_can_enter_jit(graphs):
+ results = _find_jit_marker(graphs, 'can_enter_jit')
if not results:
raise Exception("no can_enter_jit found!")
return results
def find_jit_merge_point(graphs):
- 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 == 'jit_merge_point'):
- results.append((graph, block, i))
+ results = _find_jit_marker(graphs, 'jit_merge_point')
if len(results) != 1:
raise Exception("found %d jit_merge_points, need exactly one!" %
(len(results),))
return results[0]
+def find_set_param(graphs):
+ return _find_jit_marker(graphs, 'set_param')
+
def get_stats():
return pyjitpl._warmrunnerdesc.stats
@@ -138,11 +138,10 @@
self.metainterp_sd.generate_bytecode(policy, self.ts)
self.make_enter_function()
self.rewrite_can_enter_jit()
+ self.rewrite_set_param()
self.add_profiler_finish()
self.metainterp_sd.finish_setup()
- # hook back for set_param
self.make_can_inline_graph()
- self.jitdriver.state = self.state
def finish(self):
vinfo = self.metainterp_sd.virtualizable_info
@@ -496,6 +495,27 @@
call_final_function(self.translator, finish_profiler,
annhelper = self.annhelper)
+ def rewrite_set_param(self):
+ closures = {}
+ graphs = self.translator.graphs
+ _, PTR_SET_PARAM_FUNCTYPE = self.ts.get_FuncType([lltype.Signed],
+ lltype.Void)
+ def make_closure(fullfuncname):
+ state = self.state
+ def closure(i):
+ getattr(state, fullfuncname)(i)
+ funcptr = self.helper_func(PTR_SET_PARAM_FUNCTYPE, closure)
+ return Constant(funcptr, PTR_SET_PARAM_FUNCTYPE)
+ #
+ for graph, block, i in find_set_param(graphs):
+ op = block.operations[i]
+ assert op.args[1].value == self.jitdriver
+ funcname = op.args[2].value
+ if funcname not in closures:
+ closures[funcname] = make_closure('set_param_' + funcname)
+ op.opname = 'direct_call'
+ op.args[:3] = [closures[funcname]]
+
def decode_hp_hint_args(op):
# Returns (list-of-green-vars, list-of-red-vars) without Voids.
Modified: pypy/branch/pyjitpl5/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/rlib/jit.py (original)
+++ pypy/branch/pyjitpl5/pypy/rlib/jit.py Sat Aug 15 17:05:12 2009
@@ -124,7 +124,6 @@
# special-cased by ExtRegistryEntry
# (internal, must receive a constant 'name')
assert name in PARAMETERS
- #getattr(self.state, 'set_param_' + name)(value) -- ignored
def set_param(self, name, value):
"""Set one of the tunable JIT parameter."""
More information about the Pypy-commit
mailing list