Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r68677:7a522e1c61ab
Date: 2014-01-15 13:45 +0100
http://bitbucket.org/pypy/pypy/changeset/7a522e1c61ab/
Log: remove the forcing of virtualizables when we remove the
stm_transaction_break
diff --git a/rpython/jit/metainterp/optimizeopt/stm.py
b/rpython/jit/metainterp/optimizeopt/stm.py
--- a/rpython/jit/metainterp/optimizeopt/stm.py
+++ b/rpython/jit/metainterp/optimizeopt/stm.py
@@ -1,10 +1,5 @@
-from rpython.jit.metainterp.history import (Const, ConstInt, BoxInt, BoxFloat,
- BoxPtr, make_hashable_int)
-from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization,
REMOVED,
- CONST_0, CONST_1)
+from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, )
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import (opboolinvers, opboolreflex,
rop,
- ResOperation)
from rpython.jit.codewriter.effectinfo import EffectInfo
class OptSTM(Optimization):
@@ -15,36 +10,54 @@
def __init__(self):
self.remove_next_gnf = False # guard_not_forced
self.keep_but_ignore_gnf = False
+ self.cached_ops = []
def propagate_forward(self, op):
dispatch_opt(self, op)
+ def flush_cached(self):
+ while self.cached_ops:
+ self.emit_operation(self.cached_ops.pop(0))
+
+ def default_emit(self, op):
+ self.flush_cached()
+ self.emit_operation(op)
+
def _break_wanted(self):
is_loop = self.optimizer.loop.is_really_loop
return self.optimizer.stm_info.get('break_wanted', is_loop)
def _set_break_wanted(self, val):
self.optimizer.stm_info['break_wanted'] = val
+
+ def optimize_FORCE_TOKEN(self, op):
+ self.cached_ops.append(op)
+
+ def optimize_SETFIELD_GC(self, op):
+ self.cached_ops.append(op)
def optimize_CALL(self, op):
+ self.flush_cached()
effectinfo = op.getdescr().get_extra_info()
oopspecindex = effectinfo.oopspecindex
if oopspecindex == EffectInfo.OS_JIT_STM_SHOULD_BREAK_TRANSACTION:
self._set_break_wanted(False)
self.emit_operation(op)
-
def optimize_STM_TRANSACTION_BREAK(self, op):
assert not self.remove_next_gnf
really_wanted = op.getarg(0).getint()
if really_wanted or self._break_wanted():
+ self.flush_cached()
self._set_break_wanted(False)
self.emit_operation(op)
self.keep_but_ignore_gnf = True
else:
+ self.cached_ops = []
self.remove_next_gnf = True
def optimize_GUARD_NOT_FORCED(self, op):
+ self.flush_cached()
if self.remove_next_gnf:
self.remove_next_gnf = False
else:
@@ -56,7 +69,7 @@
dispatch_opt = make_dispatcher_method(OptSTM, 'optimize_',
- default=OptSTM.emit_operation)
+ default=OptSTM.default_emit)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_stm.py
b/rpython/jit/metainterp/optimizeopt/test/test_stm.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_stm.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_stm.py
@@ -191,6 +191,63 @@
"""
self.optimize_loop(ops, expected, expected_preamble=preamble)
+ def test_remove_force_token(self):
+ ops = """
+ [p0]
+ p1 = force_token()
+ setfield_gc(p0, p1, descr=adescr)
+ stm_transaction_break(0)
+ guard_not_forced() []
+
+ p2 = force_token()
+ setfield_gc(p0, p2, descr=adescr)
+ stm_transaction_break(0)
+ guard_not_forced() []
+
+ p3 = force_token()
+ setfield_gc(p0, p3, descr=adescr)
+ stm_transaction_break(0)
+ guard_not_forced() []
+
+ escape()
+
+ p4 = force_token()
+ setfield_gc(p0, p4, descr=adescr)
+ stm_transaction_break(0)
+ guard_not_forced() []
+
+ p6 = force_token() # not removed!
+
+ i0 = call(123, descr=sbtdescr)
+ guard_false(i0) []
+ jump(p0)
+ """
+ preamble = """
+ [p0]
+ p1 = force_token()
+ setfield_gc(p0, p1, descr=adescr)
+ stm_transaction_break(0)
+ guard_not_forced() []
+
+ escape()
+
+ p6 = force_token() # not removed!
+
+ i0 = call(123, descr=sbtdescr)
+ guard_false(i0) []
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ escape()
+
+ p6 = force_token() # not removed!
+
+ i0 = call(123, descr=sbtdescr)
+ guard_false(i0) []
+ jump(p0)
+ """
+ self.optimize_loop(ops, expected, expected_preamble=preamble)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit