[pypy-commit] pypy stm-thread-2: Collapse obvious duplicate barriers
arigo
noreply at buildbot.pypy.org
Sun Sep 2 13:24:18 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: stm-thread-2
Changeset: r57079:8a6cd3913dfe
Date: 2012-09-02 13:24 +0200
http://bitbucket.org/pypy/pypy/changeset/8a6cd3913dfe/
Log: Collapse obvious duplicate barriers
diff --git a/pypy/translator/stm/test/test_transform2.py b/pypy/translator/stm/test/test_transform2.py
--- a/pypy/translator/stm/test/test_transform2.py
+++ b/pypy/translator/stm/test/test_transform2.py
@@ -3,6 +3,7 @@
from pypy.rpython.test.test_llinterp import get_interpreter, clear_tcache
from pypy.objspace.flow.model import Constant
from pypy.translator.stm.transform2 import STMTransformer
+from pypy.translator.stm.transform2 import MORE_PRECISE_CATEGORIES
from pypy.conftest import option
@@ -50,21 +51,13 @@
class LLSTMFrame(LLFrame):
- _MORE_PRECISE_CATEGORIES = {
- 'P': 'PGORLWN',
- 'G': 'GN',
- 'O': 'ORLWN',
- 'R': 'RLWN',
- 'L': 'LWN',
- 'W': 'WN',
- 'N': 'N'}
def get_category(self, p):
return self.llinterpreter.tester.get_category(p)
def check_category(self, p, expected):
cat = self.get_category(p)
- assert cat in self._MORE_PRECISE_CATEGORIES[expected]
+ assert cat in MORE_PRECISE_CATEGORIES[expected]
def op_stm_barrier(self, kind, obj):
frm, middledigit, to = kind
@@ -143,4 +136,4 @@
res = self.interpret(f1, [4])
assert res == -81
assert len(self.writemode) == 0
- assert self.barriers == ['G2R', 'P2R'] # XXX remove the 2nd one
+ assert self.barriers == ['G2R']
diff --git a/pypy/translator/stm/transform2.py b/pypy/translator/stm/transform2.py
--- a/pypy/translator/stm/transform2.py
+++ b/pypy/translator/stm/transform2.py
@@ -27,6 +27,14 @@
log.info("Software Transactional Memory transformation applied")
+MORE_PRECISE_CATEGORIES = {
+ 'P': 'PGORLWN',
+ 'G': 'GN',
+ 'O': 'ORLWN',
+ 'R': 'RLWN',
+ 'L': 'LWN',
+ 'W': 'WN',
+ 'N': 'N'}
def is_immutable(op):
if op.opname in ('getfield', 'setfield'):
@@ -67,6 +75,7 @@
#
if wants_a_barrier:
renamings = {}
+ category = {}
newoperations = []
for op in block.operations:
to = wants_a_barrier.get(op)
@@ -76,12 +85,14 @@
if isinstance(v, Constant):
frm = 'G'
else:
- frm = 'P' # XXX improve
- c_info = Constant('%s2%s' % (frm, to), lltype.Void)
- w = varoftype(v.concretetype)
- newop = SpaceOperation('stm_barrier', [c_info, v], w)
- newoperations.append(newop)
- renamings[op.args[0]] = w
+ frm = category.get(v, 'P')
+ if frm not in MORE_PRECISE_CATEGORIES[to]:
+ c_info = Constant('%s2%s' % (frm, to), lltype.Void)
+ w = varoftype(v.concretetype)
+ newop = SpaceOperation('stm_barrier', [c_info, v], w)
+ newoperations.append(newop)
+ renamings[op.args[0]] = w
+ category[w] = to
newop = SpaceOperation(op.opname,
[renamings.get(v, v) for v in op.args],
op.result)
More information about the pypy-commit
mailing list