# HG changeset patch # User Thomas Wuerthinger # Date 1308138552 -7200 # Node ID 0048537e3cd78e5238968b5fc0fa99c184690b87 # Parent df4edf02543a9e8e7c7455614a0f2c674d013a17 Added input to Merge node. diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java --- 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); + } + } } diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java --- 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); } } diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- 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(); } diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- 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; diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java --- 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); diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java --- 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) { diff -r df4edf02543a -r 0048537e3cd7 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java --- 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