# HG changeset patch # User Gilles Duboscq # Date 1308649473 -7200 # Node ID fe7145755a91075c93883ac851a9320a8598e430 # Parent b7f45b37dd43af60070a77844b4dc7dd02bb9645 LoopEnd is not a Merge anymore diff -r b7f45b37dd43 -r fe7145755a91 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java Tue Jun 21 10:35:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java Tue Jun 21 11:44:33 2011 +0200 @@ -24,9 +24,10 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.graph.*; +import com.sun.cri.ci.*; -public class LoopEnd extends Merge { +public class LoopEnd extends FixedNode { private static final int INPUT_COUNT = 1; private static final int INPUT_LOOP_BEGIN = 0; @@ -55,7 +56,7 @@ } public LoopEnd(Graph graph) { - super(INPUT_COUNT, SUCCESSOR_COUNT, graph); + super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); } @Override diff -r b7f45b37dd43 -r fe7145755a91 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 Tue Jun 21 10:35:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 21 11:44:33 2011 +0200 @@ -45,7 +45,7 @@ // remove chained Merges for (Merge merge : graph.getNodes(Merge.class)) { - if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopEnd || merge instanceof LoopBegin)) { + if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopBegin)) { FixedNode next = merge.next(); EndNode endNode = merge.endAt(0); merge.delete(); diff -r b7f45b37dd43 -r fe7145755a91 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 Tue Jun 21 10:35:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Tue Jun 21 11:44:33 2011 +0200 @@ -286,7 +286,7 @@ StateSplit first = (StateSplit) target.firstInstruction; if (target.isLoopHeader && isVisited(target)) { - first = loopBegin(target).loopEnd(); + first = (StateSplit) loopBegin(target).loopEnd().singlePredecessor(); } int bci = target.startBci; @@ -317,13 +317,16 @@ } else { Merge merge = new Merge(graph); assert p.predecessors().size() == 1 : "predecessors size: " + p.predecessors().size(); - merge.setNext(p.next()); + FixedNode next = p.next(); p.setNext(null); EndNode end = new EndNode(graph); p.replace(end); + merge.setNext(next); merge.addEnd(end); - target.firstInstruction = merge; merge.setStateAfter(existingState); + if (!(next instanceof LoopEnd)) { + target.firstInstruction = merge; + } first = merge; } } @@ -1150,10 +1153,12 @@ LoopBegin loopBegin = new LoopBegin(graph); LoopEnd loopEnd = new LoopEnd(graph); loopEnd.setLoopBegin(loopBegin); - Placeholder p = new Placeholder(graph); - p.setNext(loopBegin.forwardEdge()); + Placeholder pBegin = new Placeholder(graph); + pBegin.setNext(loopBegin.forwardEdge()); + Placeholder pEnd = new Placeholder(graph); + pEnd.setNext(loopEnd); loopBegin.setStateAfter(stateAfter.duplicate(block.startBci)); - block.firstInstruction = p; + block.firstInstruction = pBegin; } else { block.firstInstruction = new Placeholder(graph); } @@ -1163,7 +1168,7 @@ FixedNode result = null; if (block.isLoopHeader && isVisited(block)) { - result = loopBegin(block).loopEnd(); + result = (StateSplit) loopBegin(block).loopEnd().singlePredecessor(); } else { result = block.firstInstruction; } @@ -1236,6 +1241,7 @@ if (b.isLoopHeader) { LoopBegin begin = loopBegin(b); LoopEnd loopEnd = begin.loopEnd(); + StateSplit loopEndPred = (StateSplit) loopEnd.singlePredecessor(); // This can happen with degenerated loops like this one: // for (;;) { @@ -1244,11 +1250,12 @@ // } catch (UnresolvedException iioe) { // } // } - if (loopEnd.stateAfter() != null) { + if (loopEndPred.stateAfter() != null) { //loopHeaderMerge.stateBefore().merge(begin, end.stateBefore()); //assert loopHeaderMerge.equals(end.stateBefore()); - begin.stateAfter().merge(begin, loopEnd.stateAfter()); + begin.stateAfter().merge(begin, loopEndPred.stateAfter()); } else { + loopEndPred.delete(); loopEnd.delete(); Merge merge = new Merge(graph); merge.addEnd(begin.forwardEdge()); diff -r b7f45b37dd43 -r fe7145755a91 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Tue Jun 21 10:35:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Tue Jun 21 11:44:33 2011 +0200 @@ -92,6 +92,11 @@ private List findLoopCounters(LoopBegin loopBegin, NodeBitMap loopNodes) { LoopEnd loopEnd = loopBegin.loopEnd(); + FrameState loopEndState = null; + Node loopEndPred = loopEnd.singlePredecessor(); + if (loopEndPred instanceof Merge) { + loopEndState = ((Merge) loopEndPred).stateAfter(); + } List usages = new ArrayList(loopBegin.usages()); List counters = new LinkedList(); for (Node usage : usages) { @@ -112,7 +117,7 @@ IntegerAdd add = (IntegerAdd) backEdge; int addUsageCount = 0; for (Node u : add.usages()) { - if (u != loopEnd.stateAfter() && u != phi) { + if (u != loopEndState && u != phi) { addUsageCount++; } } @@ -130,7 +135,9 @@ LoopCounter counter = new LoopCounter(init.kind, init, stride, loopBegin, graph); counters.add(counter); phi.replace(counter); - loopEnd.stateAfter().inputs().replace(backEdge, counter); + if (loopEndState != null) { + loopEndState.inputs().replace(backEdge, counter); + } if (useCounterAfterAdd) { /*IntegerAdd otherInit = new IntegerAdd(init.kind, init, stride, graph); // would be nice to canonicalize LoopCounter otherCounter = new LoopCounter(init.kind, otherInit, stride, loopBegin, graph);