changeset 2987:90acf5aaa10e

Clean up dead code elimination.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 15 Jun 2011 20:02:15 +0200
parents f01de7799e05
children 2bf5ac3f6fc3
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java
diffstat 1 files changed, 17 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 17:54:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 20:02:15 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.*;
@@ -67,19 +68,15 @@
 
         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 +99,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 +123,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 +164,4 @@
             }
         }
     }
-
-    private void deleteNonCFGNodes() {
-        for (Node node : graph.getNodes()) {
-            if (node != Node.Null && !flood.isMarked(node) && !isCFG(node)) {
-                node.delete();
-            }
-        }
-    }
 }