[pypy-commit] pypy stmgc-c4: add a flag to jitdriver to mark it as transaction-break friendly -> reintroduces atomicity of bytecode instructions
Raemi
noreply at buildbot.pypy.org
Tue Jan 14 10:44:17 CET 2014
Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r68659:e21f53a50e0d
Date: 2014-01-14 10:17 +0100
http://bitbucket.org/pypy/pypy/changeset/e21f53a50e0d/
Log: add a flag to jitdriver to mark it as transaction-break friendly ->
reintroduces atomicity of bytecode instructions
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -42,7 +42,8 @@
stmonly_jitdriver = jit.JitDriver(greens=[], reds=['next_instr', 'ec',
- 'self', 'co_code'])
+ 'self', 'co_code'],
+ stm_do_transaction_breaks=True)
opcodedesc = bytecode_spec.opcodedesc
HAVE_ARGUMENT = bytecode_spec.HAVE_ARGUMENT
diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -56,7 +56,8 @@
set_jitcell_at = set_jitcell_at,
should_unroll_one_iteration =
should_unroll_one_iteration,
- name='pypyjit')
+ name='pypyjit',
+ stm_do_transaction_breaks=True)
class __extend__(PyFrame):
diff --git a/rpython/jit/tl/tlc.py b/rpython/jit/tl/tlc.py
--- a/rpython/jit/tl/tlc.py
+++ b/rpython/jit/tl/tlc.py
@@ -229,7 +229,8 @@
def make_interp(supports_call, jitted=True):
myjitdriver = JitDriver(greens = ['pc', 'code'],
- reds = ['frame', 'pool'])
+ reds = ['frame', 'pool'],
+ stm_do_transaction_breaks=True)
def interp(code='', pc=0, inputarg=0, pool=None):
if not isinstance(code,str):
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -479,12 +479,14 @@
name = 'jitdriver'
inline_jit_merge_point = False
_store_last_enter_jit = None
+ stm_do_transaction_breaks = False
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,
can_never_inline=None, should_unroll_one_iteration=None,
- name='jitdriver', check_untranslated=True):
+ name='jitdriver', check_untranslated=True,
+ stm_do_transaction_breaks=False):
if greens is not None:
self.greens = greens
self.name = name
@@ -520,6 +522,7 @@
self.can_never_inline = can_never_inline
self.should_unroll_one_iteration = should_unroll_one_iteration
self.check_untranslated = check_untranslated
+ self.stm_do_transaction_breaks = stm_do_transaction_breaks
def _freeze_(self):
return True
diff --git a/rpython/translator/stm/jitdriver.py b/rpython/translator/stm/jitdriver.py
--- a/rpython/translator/stm/jitdriver.py
+++ b/rpython/translator/stm/jitdriver.py
@@ -18,13 +18,11 @@
and op.args[0].value == 'jit_merge_point'):
jitdriver = op.args[1].value
if not jitdriver.autoreds:
- # XXX: BUG, redo the below code in order to ensure atomicity of bytecode instrs
- # if (relaxed
- # or (i + 1 < len(block.operations)
- # and block.operations[i+1].opname == 'jit_stm_transaction_break_point')):
- found.append((block, i))
- # else:
- # log.WARNING("ignoring jitdriver without a transaction break point in %r" % (graph,))
+ if jitdriver.stm_do_transaction_breaks:
+ found.append((block, i))
+ else:
+ log.WARNING("ignoring non-stm jitdriver in %r" % (
+ graph,))
else:
log.WARNING("ignoring jitdriver with autoreds in %r" % (
graph,)) # XXX XXX!
diff --git a/rpython/translator/stm/test/test_jitdriver.py b/rpython/translator/stm/test/test_jitdriver.py
--- a/rpython/translator/stm/test/test_jitdriver.py
+++ b/rpython/translator/stm/test/test_jitdriver.py
@@ -1,6 +1,7 @@
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.translator.stm.test.transform_support import BaseTestTransform
from rpython.rlib.jit import JitDriver
+from rpython.rlib import rstm
class TestJitDriver(BaseTestTransform):
@@ -10,11 +11,14 @@
class X:
counter = 10
x = X()
- myjitdriver = JitDriver(greens=[], reds=[])
+ myjitdriver = JitDriver(greens=[], reds=[],
+ stm_do_transaction_breaks=True)
def f1():
while x.counter > 0:
myjitdriver.jit_merge_point()
+ if rstm.jit_stm_should_break_transaction(False):
+ rstm.jit_stm_transaction_break_point()
x.counter -= 1
return 'X'
More information about the pypy-commit
mailing list