# HG changeset patch # User Gilles Duboscq # Date 1340721831 -7200 # Node ID 0356d95f01ba2ecb0bb9cf47c4790f6971ec27e8 # Parent 41149ce1422fd167e051658656f58a3373961887 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 diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java --- 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; diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- 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; } } diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- 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); diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LookupSwitchNode.java --- 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); } } diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/TableSwitchNode.java --- 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); } } diff -r 41149ce1422f -r 0356d95f01ba graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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()) {