changeset 2964:5200f61105a9

Add end nodes before merge nodes.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 15 Jun 2011 12:22:23 +0200
parents fc66984c2f31
children df4edf02543a
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java
diffstat 2 files changed, 21 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Wed Jun 15 12:12:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Wed Jun 15 12:22:23 2011 +0200
@@ -27,7 +27,7 @@
 import com.sun.cri.ci.*;
 
 
-public final class EndNode extends FixedNode {
+public final class EndNode extends Instruction {
     public static final int SUCCESSOR_COUNT = 0;
     public static final int INPUT_COUNT = 0;
     public EndNode(Graph graph) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 12:12:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 12:22:23 2011 +0200
@@ -305,9 +305,16 @@
                 assert !target.isLoopHeader;
                 Merge merge = new Merge(graph);
 
+
+
                 Placeholder p = (Placeholder) first;
+                assert p.predecessors().size() == 1;
                 assert p.next() == null;
-                p.replace(merge);
+
+                Node pred = p.predecessors().get(0);
+                EndNode end = new EndNode(graph);
+                p.replace(end);
+                end.setNext(merge);
                 target.firstInstruction = merge;
                 merge.setStateBefore(existingState);
                 first = merge;
@@ -1134,11 +1141,21 @@
         mergeOrClone(block, stateAfter);
         addToWorkList(block);
 
+        Instruction result = null;
         if (block.firstInstruction instanceof LoopBegin && isVisited(block)) {
-            return ((LoopBegin) block.firstInstruction).loopEnd();
+            result = ((LoopBegin) block.firstInstruction).loopEnd();
         } else {
-            return block.firstInstruction;
+            result = block.firstInstruction;
         }
+
+        assert result instanceof Merge || result instanceof Placeholder : result;
+
+        if (result instanceof Merge) {
+            EndNode end = new EndNode(graph);
+            end.setNext(result);
+            result = end;
+        }
+        return result;
     }
 
     private Value synchronizedObject(FrameStateAccess state, RiMethod target) {