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);