changeset 2976:57c2e3409be7

Fixed merge issues.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 15 Jun 2011 17:53:53 +0200
parents cbece91420af
children f01de7799e05
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.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/schedule/IdentifyBlocksPhase.java
diffstat 3 files changed, 30 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Wed Jun 15 17:47:05 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Wed Jun 15 17:53:53 2011 +0200
@@ -466,7 +466,9 @@
         emitCompare(x.compare());
         emitBranch(x.compare(), getLIRBlock(x.trueSuccessor()), getLIRBlock(x.falseSuccessor()));
         assert x.defaultSuccessor() == x.falseSuccessor() : "wrong destination above";
-        lir.jump(getLIRBlock(x.defaultSuccessor()));
+        LIRBlock block = getLIRBlock(x.defaultSuccessor());
+        assert block != null : x;
+        lir.jump(block);
     }
 
     public void emitBranch(Compare compare, LIRBlock trueSuccessor, LIRBlock falseSucc) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 17:47:05 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 17:53:53 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.*;
@@ -41,25 +43,25 @@
         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());
 
@@ -123,10 +125,11 @@
                 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();
+//            Node pred = loop.predecessors().get(0);
+//            int predIndex = loop.predecessorsIndex().get(0);
+//            pred.successors().setAndClear(predIndex, loop, 0);
+//            loop.delete();
+            loop.replace(loop.next());
         }
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Wed Jun 15 17:47:05 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Wed Jun 15 17:53:53 2011 +0200
@@ -131,7 +131,7 @@
         // Identify blocks.
         for (Node n : graph.getNodes()) {
             if (n != null) {
-                if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd) {
+                if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) {
                     Block block = null;
                     while (nodeToBlock.get(n) == null) {
                         if (block != null && IdentifyBlocksPhase.trueSuccessorCount(n) > 1) {