Author: Armin Rigo <[email protected]>
Branch: stm-thread-2
Changeset: r57090:b5e5d3e98047
Date: 2012-09-02 17:59 +0200
http://bitbucket.org/pypy/pypy/changeset/b5e5d3e98047/

Log:    Propagate the category freely across cast_pointers.

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
@@ -349,7 +349,8 @@
 
         res = self.interpret(f1, [10])
         assert res == 42 + 10
-        assert self.barriers == ['p2r']
+        assert self.barriers == ['p2r', 'p2r']  # from two blocks (could be
+                                                # optimized later)
         res = self.interpret(f1, [-10])
         assert res == 815
         assert self.barriers == ['p2r']
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
@@ -1,5 +1,5 @@
 from pypy.objspace.flow.model import SpaceOperation, Constant, Variable
-from pypy.objspace.flow.model import checkgraph
+from pypy.objspace.flow.model import checkgraph, c_last_exception
 from pypy.translator.unsimplify import varoftype
 from pypy.rpython.lltypesystem import lltype
 from pypy.translator.backendopt.writeanalyze import WriteAnalyzer, top_set
@@ -72,6 +72,16 @@
                 return 'N'     # NULL
         return category.get(v, 'P')
 
+    def renamings_get(v):
+        if v not in renamings:
+            return v
+        v2 = renamings[v][0]
+        if v2.concretetype == v.concretetype:
+            return v2
+        v3 = varoftype(v.concretetype)
+        newoperations.append(SpaceOperation('cast_pointer', [v2], v3))
+        return v3
+
     for block in graph.iterblocks():
         if block.operations == ():
             continue
@@ -96,25 +106,35 @@
                 expand_comparison.add(op)
         #
         if wants_a_barrier or expand_comparison:
-            renamings = {}
-            category = {}
+            # note: 'renamings' maps old vars to new vars, but cast_pointers
+            # are done lazily.  It means that the two vars may not have
+            # exactly the same type.
+            renamings = {}   # {original-var: [var-in-newoperations] (len 1)}
+            category = {}    # {var-in-newoperations: LETTER}
             newoperations = []
             for op in block.operations:
+                #
+                if op.opname == 'cast_pointer':
+                    v = op.args[0]
+                    renamings[op.result] = renamings.setdefault(v, [v])
+                    continue
+                #
                 to = wants_a_barrier.get(op)
                 if to is not None:
                     v = op.args[0]
-                    v = renamings.get(v, v)
+                    v_holder = renamings.setdefault(v, [v])
+                    v = v_holder[0]
                     frm = get_category(v)
                     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
+                        v_holder[0] = w
                         category[w] = to
                 #
                 newop = SpaceOperation(op.opname,
-                                       [renamings.get(v, v) for v in op.args],
+                                       [renamings_get(v) for v in op.args],
                                        op.result)
                 newoperations.append(newop)
                 #
@@ -146,6 +166,7 @@
 
             block.operations = newoperations
             #
+            assert block.exitswitch != c_last_exception   # transformed already
             for link in block.exits:
                 for i, v in enumerate(link.args):
-                    link.args[i] = renamings.get(v, v)
+                    link.args[i] = renamings_get(v)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to