changeset 5693:0356d95f01ba

While inlining, ensure proper anchoring of things that where anchored to the StartNode Fix killCFG case where some dead nodes would not be removed, leading to later NullPointerExceptions Fix Switch nodes simplification in case the node of the remaining successor changes because of deleting the other branches Fix addDuplicates : do not patch inputs to the outer world if these inputs would point to an other graph
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 26 Jun 2012 16:43:51 +0200
parents 41149ce1422f
children 493e8d932148
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LookupSwitchNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/TableSwitchNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java
diffstat 6 files changed, 13 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java	Tue Jun 26 16:43:51 2012 +0200
@@ -780,12 +780,15 @@
             } else {
                 nodes.add(node);
                 if (node instanceof ReturnNode) {
+                    assert returnNode == null;
                     returnNode = (ReturnNode) node;
                 } else if (node instanceof UnwindNode) {
+                    assert unwindNode == null;
                     unwindNode = (UnwindNode) node;
                 }
             }
         }
+        replacements.put(entryPointNode, BeginNode.prevBegin(invoke.node())); // ensure proper anchoring of things that where anchored to the StartNode
 
         assert invoke.node().successors().first() != null : invoke;
         assert invoke.node().predecessor() != null;
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Tue Jun 26 16:43:51 2012 +0200
@@ -952,7 +952,7 @@
                             replacementsMap.put(input, replacement);
                             assert replacement == null || node.getNodeClass().inputTypes[pos.index] == null || node.getNodeClass().inputTypes[pos.index].isAssignableFrom(replacement.getClass());
                             target = replacement;
-                        } else { // patch to the outer world
+                        } else if (input.graph() == graph) { // patch to the outer world
                             target = input;
                         }
                     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java	Tue Jun 26 16:43:51 2012 +0200
@@ -350,8 +350,8 @@
         // evacuateGuards
         merge.prepareDelete((FixedNode) singleEnd.predecessor());
         merge.safeDelete();
-        if (stateAfter != null && stateAfter.usages().isEmpty()) {
-            stateAfter.safeDelete();
+        if (stateAfter != null && stateAfter.isAlive() && stateAfter.usages().isEmpty()) {
+            GraphUtil.killWithUnusedFloatingInputs(stateAfter);
         }
         if (sux == null) {
             singleEnd.replaceAtPredecessor(null);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LookupSwitchNode.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LookupSwitchNode.java	Tue Jun 26 16:43:51 2012 +0200
@@ -73,24 +73,21 @@
             ConstantNode constant = (ConstantNode) value();
             int value = constant.value.asInt();
 
-            BeginNode remainingSux = (BeginNode) defaultSuccessor();
             int remainingSuxIndex = blockSuccessorCount() - 1;
             for (int i = 0; i < keys.length; i++) {
                 if (value == keys[i]) {
-                    remainingSux = blockSuccessor(i);
                     remainingSuxIndex = i;
                     break;
                 }
             }
 
             for (int i = 0; i < blockSuccessorCount(); i++) {
-                BeginNode sux = blockSuccessor(i);
-                if (sux != remainingSux) {
-                    tool.deleteBranch(sux);
+                if (i != remainingSuxIndex) {
+                    tool.deleteBranch(blockSuccessor(i));
                 }
             }
 
-            tool.addToWorkList(remainingSux);
+            tool.addToWorkList(blockSuccessor(remainingSuxIndex));
             ((StructuredGraph) graph()).removeSplit(this, remainingSuxIndex);
         }
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/TableSwitchNode.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/TableSwitchNode.java	Tue Jun 26 16:43:51 2012 +0200
@@ -81,15 +81,13 @@
                 remainingSuxIndex = blockSuccessorCount() - 1;
             }
 
-            BeginNode remainingSux = blockSuccessor(remainingSuxIndex);
             for (int i = 0; i < blockSuccessorCount(); i++) {
-                BeginNode sux = blockSuccessor(i);
-                if (sux != remainingSux) {
-                    tool.deleteBranch(sux);
+                if (i != remainingSuxIndex) {
+                    tool.deleteBranch(blockSuccessor(i));
                 }
             }
 
-            tool.addToWorkList(remainingSux);
+            tool.addToWorkList(blockSuccessor(remainingSuxIndex));
             ((StructuredGraph) graph()).removeSplit(this, remainingSuxIndex);
         }
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Mon Jun 25 16:26:38 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Tue Jun 26 16:43:51 2012 +0200
@@ -47,7 +47,7 @@
         } else {
             // Normal control flow node.
             /* We do not take a successor snapshot because this iterator supports concurrent modifications
-             * as long as they do not change the size of the successor list. Not tasking a snapshot allows
+             * as long as they do not change the size of the successor list. Not taking a snapshot allows
              * us to see modifications to other branches that may happen while processing one branch.
              */
             for (Node successor : node.successors()) {