Mercurial > hg > truffle
changeset 10778:f0fdbb2b7135
fix IfNode simplification that tries to remove a previously deleted LoopExitNode
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 16 Jul 2013 15:07:09 +0200 |
parents | 058abc2b59a5 |
children | c0ce8e825f30 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java |
diffstat | 1 files changed, 13 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Mon Jul 15 17:54:00 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Jul 16 15:07:09 2013 +0200 @@ -499,6 +499,17 @@ connectEnds(falseEnds, phiValues, oldFalseSuccessor, merge, tool); connectEnds(trueEnds, phiValues, oldTrueSuccessor, merge, tool); + /* + * Remove obsolete ends only after processing all ends, otherwise oldTrueSuccessor or + * oldFalseSuccessor might have been removed if it is a LoopExitNode. + */ + if (falseEnds.isEmpty()) { + GraphUtil.killCFG(oldFalseSuccessor); + } + if (trueEnds.isEmpty()) { + GraphUtil.killCFG(oldTrueSuccessor); + } + GraphUtil.killCFG(merge); assert !merge.isAlive() : merge; @@ -550,17 +561,14 @@ /** * Connects a set of ends to a given successor, inserting a merge node if there is more than one - * end. If {@code ends} is empty, then {@code successor} is - * {@linkplain GraphUtil#killCFG(FixedNode) killed} otherwise it is added to {@code tool}'s + * end. If {@code ends} is not empty, then {@code successor} is added to {@code tool}'s * {@linkplain SimplifierTool#addToWorkList(com.oracle.graal.graph.Node) work list}. * * @param oldMerge the merge being removed * @param phiValues the values of the phi at the merge, keyed by the merge ends */ private void connectEnds(List<AbstractEndNode> ends, Map<AbstractEndNode, ValueNode> phiValues, AbstractBeginNode successor, MergeNode oldMerge, SimplifierTool tool) { - if (ends.isEmpty()) { - GraphUtil.killCFG(successor); - } else { + if (!ends.isEmpty()) { if (ends.size() == 1) { AbstractEndNode end = ends.get(0); ((FixedWithNextNode) end.predecessor()).setNext(successor);