Mercurial > hg > truffle
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()) {