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)) {