# HG changeset patch # User Thomas Wuerthinger # Date 1308165644 -7200 # Node ID a8e8035916a3b8ed0c781dbe1b3a39a48d931c53 # Parent 2bf5ac3f6fc3334324a27e9b0a17387ad9755a32# Parent ed63c8695fad3ff981075f01d9ec7da9e1096373 Merge. diff -r ed63c8695fad -r a8e8035916a3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Jun 15 21:13:52 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Jun 15 21:20:44 2011 +0200 @@ -25,6 +25,7 @@ import java.util.*; import com.oracle.max.graal.compiler.*; +import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.ir.*; import com.oracle.max.graal.graph.*; @@ -43,43 +44,26 @@ this.brokenLoops = new ArrayList(); // remove chained Merges -// for (Merge merge : graph.getNodes(Merge.class)) { -// if (merge.predecessors().size() == 1 && merge.usages().size() == 0) { -// if (merge.successors().get(0) instanceof Merge) { -// Node pred = merge.predecessors().get(0); -// int predIndex = merge.predecessorsIndex().get(0); -// pred.successors().setAndClear(predIndex, merge, 0); -// merge.delete(); -// } -// } -// } -// Node startSuccessor = graph.start().successors().get(0); -// if (startSuccessor instanceof Merge) { -// Merge startMerge = (Merge) startSuccessor; -// if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) { -// int predIndex = startMerge.predecessorsIndex().get(0); -// graph.start().successors().setAndClear(predIndex, startMerge, 0); -// startMerge.delete(); -// } -// } + for (Merge merge : graph.getNodes(Merge.class)) { + if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopEnd) && !(merge instanceof LoopBegin)) { + merge.endAt(0).replace(merge.next()); + merge.delete(); + } + } flood.add(graph.start()); iterateSuccessors(); disconnectCFGNodes(); - deleteBrokenLoops(); - iterateInputs(); disconnectNonCFGNodes(); - - deleteCFGNodes(); - deleteNonCFGNodes(); + deleteNodes(); new PhiSimplifier(graph); if (GraalOptions.TraceDeadCodeElimination) { - System.out.printf("dead code elimination finished\n"); + TTY.println("dead code elimination finished"); } } @@ -102,17 +86,18 @@ private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node) && node instanceof EndNode) { - EndNode end = (EndNode) node; - Merge merge = end.merge(); - merge.removeEnd(end); - } - } - - for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) { - node.successors().clearAll(); - node.inputs().clearAll(); + if (node != Node.Null && !flood.isMarked(node)) { + if (isCFG(node)) { + node.successors().clearAll(); + node.inputs().clearAll(); + } else if (node instanceof EndNode) { + EndNode end = (EndNode) node; + Merge merge = end.merge(); + if (merge != null && flood.isMarked(merge)) { + // We are a dead end node leading to a live merge. + merge.removeEnd(end); + } + } } } } @@ -125,17 +110,13 @@ usage.replace(((Phi) usage).valueAt(0)); } -// Node pred = loop.predecessors().get(0); -// int predIndex = loop.predecessorsIndex().get(0); -// pred.successors().setAndClear(predIndex, loop, 0); -// loop.delete(); loop.replace(loop.next()); } } - private void deleteCFGNodes() { + private void deleteNodes() { for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) { + if (node != Node.Null && !flood.isMarked(node)) { node.delete(); } } @@ -170,12 +151,4 @@ } } } - - private void deleteNonCFGNodes() { - for (Node node : graph.getNodes()) { - if (node != Node.Null && !flood.isMarked(node) && !isCFG(node)) { - node.delete(); - } - } - } } diff -r ed63c8695fad -r a8e8035916a3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Wed Jun 15 21:13:52 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Wed Jun 15 21:20:44 2011 +0200 @@ -199,6 +199,7 @@ Node n = block.firstNode(); if (n instanceof LoopBegin) { LoopBegin loopBegin = (LoopBegin) n; + assert loopBegin.loopEnd() != null; nodeToBlock.get(loopBegin.loopEnd()).addSuccessor(block); } }