[pypy-svn] r78208 - in pypy/trunk/pypy: jit/codewriter jit/metainterp jit/metainterp/test rlib
arigo at codespeak.net
arigo at codespeak.net
Fri Oct 22 14:55:00 CEST 2010
Author: arigo
Date: Fri Oct 22 14:54:58 2010
New Revision: 78208
Modified:
pypy/trunk/pypy/jit/codewriter/jtransform.py
pypy/trunk/pypy/jit/metainterp/test/test_jitdriver.py
pypy/trunk/pypy/jit/metainterp/warmspot.py
pypy/trunk/pypy/rlib/jit.py
Log:
Add the ability to deactivate some jitdrivers.
Far better solution than somehow hacking in the source to
remove the calls to jitdriver.jit_merge_point().
Modified: pypy/trunk/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/trunk/pypy/jit/codewriter/jtransform.py (original)
+++ pypy/trunk/pypy/jit/codewriter/jtransform.py Fri Oct 22 14:54:58 2010
@@ -831,6 +831,8 @@
def rewrite_op_jit_marker(self, op):
key = op.args[0].value
jitdriver = op.args[1].value
+ if not jitdriver.active:
+ return []
return getattr(self, 'handle_jit_marker__%s' % key)(op, jitdriver)
def handle_jit_marker__jit_merge_point(self, op, jitdriver):
Modified: pypy/trunk/pypy/jit/metainterp/test/test_jitdriver.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_jitdriver.py (original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_jitdriver.py Fri Oct 22 14:54:58 2010
@@ -72,6 +72,33 @@
# we expect no loop at all for 'loop1': it should always be inlined
self.check_tree_loop_count(2) # 1 x loop, 1 x enter bridge
+ def test_inactive_jitdriver(self):
+ myjitdriver1 = JitDriver(greens=[], reds=['n', 'm'],
+ get_printable_location = getloc1)
+ myjitdriver2 = JitDriver(greens=['g'], reds=['r'],
+ get_printable_location = getloc2)
+ #
+ myjitdriver1.active = False # <===
+ #
+ def loop1(n, m):
+ while n > 0:
+ myjitdriver1.can_enter_jit(n=n, m=m)
+ myjitdriver1.jit_merge_point(n=n, m=m)
+ n -= m
+ return n
+ #
+ def loop2(g, r):
+ while r > 0:
+ myjitdriver2.can_enter_jit(g=g, r=r)
+ myjitdriver2.jit_merge_point(g=g, r=r)
+ r += loop1(r, g) + (-1)
+ return r
+ #
+ res = self.meta_interp(loop2, [4, 40], repeat=7, inline=True)
+ assert res == loop2(4, 40)
+ # we expect no int_sub, but a residual call
+ self.check_loops(int_sub=0, call=1)
+
class TestLLtype(MultipleJitDriversTests, LLJitMixin):
pass
Modified: pypy/trunk/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/trunk/pypy/jit/metainterp/warmspot.py Fri Oct 22 14:54:58 2010
@@ -110,7 +110,8 @@
for i in range(len(block.operations)):
op = block.operations[i]
if (op.opname == 'jit_marker' and
- op.args[0].value == marker_name):
+ op.args[0].value == marker_name and
+ op.args[1].value.active): # the jitdriver
results.append((graph, block, i))
return results
Modified: pypy/trunk/pypy/rlib/jit.py
==============================================================================
--- pypy/trunk/pypy/rlib/jit.py (original)
+++ pypy/trunk/pypy/rlib/jit.py Fri Oct 22 14:54:58 2010
@@ -274,8 +274,9 @@
several independent JITting interpreters in it.
"""
+ active = True # if set to False, this JitDriver is ignored
virtualizables = []
-
+
def __init__(self, greens=None, reds=None, virtualizables=None,
get_jitcell_at=None, set_jitcell_at=None,
get_printable_location=None, confirm_enter_jit=None,
More information about the Pypy-commit
mailing list