# HG changeset patch # User Lukas Stadler # Date 1339592999 -7200 # Node ID 728cf399b18dd0e6effe4b181ba7eff02f3bfa89 # Parent 8f529640e43046df6fcdb1df92d45a872893e557 fix NPE when using killCFG to delete an EndNode without a merge diff -r 8f529640e430 -r 728cf399b18d 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 Wed Jun 13 11:30:14 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Wed Jun 13 15:09:59 2012 +0200 @@ -61,30 +61,32 @@ private static void killEnd(EndNode end) { MergeNode merge = end.merge(); - merge.removeEnd(end); - StructuredGraph graph = (StructuredGraph) end.graph(); - if (merge instanceof LoopBeginNode && merge.forwardEndCount() == 0) { //dead loop - for (PhiNode phi : merge.phis().snapshot()) { - propagateKill(phi); - } - LoopBeginNode begin = (LoopBeginNode) merge; - // disconnect and delete loop ends & loop exits - for (LoopEndNode loopend : begin.loopEnds().snapshot()) { - loopend.predecessor().replaceFirstSuccessor(loopend, null); - loopend.safeDelete(); + if (merge != null) { + merge.removeEnd(end); + StructuredGraph graph = (StructuredGraph) end.graph(); + if (merge instanceof LoopBeginNode && merge.forwardEndCount() == 0) { //dead loop + for (PhiNode phi : merge.phis().snapshot()) { + propagateKill(phi); + } + LoopBeginNode begin = (LoopBeginNode) merge; + // disconnect and delete loop ends & loop exits + for (LoopEndNode loopend : begin.loopEnds().snapshot()) { + loopend.predecessor().replaceFirstSuccessor(loopend, null); + loopend.safeDelete(); + } + for (LoopExitNode loopexit : begin.loopExits().snapshot()) { + for (ValueProxyNode vpn : loopexit.proxies().snapshot()) { + graph.replaceFloating(vpn, vpn.value()); + } + graph.replaceFixedWithFixed(loopexit, graph.add(new BeginNode())); + } + killCFG(begin.next()); + begin.safeDelete(); + } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not a loop anymore + graph.reduceDegenerateLoopBegin((LoopBeginNode) merge); + } else if (merge.phiPredecessorCount() == 1) { // not a merge anymore + graph.reduceTrivialMerge(merge); } - for (LoopExitNode loopexit : begin.loopExits().snapshot()) { - for (ValueProxyNode vpn : loopexit.proxies().snapshot()) { - graph.replaceFloating(vpn, vpn.value()); - } - graph.replaceFixedWithFixed(loopexit, graph.add(new BeginNode())); - } - killCFG(begin.next()); - begin.safeDelete(); - } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not a loop anymore - graph.reduceDegenerateLoopBegin((LoopBeginNode) merge); - } else if (merge.phiPredecessorCount() == 1) { // not a merge anymore - graph.reduceTrivialMerge(merge); } }