Mercurial > hg > truffle
diff graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java @ 2951:0c0e407faa39
another fix to debug info (on-stack parameters), DCE removes unnecessary merges and LoopBegins whose LoopEnd went away
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 14 Jun 2011 16:47:31 +0200 |
parents | c7783b6773ea |
children | 445233cd91df |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 14 16:47:31 2011 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.max.graal.compiler.phases; +import java.util.*; + import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.ir.*; @@ -32,38 +34,42 @@ private NodeFlood flood; private Graph graph; + private ArrayList<LoopBegin> brokenLoops; @Override protected void run(Graph graph) { this.graph = graph; this.flood = graph.createNodeFlood(); + this.brokenLoops = new ArrayList<LoopBegin>(); // 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.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(); + } + } flood.add(graph.start()); iterateSuccessors(); disconnectCFGNodes(); + deleteBrokenLoops(); + iterateInputs(); disconnectNonCFGNodes(); @@ -72,6 +78,7 @@ new PhiSimplifier(graph); + if (GraalOptions.TraceDeadCodeElimination) { System.out.printf("dead code elimination finished\n"); } @@ -92,6 +99,9 @@ private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) { + if (node instanceof LoopEnd) { + brokenLoops.add(((LoopEnd) node).loopBegin()); + } // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct for (int i = node.successors().size() - 1; i >= 0; i--) { Node successor = node.successors().get(i); @@ -107,6 +117,21 @@ } } + private void deleteBrokenLoops() { + for (LoopBegin loop : brokenLoops) { + assert loop.predecessors().size() == 1; + for (Node usage : new ArrayList<Node>(loop.usages())) { + assert usage instanceof Phi; + 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(); + } + } + private void deleteCFGNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) {