changeset 4620:bd8aca42516f

Merge
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 16 Feb 2012 17:47:43 +0100
parents a09b44a28e7f (current diff) 97d11635f2bf (diff)
children 2ab543f06630
files graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java
diffstat 2 files changed, 28 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/BeginNode.java	Thu Feb 16 17:47:14 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/BeginNode.java	Thu Feb 16 17:47:43 2012 +0100
@@ -25,10 +25,11 @@
 import java.util.*;
 
 import com.oracle.max.graal.graph.*;
+import com.oracle.max.graal.graph.iterators.*;
 import com.oracle.max.graal.nodes.spi.*;
 import com.oracle.max.graal.nodes.type.*;
 
-public class BeginNode extends AbstractStateSplit implements LIRLowerable, Simplifiable {
+public class BeginNode extends AbstractStateSplit implements LIRLowerable, Simplifiable, Node.IterableNodeType {
     public BeginNode() {
         super(StampFactory.illegal());
     }
@@ -58,15 +59,28 @@
             // This begin node is necessary.
         } else {
             // This begin node can be removed and all guards moved up to the preceding begin node.
-            Node prevBegin = prev;
+            if (!usages().isEmpty()) {
+                Node prevBegin = prev;
+                while (!(prevBegin instanceof BeginNode)) {
+                    prevBegin = prevBegin.predecessor();
+                }
+                for (Node usage : usages()) {
+                    tool.addToWorkList(usage);
+                }
+                replaceAtUsages(prevBegin);
+            }
+            ((StructuredGraph) graph()).removeFixed(this);
+        }
+    }
+
+    public void evacuateGuards() {
+        if (!usages().isEmpty()) {
+            Node prevBegin = predecessor();
+            assert prevBegin != null;
             while (!(prevBegin instanceof BeginNode)) {
                 prevBegin = prevBegin.predecessor();
             }
-            for (Node usage : usages()) {
-                tool.addToWorkList(usage);
-            }
             replaceAtUsages(prevBegin);
-            ((StructuredGraph) graph()).removeFixed(this);
         }
     }
 
@@ -80,4 +94,8 @@
     public void generate(LIRGeneratorTool gen) {
         // nop
     }
+
+    public NodeIterable<GuardNode> guards() {
+        return usages().filter(GuardNode.class);
+    }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Thu Feb 16 17:47:14 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Thu Feb 16 17:47:43 2012 +0100
@@ -194,6 +194,7 @@
         assert node.usages().isEmpty();
         assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
         BeginNode begin = node.blockSuccessor(survivingSuccessor);
+        begin.evacuateGuards();
         FixedNode next = begin.next();
         begin.setNext(null);
         for (int i = 0; i < node.blockSuccessorCount(); i++) {
@@ -208,6 +209,7 @@
         assert node.usages().isEmpty();
         assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
         BeginNode begin = node.blockSuccessor(survivingSuccessor);
+        begin.evacuateGuards();
         FixedNode next = begin.next();
         begin.setNext(null);
         for (int i = 0; i < node.blockSuccessorCount(); i++) {
@@ -240,6 +242,7 @@
         assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
         assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
         BeginNode begin = node.blockSuccessor(survivingSuccessor);
+        begin.evacuateGuards();
         FixedNode next = begin.next();
         begin.setNext(null);
         for (int i = 0; i < node.blockSuccessorCount(); i++) {
@@ -254,6 +257,7 @@
         assert node != null && replacement != null && node.isAlive() && replacement.isAlive() : "cannot replace " + node + " with " + replacement;
         assert survivingSuccessor >= 0 && survivingSuccessor < node.blockSuccessorCount() : "invalid surviving successor " + survivingSuccessor + " for " + node;
         BeginNode begin = node.blockSuccessor(survivingSuccessor);
+        begin.evacuateGuards();
         FixedNode next = begin.next();
         begin.setNext(null);
         for (int i = 0; i < node.blockSuccessorCount(); i++) {