changeset 2966:0048537e3cd7

Added input to Merge node.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 15 Jun 2011 13:49:12 +0200
parents df4edf02543a
children 60a58915c94d
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/ir/Merge.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/GraphBuilderPhase.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 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java
diffstat 7 files changed, 40 insertions(+), 16 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:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Wed Jun 15 13:49:12 2011 +0200
@@ -48,4 +48,13 @@
     public Node copy(Graph into) {
         return new EndNode(into);
     }
+
+    public Merge merge() {
+        if (usages().size() == 0) {
+            return null;
+        } else {
+            assert usages().size() == 1;
+            return (Merge) usages().get(0);
+        }
+    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Wed Jun 15 13:49:12 2011 +0200
@@ -73,6 +73,18 @@
         v.visitMerge(this);
     }
 
+    public void addEnd(EndNode end) {
+        inputs().variablePart().add(end);
+    }
+
+    public int endCount() {
+        return inputs().variablePart().size();
+    }
+
+    public EndNode endAt(int index) {
+        return (EndNode) inputs().variablePart().get(index);
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
@@ -263,18 +275,17 @@
     @Override
     public Node copy(Graph into) {
         assert getClass() == Merge.class : "copy of " + getClass();
-        Merge x = new Merge(into);
-        return x;
+        return new Merge(into);
     }
 
-    public void removePhiPredecessor(Node pred) {
-        int predIndex = predecessors().lastIndexOf(pred);
+    public void removeEnd(EndNode pred) {
+        int predIndex = inputs().variablePart().indexOf(pred);
         assert predIndex != -1;
+        inputs().variablePart().remove(predIndex);
 
         for (Node usage : usages()) {
             if (usage instanceof Phi) {
                 Phi phi = (Phi) usage;
-//                assert phi.valueCount() == predecessors().size();
                 phi.removeInput(predIndex);
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 13:49:12 2011 +0200
@@ -91,16 +91,15 @@
 
     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)) {
-                // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct
-                for (int i = node.successors().size() - 1; i >= 0; i--) {
-                    Node successor = node.successors().get(i);
-                    if (successor != Node.Null && flood.isMarked(successor)) {
-                        if (successor instanceof Merge) {
-                            ((Merge) successor).removePhiPredecessor(node);
-                        }
-                    }
-                }
                 node.successors().clearAll();
                 node.inputs().clearAll();
             }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 13:49:12 2011 +0200
@@ -314,6 +314,7 @@
                 Node pred = p.predecessors().get(0);
                 EndNode end = new EndNode(graph);
                 p.replace(end);
+                merge.addEnd(end);
                 end.setNext(merge);
                 target.firstInstruction = merge;
                 merge.setStateBefore(existingState);
@@ -1153,6 +1154,7 @@
         if (result instanceof Merge) {
             EndNode end = new EndNode(graph);
             end.setNext(result);
+            ((Merge) result).addEnd(end);
             result = end;
         }
         return result;
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Wed Jun 15 13:49:12 2011 +0200
@@ -136,7 +136,7 @@
 
     public void delete() {
         assert !isDeleted();
-        assert checkDeletion();
+        assert checkDeletion() : "Could not delete " + this;
         assert predecessorsIndex.size() == 0;
         for (int i = 0; i < inputs.size(); ++i) {
             inputs.set(i, Null);
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Wed Jun 15 13:49:12 2011 +0200
@@ -97,7 +97,9 @@
                 for (int i=index; i < size() - 1; i++) {
                     NodeArray.this.nodes[fixedLength + i] = NodeArray.this.nodes[fixedLength + i + 1];
                 }
+                NodeArray.this.nodes[fixedLength + size() - 1] = Node.Null;
                 variableLength--;
+                assert variableLength >= 0;
                 return n;
             }
         };
@@ -179,7 +181,7 @@
 
     @Override
     public Node[] toArray() {
-        return Arrays.copyOf(nodes, nodes.length);
+        return Arrays.copyOf(nodes, size());
     }
 
     boolean replaceFirstOccurrence(Node toReplace, Node replacement) {
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Wed Jun 15 12:24:03 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Wed Jun 15 13:49:12 2011 +0200
@@ -77,6 +77,7 @@
     private void check(Node node) {
         assert node.graph == graph : "this node is not part of the graph";
         assert !isNew(node) : "this node (" + node.id() + ") was added to the graph after creating the node bitmap (" + bitMap.length() + ")";
+        assert !node.isDeleted() : "node " + node + " is deleted!";
     }
 
     @Override