[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