Author: Ronan Lamy <[email protected]>
Branch: expressions-2
Changeset: r74563:df2f684b9b71
Date: 2014-11-17 18:49 +0000
http://bitbucket.org/pypy/pypy/changeset/df2f684b9b71/
Log: fix simplify.py to handle expressions
diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py
--- a/rpython/translator/simplify.py
+++ b/rpython/translator/simplify.py
@@ -485,11 +485,11 @@
for link in block.exits:
if link.target not in set_of_blocks:
for arg, targetarg in zip(link.args,
link.target.inputargs):
- read_vars.add(arg)
+ read_vars.update(arg.dependencies)
read_vars.add(targetarg)
else:
for arg, targetarg in zip(link.args,
link.target.inputargs):
- dependencies[targetarg].add(arg)
+ dependencies[targetarg].update(arg.dependencies)
else:
# return and except blocks implicitely use their input variable(s)
for arg in block.inputargs:
@@ -591,7 +591,18 @@
phis = inputs[block]
to_remove = []
unique_phis = {}
- for i, (input, phi_args) in enumerate(phis):
+ i = 0
+ while i < len(phis):
+ input, phi_args = phis[i]
+ if all(isinstance(arg, V_Type) for arg in phi_args):
+ # replace phi(type(v1), type(v2)) with type(phi(v1, v2))
+ new_args = [arg.arg for arg in phi_args]
+ new_v = Variable()
+ uf.union(V_Type(new_v), input)
+ to_remove.append(i)
+ phis.append((new_v, new_args))
+ i += 1
+ continue
new_args = [uf.find_rep(arg) for arg in phi_args]
if all_equal(new_args) and not isspecialvar(new_args[0]):
uf.union(new_args[0], input)
@@ -603,6 +614,7 @@
to_remove.append(i)
else:
unique_phis[t] = input
+ i += 1
for i in reversed(to_remove):
del phis[i]
return bool(to_remove)
@@ -614,7 +626,15 @@
if simplify_phis(block):
progress = True
+ # if uf is {v1: type(v2}, v2: v3}, we need to add {type(v2): type(v3)}
+ for family in uf.infos():
+ v = family.rep
+ while isinstance(v, V_Type) and v.arg in uf:
+ new_v = V_Type(uf[v.arg].rep)
+ uf.union(new_v, v)
+ v = new_v.arg
renaming = {key: uf[key].rep for key in uf}
+
for block, links in entrymap.items():
if inputs[block]:
new_inputs, new_args = zip(*inputs[block])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit