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