# HG changeset patch # User Gilles Duboscq # Date 1329410834 -3600 # Node ID a09b44a28e7f91a21a236ef3edefd1b058d45c5a # Parent d8e84cf186a4eca5b0eb82b0b167573ab2c1cb22 clenup unused floating nodes on killCFG CheckCast nodes can be anchored to any fixed node add an assert to scheduling diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Feb 16 17:47:14 2012 +0100 @@ -387,7 +387,11 @@ stateAfter = ((StateSplit) instr).stateAfter(); } if (instr instanceof ValueNode) { - doRoot((ValueNode) instr); + try { + doRoot((ValueNode) instr); + } catch (Throwable e) { + throw new GraalInternalError(e).addContext(instr); + } } if (stateAfter != null) { lastState = stateAfter; @@ -402,7 +406,7 @@ } if (block.numberOfSux() >= 1 && !endsWithJump(block)) { NodeSuccessorsIterable successors = block.getEndNode().successors(); - assert successors.count() >= 1 : "should have at least one successor : " + block.getEndNode(); + assert successors.isNotEmpty() : "should have at least one successor : " + block.getEndNode(); emitJump(getLIRBlock((FixedNode) successors.first()), null); } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java Thu Feb 16 17:47:14 2012 +0100 @@ -24,7 +24,6 @@ import java.util.*; -import com.oracle.max.cri.ci.*; import com.oracle.max.criutils.*; import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.phases.*; @@ -102,6 +101,7 @@ } else if (GraalOptions.ScheduleOutOfLoops && !(n instanceof VirtualObjectFieldNode) && !(n instanceof VirtualObjectNode)) { Block earliestBlock = earliestBlock(n); block = scheduleOutOfLoops(n, latestBlock, earliestBlock); + assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsisitant for " + n; } else { block = latestBlock; } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java Thu Feb 16 17:47:14 2012 +0100 @@ -77,7 +77,7 @@ StringBuilder str = new StringBuilder(); str.append(super.toString()); for (String s : context) { - str.append("\n\t\tat ").append(s); + str.append("\n\tat ").append(s); } return str.toString(); } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java --- a/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java Thu Feb 16 17:47:14 2012 +0100 @@ -24,6 +24,7 @@ import java.util.*; +import com.oracle.max.graal.debug.*; import com.oracle.max.graal.graph.*; import com.oracle.max.graal.lir.*; import com.oracle.max.graal.nodes.*; @@ -196,4 +197,18 @@ return getSuccessors().get(i); } // end to be inlined later on + + public boolean dominates(Block block) { + return block.isDominatedBy(this); + } + + public boolean isDominatedBy(Block block) { + if (block == this) { + return true; + } + if (dominator == null) { + return false; + } + return dominator.isDominatedBy(block); + } } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java Thu Feb 16 17:47:14 2012 +0100 @@ -125,7 +125,7 @@ @Override public boolean verify() { - assertTrue(loopEnds().count() > 0, "missing loopEnd"); + assertTrue(loopEnds().isNotEmpty(), "missing loopEnd"); assertTrue(forwardEndCount() == 1, "LoopBegin should only have one forward edge"); return super.verify(); } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java Thu Feb 16 17:47:14 2012 +0100 @@ -201,7 +201,6 @@ } node.replaceAtPredecessors(next); node.safeDelete(); - begin.safeDelete(); } public void removeSplitPropagate(ControlSplitNode node, int survivingSuccessor) { @@ -286,7 +285,7 @@ } public void reduceDegenerateLoopBegin(LoopBeginNode begin) { - assert begin.loopEnds().count() == 0 : "Loop begin still has backedges"; + assert begin.loopEnds().isEmpty() : "Loop begin still has backedges"; if (begin.forwardEndCount() == 1) { // bypass merge and remove reduceTrivialMerge(begin); } else { // convert to merge @@ -297,7 +296,7 @@ public void reduceTrivialMerge(MergeNode merge) { assert merge.forwardEndCount() == 1; - assert !(merge instanceof LoopBeginNode) || ((LoopBeginNode) merge).loopEnds().count() == 0; + assert !(merge instanceof LoopBeginNode) || ((LoopBeginNode) merge).loopEnds().isEmpty(); for (PhiNode phi : merge.phis().snapshot()) { assert phi.valueCount() == 1; ValueNode singleValue = phi.valueAt(0); @@ -308,7 +307,7 @@ FixedNode sux = merge.next(); FrameState stateAfter = merge.stateAfter(); merge.safeDelete(); - if (stateAfter != null && stateAfter.usages().count() == 0) { + if (stateAfter != null && stateAfter.usages().isEmpty()) { stateAfter.safeDelete(); } if (sux == null) { diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java Thu Feb 16 17:47:14 2012 +0100 @@ -37,9 +37,9 @@ */ public final class CheckCastNode extends TypeCheckNode implements Canonicalizable, LIRLowerable, Node.IterableNodeType { - @Input protected final AnchorNode anchor; + @Input protected final FixedNode anchor; - public AnchorNode anchor() { + public FixedNode anchor() { return anchor; } @@ -50,11 +50,11 @@ * @param targetClass the class being cast to * @param object the instruction producing the object */ - public CheckCastNode(AnchorNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object) { + public CheckCastNode(FixedNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object) { this(anchor, targetClassInstruction, targetClass, object, EMPTY_HINTS, false); } - public CheckCastNode(AnchorNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object, RiResolvedType[] hints, boolean hintsExact) { + public CheckCastNode(FixedNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object, RiResolvedType[] hints, boolean hintsExact) { super(targetClassInstruction, targetClass, object, hints, hintsExact, targetClass == null ? StampFactory.forKind(CiKind.Object) : StampFactory.declared(targetClass)); this.anchor = anchor; } diff -r d8e84cf186a4 -r a09b44a28e7f graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java --- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java Thu Feb 16 14:53:04 2012 +0100 +++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java Thu Feb 16 17:47:14 2012 +0100 @@ -63,14 +63,13 @@ FixedNode next = begin.next(); begin.safeDelete(); killCFG(next); - } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().count() == 0) { // not a loop anymore + } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not a loop anymore ((StructuredGraph) end.graph()).reduceDegenerateLoopBegin((LoopBeginNode) merge); } else if (merge.phiPredecessorCount() == 1) { // not a merge anymore ((StructuredGraph) end.graph()).reduceTrivialMerge(merge); } } - // TODO(tw): Factor this code with other branch deletion code. public static void propagateKill(Node node) { if (node != null && node.isAlive()) { List usagesSnapshot = node.usages().filter(isA(FloatingNode.class).or(CallTargetNode.class)).snapshot(); @@ -78,7 +77,7 @@ // null out remaining usages node.replaceAtUsages(null); node.replaceAtPredecessors(null); - node.safeDelete(); + killUnusedFloatingInputs(node); for (Node usage : usagesSnapshot) { if (!usage.isDeleted()) { @@ -91,4 +90,15 @@ } } } + + public static void killUnusedFloatingInputs(Node node) { + List floatingInputs = node.inputs().filter(FloatingNode.class).snapshot(); + node.safeDelete(); + + for (FloatingNode in : floatingInputs) { + if (in.usages().isEmpty()) { + killUnusedFloatingInputs(in); + } + } + } }