# HG changeset patch # User Gilles Duboscq # Date 1308328830 -7200 # Node ID 4dd57c0f94a8c852f4b31a629443db14c7b970f2 # Parent f9e045cd2c23798b16b56d8ada7fe82000d46866 Debuggin state diff -r f9e045cd2c23 -r 4dd57c0f94a8 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Fri Jun 17 18:40:30 2011 +0200 @@ -28,6 +28,7 @@ import com.oracle.max.graal.compiler.ir.*; import com.oracle.max.graal.compiler.schedule.*; +import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; /** @@ -133,7 +134,7 @@ if (schedule != null) { stream.println(" "); for (Block block : schedule.getBlocks()) { - printBlock(graph, block); + printBlock(graph, block, schedule.getNodeToBlock()); } printNoBlock(); stream.println(" "); @@ -164,9 +165,13 @@ } stream.printf("

%s

%n", escape(name)); } + stream.printf("

%s

%n", escape(node.getClass().getSimpleName())); Block block = nodeToBlock == null ? null : nodeToBlock.get(node); if (block != null) { stream.printf("

%d

%n", block.blockID()); + if (!(node instanceof Phi || node instanceof FrameState || node instanceof Local) && !block.getInstructions().contains(node)) { + stream.printf("

true

%n"); + } } else { stream.printf("

noBlock

%n"); noBlockNodes.add(node); @@ -205,7 +210,7 @@ stream.printf(" %n", edge.from, edge.fromIndex, edge.to, edge.toIndex); } - private void printBlock(Graph graph, Block block) { + private void printBlock(Graph graph, Block block, NodeMap nodeToBlock) { stream.printf(" %n", block.blockID()); stream.printf(" %n"); for (Block sux : block.getSuccessors()) { @@ -219,6 +224,19 @@ stream.printf(" %n"); Set nodes = new HashSet(block.getInstructions()); + + if (nodeToBlock != null) { + for (Node n : graph.getNodes()) { + if (n == null) { + continue; + } + Block blk = nodeToBlock.get(n); + if (blk == block) { + nodes.add(n); + } + } + } + if (nodes.size() > 0) { // if this is the first block: add all locals to this block if (block.getInstructions() == graph.start()) { diff -r f9e045cd2c23 -r 4dd57c0f94a8 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 Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java Fri Jun 17 18:40:30 2011 +0200 @@ -30,6 +30,7 @@ public final class EndNode extends FixedNode { public static final int SUCCESSOR_COUNT = 0; public static final int INPUT_COUNT = 0; + public EndNode(Graph graph) { super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); } diff -r f9e045cd2c23 -r 4dd57c0f94a8 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 Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Fri Jun 17 18:40:30 2011 +0200 @@ -1219,7 +1219,8 @@ loopEnd.delete(); Merge merge = new Merge(graph); EndNode end = new EndNode(graph); - begin.singlePredecessor().successors().replace(begin, end); + int nbrReplacement = begin.singlePredecessor().successors().replace(begin, end); + assert nbrReplacement > 0; merge.addEnd(end); merge.setNext(begin.next()); merge.setStateAfter(begin.stateAfter()); diff -r f9e045cd2c23 -r 4dd57c0f94a8 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/Phase.java Fri Jun 17 18:40:30 2011 +0200 @@ -54,7 +54,9 @@ } GraalTimers.get(getName()).start(); } + //System.out.println("Starting Phase " + getName()); run(graph); + //System.out.println("Finished Phase " + getName()); if (GraalOptions.Time) { GraalTimers.get(getName()).stop(); if (oldCurrentPhase != null) { diff -r f9e045cd2c23 -r 4dd57c0f94a8 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Fri Jun 17 18:40:30 2011 +0200 @@ -33,6 +33,7 @@ public class IdentifyBlocksPhase extends Phase { + private static final int MAX_DOMINATOR_ITER = 50; private final List blocks = new ArrayList(); private NodeMap nodeToBlock; private Graph graph; @@ -94,6 +95,8 @@ } private void print() { + Block dominatorRoot = nodeToBlock.get(graph.start()); + System.out.println("Root = " + dominatorRoot); System.out.println("nodeToBlock :"); System.out.println(nodeToBlock); System.out.println("Blocks :"); @@ -134,7 +137,7 @@ } } -// System.out.println("identify blocks"); + //System.out.println("identify blocks"); // print(); // Connect blocks. @@ -142,9 +145,8 @@ Node n = block.firstNode(); if (n instanceof Merge) { Merge m = (Merge) n; - for (int i = 0; i < m.endCount(); ++i) { - EndNode end = m.endAt(i); - Block predBlock = nodeToBlock.get(end); + for (Node pred : m.phiPointPredecessors()) { + Block predBlock = nodeToBlock.get(pred); predBlock.addSuccessor(block); } } else { @@ -156,8 +158,8 @@ } } } -// System.out.println("connect"); -// print(); + //System.out.println("connect"); + //print(); computeDominators(); @@ -174,14 +176,14 @@ } } -// System.out.println("dom + cycles"); + //System.out.println("dom + cycles"); // print(); assignLatestPossibleBlockToNodes(); -// System.out.println("assign last"); + //System.out.println("assign last"); // print(); sortNodesWithinBlocks(); -// System.out.println("sort"); + //System.out.println("sort"); // print(); } else { computeJavaBlocks(); @@ -270,14 +272,8 @@ Block block = nodeToBlock.get(((LoopCounter) n).loopBegin()); nodeToBlock.set(n, block); } - if (n.id() == 142) { - System.out.println("computing common dom for " + n); - } Block block = null; for (Node succ : n.successors()) { - if (n.id() == 142) { - System.out.println("com(assignLatestPossibleBlockToNode(succ)) = com(" + assignLatestPossibleBlockToNode(succ) + ")"); - } block = getCommonDominator(block, assignLatestPossibleBlockToNode(succ)); } for (Node usage : n.usages()) { @@ -294,18 +290,12 @@ TTY.println(merge.phiPointPredecessors().toString()); TTY.println("value count: " + phi.valueCount()); } - if (n.id() == 142) { - System.out.println("com(phi-merge) = com(" + mergeBlock.getPredecessors().get(i) + ")"); - } block = getCommonDominator(block, mergeBlock.getPredecessors().get(i)); } } } else if (usage instanceof FrameState && ((FrameState) usage).block() != null) { PhiPoint merge = ((FrameState) usage).block(); for (Node pred : merge.phiPointPredecessors()) { - if (n.id() == 142) { - System.out.println("com(FS pred) = com(" + nodeToBlock.get(pred) + ")"); - } block = getCommonDominator(block, nodeToBlock.get(pred)); } } else if (usage instanceof LoopCounter) { @@ -313,15 +303,9 @@ if (n == counter.init() || n == counter.stride()) { LoopBegin loopBegin = counter.loopBegin(); Block mergeBlock = nodeToBlock.get(loopBegin); - if (n.id() == 142) { - System.out.println("com(LC dom) = com(" + mergeBlock.dominator() + ")"); - } block = getCommonDominator(block, mergeBlock.dominator()); } } else { - if (n.id() == 142) { - System.out.println("com(usage) = com(" + assignLatestPossibleBlockToNode(usage) + ")"); - } block = getCommonDominator(block, assignLatestPossibleBlockToNode(usage)); } } @@ -430,8 +414,14 @@ visited.set(dominatorRoot.blockID()); LinkedList workList = new LinkedList(); workList.add(dominatorRoot); - + int iter = 0; + int maxIter = MAX_DOMINATOR_ITER * blocks.size(); while (!workList.isEmpty()) { + if (iter++ >= maxIter) { + System.out.println("Reached maxIter(" + maxIter + ") !!"); + print(); + throw new CiBailout("Max iteration for dominator computation reached, Cycles in the block graph?"); + } Block b = workList.remove(); List predecessors = b.getPredecessors(); diff -r f9e045cd2c23 -r 4dd57c0f94a8 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 Fri Jun 17 14:53:07 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java Fri Jun 17 18:40:30 2011 +0200 @@ -163,7 +163,7 @@ private void checkIndex(int index) { if (index < 0 || index >= size()) { - throw new IndexOutOfBoundsException(); + throw new IndexOutOfBoundsException("Index : " + index); } } diff -r f9e045cd2c23 -r 4dd57c0f94a8 rundacapo.sh --- a/rundacapo.sh Fri Jun 17 14:53:07 2011 +0200 +++ b/rundacapo.sh Fri Jun 17 18:40:30 2011 +0200 @@ -15,4 +15,4 @@ echo "DACAPO is not defined. It must point to a Dacapo benchmark directory." exit 1; fi -${JDK7}/bin/java -client -d64 -graal -G:PrintIdealGraphLevel=4 -G:PrintFilter=scanContent -XX:CompileCommand=compileonly,*.scanContent -XX:CompileCommand=exclude,com.oracle* -XX:-GraalBailoutIsFatal -XX:+PrintCompilation -Xms1g -Xmx2g -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar Harness --preserve $* +${JDK7}/bin/java -client -d64 -graal -G:+PrintCompilation -G:+DetailedAsserts -G:PrintIdealGraphLevel=4 "-G:PrintFilter=~.*(fill|findBundle).*" -XX:CompileCommand=compileonly,java.io.BufferedReader::fill -XX:-GraalBailoutIsFatal -XX:+PrintCompilation -Xms1g -Xmx2g -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar Harness --preserve $*