# HG changeset patch # User Thomas Wuerthinger # Date 1367186354 -7200 # Node ID 50f02c7d1ceca48480d3b7f58b8df1b07edc8e61 # Parent 6a2a9eac243a748ae7f2d26e381d98e4ffafdea2 Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass. diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java Sun Apr 28 23:59:14 2013 +0200 @@ -35,8 +35,8 @@ public void testImplies() { StructuredGraph graph = new StructuredGraph(); - EndNode trueEnd = graph.add(new EndNode()); - EndNode falseEnd = graph.add(new EndNode()); + AbstractEndNode trueEnd = graph.add(new EndNode()); + AbstractEndNode falseEnd = graph.add(new EndNode()); BeginNode trueBegin = graph.add(new BeginNode()); trueBegin.setNext(trueEnd); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Sun Apr 28 23:59:14 2013 +0200 @@ -476,7 +476,7 @@ } @Override - public void visitEndNode(EndNode end) { + public void visitEndNode(AbstractEndNode end) { moveToPhi(end.merge(), end); } @@ -487,7 +487,7 @@ public void visitLoopEnd(LoopEndNode x) { } - private void moveToPhi(MergeNode merge, EndNode pred) { + private void moveToPhi(MergeNode merge, AbstractEndNode pred) { if (GraalOptions.TraceLIRGeneratorLevel >= 1) { TTY.println("MOVE TO PHI from " + pred + " to " + merge); } diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -1493,7 +1493,7 @@ BlockPlaceholderNode placeholder = (BlockPlaceholderNode) block.firstInstruction; // The EndNode for the already existing edge. - EndNode end = currentGraph.add(new EndNode()); + AbstractEndNode end = currentGraph.add(new EndNode()); // The MergeNode that replaces the placeholder. MergeNode mergeNode = currentGraph.add(new MergeNode()); FixedNode next = placeholder.next(); @@ -1508,7 +1508,7 @@ MergeNode mergeNode = (MergeNode) block.firstInstruction; // The EndNode for the newly merged edge. - EndNode newEnd = currentGraph.add(new EndNode()); + AbstractEndNode newEnd = currentGraph.add(new EndNode()); Target target = checkLoopExit(newEnd, block, state); FixedNode result = target.fixed; block.entryState.merge(mergeNode, target.state); @@ -1705,7 +1705,7 @@ if (block.isLoopHeader) { // Create the loop header block, which later will merge the backward branches of the // loop. - EndNode preLoopEnd = currentGraph.add(new EndNode()); + AbstractEndNode preLoopEnd = currentGraph.add(new EndNode()); LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode()); lastInstr.setNext(preLoopEnd); // Add the single non-loop predecessor of the loop header. diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java Sun Apr 28 23:59:14 2013 +0200 @@ -46,7 +46,7 @@ private Collection findBasic() { List bivs = new LinkedList<>(); LoopBeginNode loopBegin = loop.loopBegin(); - EndNode forwardEnd = loopBegin.forwardEnd(); + AbstractEndNode forwardEnd = loopBegin.forwardEnd(); for (PhiNode phi : loopBegin.phis()) { ValueNode backValue = phi.singleBackValue(); if (backValue == null) { diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java Sun Apr 28 23:59:14 2013 +0200 @@ -248,8 +248,8 @@ continue; } MergeNode merge = graph.add(new MergeNode()); - EndNode originalEnd = graph.add(new EndNode()); - EndNode newEnd = graph.add(new EndNode()); + AbstractEndNode originalEnd = graph.add(new EndNode()); + AbstractEndNode newEnd = graph.add(new EndNode()); merge.addForwardEnd(originalEnd); merge.addForwardEnd(newEnd); earlyExit.setNext(originalEnd); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java Sun Apr 28 23:59:14 2013 +0200 @@ -215,12 +215,12 @@ private BeginNode mergeEnds() { assert isDuplicate(); - List endsToMerge = new LinkedList<>(); - Map reverseEnds = new HashMap<>(); // map peel's exit to the - // corresponding loop exits + List endsToMerge = new LinkedList<>(); + Map reverseEnds = new HashMap<>(); // map peel's exit to the + // corresponding loop exits LoopBeginNode loopBegin = original().loop().loopBegin(); for (LoopEndNode le : loopBegin.loopEnds()) { - EndNode duplicate = getDuplicatedNode(le); + AbstractEndNode duplicate = getDuplicatedNode(le); if (duplicate != null) { endsToMerge.add(duplicate); reverseEnds.put(duplicate, le); @@ -230,7 +230,7 @@ BeginNode newExit; StructuredGraph graph = graph(); if (endsToMerge.size() == 1) { - EndNode end = endsToMerge.get(0); + AbstractEndNode end = endsToMerge.get(0); assert end.usages().count() == 0; newExit = graph.add(new BeginNode()); end.replaceAtPredecessor(newExit); @@ -245,13 +245,13 @@ duplicateState = state.duplicateWithVirtualState(); newExitMerge.setStateAfter(duplicateState); } - for (EndNode end : endsToMerge) { + for (AbstractEndNode end : endsToMerge) { newExitMerge.addForwardEnd(end); } for (final PhiNode phi : loopBegin.phis().snapshot()) { final PhiNode firstPhi = graph.add(phi.type() == PhiType.Value ? new PhiNode(phi.kind(), newExitMerge) : new PhiNode(phi.type(), newExitMerge, phi.getIdentity())); - for (EndNode end : newExitMerge.forwardEnds()) { + for (AbstractEndNode end : newExitMerge.forwardEnds()) { LoopEndNode loopEnd = reverseEnds.get(end); ValueNode prim = prim(phi.valueAt(loopEnd)); assert prim != null; diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractEndNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractEndNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes; + +import java.util.*; + +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; + +public abstract class AbstractEndNode extends FixedNode implements Node.IterableNodeType, LIRLowerable { + + protected AbstractEndNode() { + super(StampFactory.forVoid()); + } + + @Override + public void generate(LIRGeneratorTool gen) { + gen.visitEndNode(this); + } + + public MergeNode merge() { + return (MergeNode) usages().first(); + } + + @Override + public boolean verify() { + assertTrue(usages().count() <= 1, "at most one usage"); + return super.verify(); + } + + @Override + public Iterable cfgSuccessors() { + return Arrays.asList(merge()); + } +} diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EndNode.java Sun Apr 28 22:58:54 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.nodes; - -import java.util.*; - -import com.oracle.graal.graph.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; - -public class EndNode extends FixedNode implements Node.IterableNodeType, LIRLowerable { - - public EndNode() { - super(StampFactory.forVoid()); - } - - @Override - public void generate(LIRGeneratorTool gen) { - gen.visitEndNode(this); - } - - public MergeNode merge() { - return (MergeNode) usages().first(); - } - - @Override - public boolean verify() { - assertTrue(usages().count() <= 1, "at most one usage"); - return super.verify(); - } - - @Override - public Iterable cfgSuccessors() { - return Arrays.asList(merge()); - } -} diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -322,9 +322,9 @@ * @return true if a transformation was made, false otherwise */ private boolean removeOrMaterializeIf(SimplifierTool tool) { - if (trueSuccessor().next() instanceof EndNode && falseSuccessor().next() instanceof EndNode) { - EndNode trueEnd = (EndNode) trueSuccessor().next(); - EndNode falseEnd = (EndNode) falseSuccessor().next(); + if (trueSuccessor().next() instanceof AbstractEndNode && falseSuccessor().next() instanceof AbstractEndNode) { + AbstractEndNode trueEnd = (AbstractEndNode) trueSuccessor().next(); + AbstractEndNode falseEnd = (AbstractEndNode) falseSuccessor().next(); MergeNode merge = trueEnd.merge(); if (merge == falseEnd.merge() && merge.forwardEndCount() == 2 && trueSuccessor().anchored().isEmpty() && falseSuccessor().anchored().isEmpty()) { Iterator phis = merge.phis().iterator(); @@ -447,7 +447,7 @@ } } - List mergePredecessors = merge.cfgPredecessors().snapshot(); + List mergePredecessors = merge.cfgPredecessors().snapshot(); assert phi.valueCount() == merge.forwardEndCount(); Constant[] xs = constantValues(compare.x(), merge); @@ -461,9 +461,9 @@ return false; } - List falseEnds = new ArrayList<>(mergePredecessors.size()); - List trueEnds = new ArrayList<>(mergePredecessors.size()); - Map phiValues = new HashMap<>(mergePredecessors.size()); + List falseEnds = new ArrayList<>(mergePredecessors.size()); + List trueEnds = new ArrayList<>(mergePredecessors.size()); + Map phiValues = new HashMap<>(mergePredecessors.size()); BeginNode oldFalseSuccessor = falseSuccessor(); BeginNode oldTrueSuccessor = trueSuccessor(); @@ -471,9 +471,9 @@ setFalseSuccessor(null); setTrueSuccessor(null); - Iterator ends = mergePredecessors.iterator(); + Iterator ends = mergePredecessors.iterator(); for (int i = 0; i < xs.length; i++) { - EndNode end = ends.next(); + AbstractEndNode end = ends.next(); phiValues.put(end, phi.valueAt(end)); if (compare.condition().foldCondition(xs[i], ys[i], tool.runtime(), compare.unorderedIsTrue())) { trueEnds.add(end); @@ -525,8 +525,8 @@ } else if (node instanceof FixedWithNextNode) { FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node; node = fixedWithNextNode.next(); - } else if (node instanceof EndNode) { - EndNode endNode = (EndNode) node; + } else if (node instanceof AbstractEndNode) { + AbstractEndNode endNode = (AbstractEndNode) node; node = endNode.merge(); } else if (node instanceof ControlSinkNode) { return true; @@ -545,12 +545,12 @@ * @param oldMerge the merge being removed * @param phiValues the values of the phi at the merge, keyed by the merge ends */ - private void connectEnds(List ends, Map phiValues, BeginNode successor, MergeNode oldMerge, SimplifierTool tool) { + private void connectEnds(List ends, Map phiValues, BeginNode successor, MergeNode oldMerge, SimplifierTool tool) { if (ends.isEmpty()) { GraphUtil.killCFG(successor); } else { if (ends.size() == 1) { - EndNode end = ends.get(0); + AbstractEndNode end = ends.get(0); ((FixedWithNextNode) end.predecessor()).setNext(successor); oldMerge.removeEnd(end); GraphUtil.killCFG(end); @@ -561,7 +561,7 @@ PhiNode oldPhi = (PhiNode) oldMerge.usages().first(); PhiNode newPhi = graph().add(new PhiNode(oldPhi.stamp(), newMerge)); - for (EndNode end : ends) { + for (AbstractEndNode end : ends) { newPhi.addInput(phiValues.get(end)); newMerge.addForwardEnd(end); } @@ -615,10 +615,10 @@ private void removeEmptyIf(SimplifierTool tool) { BeginNode originalTrueSuccessor = trueSuccessor(); BeginNode originalFalseSuccessor = falseSuccessor(); - assert originalTrueSuccessor.next() instanceof EndNode && originalFalseSuccessor.next() instanceof EndNode; + assert originalTrueSuccessor.next() instanceof AbstractEndNode && originalFalseSuccessor.next() instanceof AbstractEndNode; - EndNode trueEnd = (EndNode) originalTrueSuccessor.next(); - EndNode falseEnd = (EndNode) originalFalseSuccessor.next(); + AbstractEndNode trueEnd = (AbstractEndNode) originalTrueSuccessor.next(); + AbstractEndNode falseEnd = (AbstractEndNode) originalFalseSuccessor.next(); assert trueEnd.merge() == falseEnd.merge(); FixedWithNextNode pred = (FixedWithNextNode) predecessor(); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -87,7 +87,7 @@ return snapshot; } - public EndNode forwardEnd() { + public AbstractEndNode forwardEnd() { assert forwardEndCount() == 1; return forwardEndAt(0); } @@ -98,7 +98,7 @@ } @Override - protected void deleteEnd(EndNode end) { + protected void deleteEnd(AbstractEndNode end) { if (end instanceof LoopEndNode) { LoopEndNode loopEnd = (LoopEndNode) end; loopEnd.setLoopBegin(null); @@ -122,7 +122,7 @@ } @Override - public int phiPredecessorIndex(EndNode pred) { + public int phiPredecessorIndex(AbstractEndNode pred) { if (pred instanceof LoopEndNode) { LoopEndNode loopEnd = (LoopEndNode) pred; if (loopEnd.loopBegin() == this) { @@ -136,7 +136,7 @@ } @Override - public EndNode phiPredecessorAt(int index) { + public AbstractEndNode phiPredecessorAt(int index) { if (index < forwardEndCount()) { return forwardEndAt(index); } diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -27,7 +27,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.spi.*; -public final class LoopEndNode extends EndNode { +public final class LoopEndNode extends AbstractEndNode { @Input(notDataflow = true) private LoopBeginNode loopBegin; private boolean canSafepoint; @@ -81,7 +81,7 @@ /** * Returns the 0-based index of this loop end. This is not the index into {@link PhiNode} - * values at the loop begin. Use {@link MergeNode#phiPredecessorIndex(EndNode)} for this + * values at the loop begin. Use {@link MergeNode#phiPredecessorIndex(AbstractEndNode)} for this * purpose. * * @return The 0-based index of this loop end. diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -35,18 +35,18 @@ */ public class MergeNode extends BeginStateSplitNode implements Node.IterableNodeType, LIRLowerable { - @Input(notDataflow = true) private final NodeInputList ends = new NodeInputList<>(this); + @Input(notDataflow = true) private final NodeInputList ends = new NodeInputList<>(this); @Override public void generate(LIRGeneratorTool gen) { gen.visitMerge(this); } - public int forwardEndIndex(EndNode end) { + public int forwardEndIndex(AbstractEndNode end) { return ends.indexOf(end); } - public void addForwardEnd(EndNode end) { + public void addForwardEnd(AbstractEndNode end) { ends.add(end); } @@ -54,12 +54,12 @@ return ends.size(); } - public EndNode forwardEndAt(int index) { + public AbstractEndNode forwardEndAt(int index) { return ends.get(index); } @Override - public NodeIterable cfgPredecessors() { + public NodeIterable cfgPredecessors() { return ends; } @@ -79,7 +79,7 @@ * * @param pred the end to remove */ - public void removeEnd(EndNode pred) { + public void removeEnd(AbstractEndNode pred) { int predIndex = phiPredecessorIndex(pred); assert predIndex != -1; deleteEnd(pred); @@ -95,7 +95,7 @@ } } - protected void deleteEnd(EndNode end) { + protected void deleteEnd(AbstractEndNode end) { ends.remove(end); } @@ -103,7 +103,7 @@ ends.clear(); } - public NodeIterable forwardEnds() { + public NodeIterable forwardEnds() { return ends; } @@ -111,11 +111,11 @@ return forwardEndCount(); } - public int phiPredecessorIndex(EndNode pred) { + public int phiPredecessorIndex(AbstractEndNode pred) { return forwardEndIndex(pred); } - public EndNode phiPredecessorAt(int index) { + public AbstractEndNode phiPredecessorAt(int index) { return forwardEndAt(index); } @@ -143,8 +143,8 @@ @Override public void simplify(SimplifierTool tool) { FixedNode next = next(); - if (next instanceof EndNode) { - EndNode origLoopEnd = (EndNode) next; + if (next instanceof AbstractEndNode) { + AbstractEndNode origLoopEnd = (AbstractEndNode) next; MergeNode merge = origLoopEnd.merge(); if (merge instanceof LoopBeginNode && !(origLoopEnd instanceof LoopEndNode)) { return; @@ -169,8 +169,8 @@ int numEnds = this.forwardEndCount(); StructuredGraph graph = (StructuredGraph) graph(); for (int i = 0; i < numEnds - 1; i++) { - EndNode end = forwardEndAt(numEnds - 1 - i); - EndNode newEnd; + AbstractEndNode end = forwardEndAt(numEnds - 1 - i); + AbstractEndNode newEnd; if (merge instanceof LoopBeginNode) { newEnd = graph.add(new LoopEndNode((LoopBeginNode) merge)); } else { diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Sun Apr 28 23:59:14 2013 +0200 @@ -159,7 +159,7 @@ values.set(i, x); } - public ValueNode valueAt(EndNode pred) { + public ValueNode valueAt(AbstractEndNode pred) { return valueAt(merge().phiPredecessorIndex(pred)); } diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Sun Apr 28 23:59:14 2013 +0200 @@ -348,7 +348,7 @@ if (merge instanceof LoopBeginNode) { ((LoopBeginNode) merge).removeExits(); } - EndNode singleEnd = merge.forwardEndAt(0); + AbstractEndNode singleEnd = merge.forwardEndAt(0); FixedNode sux = merge.next(); FrameState stateAfter = merge.stateAfter(); // evacuateGuards diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Sun Apr 28 23:59:14 2013 +0200 @@ -116,7 +116,7 @@ // Handling of block-end nodes still needs to be unified in the LIRGenerator. void visitMerge(MergeNode i); - void visitEndNode(EndNode i); + void visitEndNode(AbstractEndNode i); void visitLoopEnd(LoopEndNode i); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/ComputeImmediateDominator.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/ComputeImmediateDominator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/ComputeImmediateDominator.java Sun Apr 28 23:59:14 2013 +0200 @@ -147,7 +147,7 @@ private void processMerge(MergeNode merge, DominatorInfo info) { // TTY.println("processMerge(" + merge + ", " + info + ")"); - for (EndNode end : merge.cfgPredecessors()) { + for (AbstractEndNode end : merge.cfgPredecessors()) { toExplore.add(end); infoMap.set(end, info.createChild(end)); // TTY.println(" Enqueue end : " + end + " with " + infoMap.get(end)); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Sun Apr 28 23:59:14 2013 +0200 @@ -44,9 +44,9 @@ public static void killCFG(FixedNode node) { assert node.isAlive(); - if (node instanceof EndNode) { + if (node instanceof AbstractEndNode) { // We reached a control flow end. - EndNode end = (EndNode) node; + AbstractEndNode end = (AbstractEndNode) node; killEnd(end); } else { // Normal control flow node. @@ -63,7 +63,7 @@ propagateKill(node); } - private static void killEnd(EndNode end) { + private static void killEnd(AbstractEndNode end) { MergeNode merge = end.merge(); if (merge != null) { merge.removeEnd(end); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -501,8 +501,8 @@ GraphUtil.killWithUnusedFloatingInputs(compare); } } - } else if (node instanceof EndNode) { - EndNode endNode = (EndNode) node; + } else if (node instanceof AbstractEndNode) { + AbstractEndNode endNode = (AbstractEndNode) node; for (PhiNode phi : endNode.merge().phis()) { int index = endNode.merge().phiPredecessorIndex(endNode); ValueNode value = phi.valueAt(index); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -62,7 +62,7 @@ MergeNode mergeNode = (MergeNode) deoptBegin; Debug.log("Visiting %s followed by %s", mergeNode, deopt); List begins = new ArrayList<>(); - for (EndNode end : mergeNode.forwardEnds()) { + for (AbstractEndNode end : mergeNode.forwardEnds()) { BeginNode newBeginNode = findBeginNode(end); assert !begins.contains(newBeginNode); begins.add(newBeginNode); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -52,8 +52,8 @@ private static void iterateSuccessors(NodeFlood flood) { for (Node current : flood) { - if (current instanceof EndNode) { - EndNode end = (EndNode) current; + if (current instanceof AbstractEndNode) { + AbstractEndNode end = (AbstractEndNode) current; flood.add(end.merge()); } else { for (Node successor : current.successors()) { @@ -64,7 +64,7 @@ } private static void disconnectCFGNodes(NodeFlood flood, StructuredGraph graph) { - for (EndNode node : graph.getNodes(EndNode.class)) { + for (AbstractEndNode node : graph.getNodes(AbstractEndNode.class)) { if (!flood.isMarked(node)) { MergeNode merge = node.merge(); if (merge != null && flood.isMarked(merge)) { diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/EliminatePartiallyRedundantGuardsPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -119,7 +119,7 @@ if (guard.dependencies().size() != 1) { continue; } - for (EndNode end : merge.forwardEnds()) { + for (AbstractEndNode end : merge.forwardEnds()) { BeginNode begin = BeginNode.prevBegin(end); boolean found = false; for (GuardNode predecessorGuard : begin.guards()) { @@ -140,7 +140,7 @@ Graph graph = merge.graph(); for (GuardNode guard : hits) { PhiNode phi = graph.add(new PhiNode(PhiType.Guard, merge, null)); - for (EndNode otherEnd : merge.forwardEnds()) { + for (AbstractEndNode otherEnd : merge.forwardEnds()) { phi.addInput(graph.unique(new GuardNode(guard.condition(), BeginNode.prevBegin(otherEnd), guard.reason(), guard.action(), guard.negated()))); } guard.replaceAndDelete(phi); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -491,8 +491,8 @@ queueSuccessors(current); } else if (current instanceof FixedWithNextNode) { queueSuccessors(current); - } else if (current instanceof EndNode) { - queueMerge((EndNode) current); + } else if (current instanceof AbstractEndNode) { + queueMerge((AbstractEndNode) current); } else if (current instanceof ControlSinkNode) { // nothing todo } else if (current instanceof ControlSplitNode) { @@ -532,7 +532,7 @@ return result; } - private void queueMerge(EndNode end) { + private void queueMerge(AbstractEndNode end) { MergeNode merge = end.merge(); if (!queuedNodes.isMarked(merge) && visitedAllEnds(merge)) { queuedNodes.mark(merge); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Sun Apr 28 23:59:14 2013 +0200 @@ -734,7 +734,7 @@ BeginNode calleeEntryNode = graph.add(new BeginNode()); calleeEntryNode.setNext(duplicatedInvoke.asNode()); - EndNode endNode = graph.add(new EndNode()); + AbstractEndNode endNode = graph.add(new EndNode()); duplicatedInvoke.setNext(endNode); returnMerge.addForwardEnd(endNode); @@ -769,7 +769,7 @@ // set new state (pop old exception object, push new one) newExceptionEdge.setStateAfter(stateAfterException.duplicateModified(stateAfterException.bci, stateAfterException.rethrowException(), Kind.Object, newExceptionEdge)); - EndNode endNode = graph.add(new EndNode()); + AbstractEndNode endNode = graph.add(new EndNode()); newExceptionEdge.setNext(endNode); exceptionMerge.addForwardEnd(endNode); exceptionObjectPhi.addInput(newExceptionEdge); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -169,7 +169,7 @@ fixedCount++; } if (fixedCount > 1) { - if (fixed instanceof EndNode && !(((EndNode) fixed).merge() instanceof LoopBeginNode)) { + if (fixed instanceof AbstractEndNode && !(((AbstractEndNode) fixed).merge() instanceof LoopBeginNode)) { metricDuplicationEnd.increment(); if (decision.doTransform(merge, fixedCount)) { metricDuplicationEndPerformed.increment(); @@ -246,18 +246,18 @@ fixed = ((FixedWithNextNode) fixed).next(); } - EndNode endAfter = createNewMerge(fixed, stateAfter); + AbstractEndNode endAfter = createNewMerge(fixed, stateAfter); MergeNode mergeAfter = endAfter.merge(); fixedNodes.add(endAfter); final HashSet duplicatedNodes = buildDuplicatedNodeSet(fixedNodes, stateAfter); mergeAfter.clearEnds(); expandDuplicated(duplicatedNodes, mergeAfter); - List endSnapshot = merge.forwardEnds().snapshot(); + List endSnapshot = merge.forwardEnds().snapshot(); List phiSnapshot = merge.phis().snapshot(); int endIndex = 0; - for (final EndNode forwardEnd : merge.forwardEnds()) { + for (final AbstractEndNode forwardEnd : merge.forwardEnds()) { Map duplicates; if (replacements == null || replacements.get(endIndex) == null) { duplicates = graph.addDuplicates(duplicatedNodes, (DuplicationReplacement) null); @@ -269,7 +269,7 @@ for (Map.Entry phi : bottomPhis.entrySet()) { phi.getValue().initializeValueAt(merge.forwardEndIndex(forwardEnd), (ValueNode) duplicates.get(phi.getKey())); } - mergeAfter.addForwardEnd((EndNode) duplicates.get(endAfter)); + mergeAfter.addForwardEnd((AbstractEndNode) duplicates.get(endAfter)); // re-wire the duplicated ValueAnchorNode to the predecessor of the corresponding // EndNode @@ -293,7 +293,7 @@ endIndex++; } GraphUtil.killCFG(merge); - for (EndNode forwardEnd : endSnapshot) { + for (AbstractEndNode forwardEnd : endSnapshot) { forwardEnd.safeDelete(); } for (PhiNode phi : phiSnapshot) { @@ -428,9 +428,9 @@ * @param stateAfterMerge The frame state that should be used for the merge. * @return The newly created end node. */ - private EndNode createNewMerge(FixedNode successor, FrameState stateAfterMerge) { + private AbstractEndNode createNewMerge(FixedNode successor, FrameState stateAfterMerge) { MergeNode newBottomMerge = graph.add(new MergeNode()); - EndNode newBottomEnd = graph.add(new EndNode()); + AbstractEndNode newBottomEnd = graph.add(new EndNode()); newBottomMerge.addForwardEnd(newBottomEnd); newBottomMerge.setStateAfter(stateAfterMerge); ((FixedWithNextNode) successor.predecessor()).setNext(newBottomEnd); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeInliningRelevanceClosure.java Sun Apr 28 23:59:14 2013 +0200 @@ -70,7 +70,7 @@ if (scope.start instanceof LoopBeginNode) { assert scope.parent != null; double parentProbability = 0; - for (EndNode end : ((LoopBeginNode) scope.start).forwardEnds()) { + for (AbstractEndNode end : ((LoopBeginNode) scope.start).forwardEnds()) { parentProbability += nodeProbabilities.get(end); } return parentProbability / scope.parent.minPathProbability; diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/PostOrderNodeIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/PostOrderNodeIterator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/PostOrderNodeIterator.java Sun Apr 28 23:59:14 2013 +0200 @@ -85,9 +85,9 @@ assert next != null : current; node(current); current = next; - } else if (current instanceof EndNode) { - end((EndNode) current); - queueMerge((EndNode) current); + } else if (current instanceof AbstractEndNode) { + end((AbstractEndNode) current); + queueMerge((AbstractEndNode) current); current = nextQueuedNode(); } else if (current instanceof ControlSinkNode) { node(current); @@ -175,7 +175,7 @@ } } - private void queueMerge(EndNode end) { + private void queueMerge(AbstractEndNode end) { assert !visitedEnds.isMarked(end); assert !nodeStates.containsKey(end); nodeStates.put(end, state); @@ -195,7 +195,7 @@ protected abstract void node(FixedNode node); - protected void end(EndNode endNode) { + protected void end(AbstractEndNode endNode) { node(endNode); } diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Sun Apr 28 23:59:14 2013 +0200 @@ -115,16 +115,16 @@ current = successor; continue; } else { - if (current.getEndNode() instanceof EndNode) { + if (current.getEndNode() instanceof AbstractEndNode) { assert successor.getPredecessors().size() > 1 : "invalid block schedule at " + successor.getBeginNode(); - EndNode end = (EndNode) current.getEndNode(); + AbstractEndNode end = (AbstractEndNode) current.getEndNode(); // add the end node and see if the merge is ready for processing assert !states.containsKey(end); states.put(end, state); MergeNode merge = end.merge(); boolean endsVisited = true; - for (EndNode forwardEnd : merge.forwardEnds()) { + for (AbstractEndNode forwardEnd : merge.forwardEnds()) { if (!states.containsKey(forwardEnd)) { endsVisited = false; break; @@ -162,7 +162,7 @@ MergeNode merge = (MergeNode) current.getBeginNode(); ArrayList mergedStates = new ArrayList<>(merge.forwardEndCount()); for (Block predecessor : current.getPredecessors()) { - EndNode end = (EndNode) predecessor.getEndNode(); + AbstractEndNode end = (AbstractEndNode) predecessor.getEndNode(); mergedStates.add(states.get(end)); } state = closure.merge(current, mergedStates); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantNodeIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantNodeIterator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantNodeIterator.java Sun Apr 28 23:59:14 2013 +0200 @@ -94,9 +94,9 @@ if (!successors.hasNext()) { if (current instanceof LoopEndNode) { blockEndStates.put(current, state); - } else if (current instanceof EndNode) { + } else if (current instanceof AbstractEndNode) { // add the end node and see if the merge is ready for processing - MergeNode merge = ((EndNode) current).merge(); + MergeNode merge = ((AbstractEndNode) current).merge(); if (merge instanceof LoopBeginNode) { Map loopExitState = closure.processLoop((LoopBeginNode) merge, state); for (Map.Entry entry : loopExitState.entrySet()) { @@ -107,7 +107,7 @@ assert !blockEndStates.containsKey(current); blockEndStates.put(current, state); boolean endsVisited = true; - for (EndNode forwardEnd : merge.forwardEnds()) { + for (AbstractEndNode forwardEnd : merge.forwardEnds()) { if (!blockEndStates.containsKey(forwardEnd)) { endsVisited = false; break; @@ -116,7 +116,7 @@ if (endsVisited) { ArrayList states = new ArrayList<>(merge.forwardEndCount()); for (int i = 0; i < merge.forwardEndCount(); i++) { - EndNode forwardEnd = merge.forwardEndAt(i); + AbstractEndNode forwardEnd = merge.forwardEndAt(i); assert blockEndStates.containsKey(forwardEnd); StateT other = blockEndStates.get(forwardEnd); states.add(other); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScopedPostOrderNodeIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScopedPostOrderNodeIterator.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScopedPostOrderNodeIterator.java Sun Apr 28 23:59:14 2013 +0200 @@ -71,8 +71,8 @@ queueSuccessors(current); } else if (current instanceof FixedWithNextNode) { queueSuccessors(current); - } else if (current instanceof EndNode) { - queueMerge((EndNode) current); + } else if (current instanceof AbstractEndNode) { + queueMerge((AbstractEndNode) current); } else if (current instanceof ControlSinkNode) { // nothing todo } else if (current instanceof ControlSplitNode) { @@ -141,7 +141,7 @@ return result; } - private void queueMerge(EndNode end) { + private void queueMerge(AbstractEndNode end) { MergeNode merge = end.merge(); if (!queuedNodes.isMarked(merge) && visitedAllEnds(merge)) { queue(merge); diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Sun Apr 28 23:59:14 2013 +0200 @@ -162,7 +162,7 @@ PhiNode phi = (PhiNode) node; assert nodeBlock.getBeginNode() == phi.merge(); for (Block pred : nodeBlock.getPredecessors()) { - schedule(phi.valueAt((EndNode) pred.getEndNode()), pred); + schedule(phi.valueAt((AbstractEndNode) pred.getEndNode()), pred); } } else { diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Sun Apr 28 23:59:14 2013 +0200 @@ -167,7 +167,7 @@ } if (node.getClass() == BeginNode.class) { printProperty("shortName", "B"); - } else if (node.getClass() == EndNode.class) { + } else if (node.getClass() == AbstractEndNode.class) { printProperty("shortName", "E"); } if (node.predecessor() != null) { diff -r 6a2a9eac243a -r 50f02c7d1cec graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Sun Apr 28 22:58:54 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Sun Apr 28 23:59:14 2013 +0200 @@ -139,8 +139,8 @@ IdentityHashMap path = new IdentityHashMap<>(); flood.add(graph.start()); for (Node current : flood) { - if (current instanceof EndNode) { - EndNode end = (EndNode) current; + if (current instanceof AbstractEndNode) { + AbstractEndNode end = (AbstractEndNode) current; flood.add(end.merge()); if (!path.containsKey(end.merge())) { path.put(end.merge(), end);