changeset 2989:a8e8035916a3

Merge.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 15 Jun 2011 21:20:44 +0200
parents 2bf5ac3f6fc3 (diff) ed63c8695fad (current diff)
children 499851efab4d c6b89544fef5 7ed943d4d730 183389909fe3
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java
diffstat 2 files changed, 24 insertions(+), 50 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 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<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.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();
-            }
-        }
-    }
 }
--- 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);
                 }
             }