changeset 3009:6264ecd38bc2

Clean up dead code elimination.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 16 Jun 2011 18:31:16 +0200
parents 53dcb0794619
children ac6fb0c93ffb
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java
diffstat 6 files changed, 28 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalMetrics.java	Thu Jun 16 18:31:16 2011 +0200
@@ -65,11 +65,10 @@
     public static int NodesCanonicalized;
 
     public static void print() {
-        printClassFields(GraalMetrics.class);
-
         for (Entry<String, GraalMetrics> m : map.entrySet()) {
             printField(m.getKey(), m.getValue().value);
         }
+        printClassFields(GraalMetrics.class);
     }
 
     private static LinkedHashMap<String, GraalMetrics> map = new LinkedHashMap<String, GraalMetrics>();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Thu Jun 16 18:31:16 2011 +0200
@@ -55,10 +55,11 @@
 
         iterateSuccessors();
         disconnectCFGNodes();
+        iterateInputs();
+        disconnectNodes();
+        deleteNodes();
+
         deleteBrokenLoops();
-        iterateInputs();
-        disconnectNonCFGNodes();
-        deleteNodes();
 
         new PhiSimplifier(graph);
 
@@ -87,10 +88,7 @@
     private void disconnectCFGNodes() {
         for (Node node : graph.getNodes()) {
             if (node != Node.Null && !flood.isMarked(node)) {
-                if (isCFG(node)) {
-                    node.successors().clearAll();
-                    node.inputs().clearAll();
-                } else if (node instanceof EndNode) {
+                if (node instanceof EndNode) {
                     EndNode end = (EndNode) node;
                     Merge merge = end.merge();
                     if (merge != null && flood.isMarked(merge)) {
@@ -117,7 +115,7 @@
     private void deleteNodes() {
         for (Node node : graph.getNodes()) {
             if (node != Node.Null && !flood.isMarked(node)) {
-                node.delete();
+                node.unsafeDelete();
             }
         }
     }
@@ -129,25 +127,26 @@
             }
             if (node != Node.Null && flood.isMarked(node)) {
                 for (Node input : node.inputs()) {
-                    if (!isCFG(input)) {
-                        flood.add(input);
-                    }
+                    flood.add(input);
                 }
             }
         }
         for (Node current : flood) {
             for (Node input : current.inputs()) {
-                if (!isCFG(input)) {
-                    flood.add(input);
-                }
+                flood.add(input);
             }
         }
     }
 
-    private void disconnectNonCFGNodes() {
+    private void disconnectNodes() {
         for (Node node : graph.getNodes()) {
-            if (node != Node.Null && !flood.isMarked(node) && !isCFG(node)) {
-                node.inputs().clearAll();
+            if (node != Node.Null && !flood.isMarked(node)) {
+                for (int i = 0; i < node.inputs().size(); i++) {
+                    Node input = node.inputs().get(i);
+                    if (input != Node.Null && flood.isMarked(input)) {
+                        node.inputs().set(i, Node.Null);
+                    }
+                }
             }
         }
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java	Thu Jun 16 18:31:16 2011 +0200
@@ -23,6 +23,7 @@
 package com.oracle.max.graal.compiler.phases;
 
 import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.graph.Graph;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Thu Jun 16 18:31:16 2011 +0200
@@ -226,6 +226,8 @@
             return null;
         }
 
+        assert !n.isDeleted();
+
         Block prevBlock = nodeToBlock.get(n);
         if (prevBlock != null) {
             return prevBlock;
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Thu Jun 16 18:31:16 2011 +0200
@@ -123,6 +123,12 @@
         predecessors.clear();
     }
 
+    public void unsafeDelete() {
+        graph.unregister(this);
+        id = DeletedID;
+        assert isDeleted();
+    }
+
     public void delete() {
         assert !isDeleted();
         assert checkDeletion() : "Could not delete " + this + " (usages: " + this.usages() + ", predecessors: " + this.predecessors() + ")";
@@ -134,10 +140,7 @@
             successors.set(i, Null);
         }
         assert predecessors().size() == 0 && usages().size() == 0;
-        // make sure its not connected. pred usages
-        graph.unregister(this);
-        id = DeletedID;
-        assert isDeleted();
+        unsafeDelete();
     }
 
     private boolean checkDeletion() {
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Thu Jun 16 17:39:29 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Thu Jun 16 18:31:16 2011 +0200
@@ -173,6 +173,7 @@
     @Override
     public Node get(int index) {
         checkIndex(index);
+        assert !self().isDeleted();
         return nodes[index];
     }