# HG changeset patch # User Thomas Wuerthinger # Date 1307641143 -7200 # Node ID 0d103e2a38e522c0135a807cc6994a4c5af36190 # Parent 41318fcb6b5694dac8184e5c42dd30fff2684725 More work on lowering phase. diff -r 41318fcb6b56 -r 0d103e2a38e5 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 Jun 09 18:59:28 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 09 19:39:03 2011 +0200 @@ -272,7 +272,7 @@ } private static boolean jumpsToNextBlock(Node node) { - return node instanceof BlockEnd; + return node instanceof BlockEnd || node instanceof Anchor; } @Override @@ -435,7 +435,7 @@ // describing the state at the safepoint. moveToPhi(); - lir.jump(getLIRBlock(x.defaultSuccessor())); + lir.jump(getLIRBlock(x.next())); } @Override diff -r 41318fcb6b56 -r 0d103e2a38e5 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java Thu Jun 09 18:59:28 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java Thu Jun 09 19:39:03 2011 +0200 @@ -29,7 +29,7 @@ /** * The {@code Anchor} instruction represents the end of a block with an unconditional jump to another block. */ -public final class Anchor extends BlockEnd { +public final class Anchor extends Instruction { private static final int INPUT_COUNT = 0; private static final int SUCCESSOR_COUNT = 0; @@ -39,7 +39,7 @@ * @param graph */ public Anchor(Graph graph) { - super(CiKind.Illegal, 1, INPUT_COUNT, SUCCESSOR_COUNT, graph); + super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); } @Override @@ -49,12 +49,11 @@ @Override public void print(LogStream out) { - out.print("anchor ").print(defaultSuccessor()); + out.print("anchor ").print(next()); } @Override public Node copy(Graph into) { - Anchor x = new Anchor(into); - return x; + return new Anchor(into); } } diff -r 41318fcb6b56 -r 0d103e2a38e5 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Thu Jun 09 18:59:28 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Thu Jun 09 19:39:03 2011 +0200 @@ -32,136 +32,48 @@ public class LoweringPhase extends Phase { @Override - protected void run(Graph graph) { - IdentifyBlocksPhase s = new IdentifyBlocksPhase(false); + protected void run(final Graph graph) { + final IdentifyBlocksPhase s = new IdentifyBlocksPhase(false); s.apply(graph); // for (Block b : s.getBlocks()) { // TTY.println("Java block for block " + b.blockID() + " is " + b.javaBlock().blockID()); // } - NodeMap javaBlockNodes = graph.createNodeMap(); - NodeMap dominators = graph.createNodeMap(); - for (Node n : graph.getNodes()) { - if (IdentifyBlocksPhase.isFixed(n)) { - //LoweringOp op = n.lookup(LoweringOp.class); - //if (op != null) { - Node javaBlockNode = getJavaBlockNode(javaBlockNodes, dominators, n); - //TTY.println("Java block node for " + n.id() + " is " + ((javaBlockNode == null) ? "null" : javaBlockNode.id())); - //} + for (final Node n : graph.getNodes()) { + if (n instanceof FixedNode) { + LoweringOp op = n.lookup(LoweringOp.class); + if (op != null) { + op.lower(n, new LoweringTool() { + @Override + public Node createStructuredBlockAnchor() { + Block block = s.getNodeToBlock().get(n); + Block javaBlock = block.javaBlock(); + Node first = javaBlock.firstNode(); + if (!(first instanceof Anchor) && !(first instanceof Merge)) { + Anchor a = new Anchor(graph); + assert first.predecessors().size() == 1; + Node pred = first.predecessors().get(0); + int predIndex = first.predecessorsIndex().get(0); + a.successors().setAndClear(Instruction.SUCCESSOR_NEXT, pred, predIndex); + pred.successors().set(predIndex, a); + javaBlock.setFirstNode(a); + } + return javaBlock.firstNode(); + } + }); + } } } } - private Node getJavaBlockNode(NodeMap javaBlockNodes, NodeMap dominators, final Node n) { - assert IdentifyBlocksPhase.isFixed(n); - if (n == n.graph().start()) { - return null; - } - - if (javaBlockNodes.get(n) == null) { - - Node truePred = null; - int count = 0; - for (Node pred : n.predecessors()) { - if (pred instanceof FixedNode || pred == n.graph().start()) { - truePred = pred; - count++; - } - } - - assert count > 0 : n + "; " + IdentifyBlocksPhase.isFixed(n); - if (count == 1) { - if (IdentifyBlocksPhase.trueSuccessorCount(truePred) == 1) { - javaBlockNodes.set(n, getJavaBlockNode(javaBlockNodes, dominators, truePred)); - } else { - // Single predecessor is a split => this is our Java block node. - javaBlockNodes.set(n, truePred); - } - } else { - Node dominator = null; - for (Node pred : n.predecessors()) { - if (IdentifyBlocksPhase.isFixed(pred)) { - dominator = getCommonDominator(javaBlockNodes, dominators, dominator, pred); - } - } - - final Node finalDominator = dominator; - final List visitedNodesList = new ArrayList(); - NodeBitMap visitedNodes = NodeIterator.iterate(EdgeType.PREDECESSORS, n, null, new NodeVisitor() { - @Override - public boolean visit(Node curNode) { - if((curNode instanceof FixedNode) || finalDominator != curNode) { - visitedNodesList.add(curNode); - return true; - } - return false; - } - }); - - visitedNodes.mark(finalDominator); - visitedNodesList.add(finalDominator); - - Node result = getJavaBlockNode(javaBlockNodes, dominators, finalDominator); - L1: for (Node curNode : visitedNodesList) { - if (curNode != n) { - for (Node succ : curNode.successors()) { - if (succ instanceof FixedNode && !visitedNodes.isMarked(succ)) { - result = n; - break L1; - } - } - } - } - - if (result != finalDominator) { - dominators.set(n, finalDominator); - } - javaBlockNodes.set(n, result); - } - } - - return javaBlockNodes.get(n); - } - - private Node getCommonDominator(NodeMap javaBlockNodes, NodeMap dominators, Node a, Node b) { - if (a == null) { - return b; - } - - if (b == null) { - return a; - } - - NodeBitMap visitedNodes = a.graph().createNodeBitMap(); - Node cur = a; - while (cur != null) { - visitedNodes.mark(cur); - cur = getDominator(javaBlockNodes, dominators, cur); - } - - cur = b; - while (cur != null) { - if (visitedNodes.isMarked(cur)) { - return cur; - } - cur = getDominator(javaBlockNodes, dominators, cur); - } - - throw new IllegalStateException("no common dominator between " + a + " and " + b); - } - - private Node getDominator(NodeMap javaBlockNodes, NodeMap dominators, Node cur) { - Node n = getJavaBlockNode(javaBlockNodes, dominators, cur); - if (dominators.get(cur) != null) { - return dominators.get(cur); - } - return n; + public interface LoweringTool { + Node createStructuredBlockAnchor(); } public interface LoweringOp extends Op { - Node lower(Node node); + void lower(Node n, LoweringTool tool); } } diff -r 41318fcb6b56 -r 0d103e2a38e5 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/SplitCriticalEdgesPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/SplitCriticalEdgesPhase.java Thu Jun 09 18:59:28 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/SplitCriticalEdgesPhase.java Thu Jun 09 19:39:03 2011 +0200 @@ -41,7 +41,7 @@ Node succ = n.successors().get(j); if (IdentifyBlocksPhase.truePredecessorCount(succ) > 1) { Anchor a = new Anchor(graph); - a.successors().setAndClear(1, n, j); + a.successors().setAndClear(Instruction.SUCCESSOR_NEXT, n, j); n.successors().set(j, a); } } diff -r 41318fcb6b56 -r 0d103e2a38e5 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 Thu Jun 09 18:59:28 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 09 19:39:03 2011 +0200 @@ -199,8 +199,6 @@ } else { computeJavaBlocks(); } - - //print(); } private void computeJavaBlocks() { @@ -351,13 +349,7 @@ addToSorting(b, i, sortedInstructions, map); } addToSorting(b, b.lastNode(), sortedInstructions, map); - //assert b.firstNode() == sortedInstructions.get(0) : b.firstNode(); - // assert b.lastNode() == sortedInstructions.get(sortedInstructions.size() - 1); b.setInstructions(sortedInstructions); -// TTY.println("Block " + b); -// for (Node n : sortedInstructions) { -// TTY.println("Node: " + n); -// } } private void addToSorting(Block b, Node i, List sortedInstructions, NodeBitMap map) { @@ -454,50 +446,6 @@ throw new IllegalStateException("no common dominator between " + a + " and " + b); } - private void print() { - TTY.println("============================================"); - TTY.println("%d blocks", blocks.size()); - - for (Block b : blocks) { - TTY.println(); - TTY.print(b.toString()); - - TTY.print(" succs="); - for (Block succ : b.getSuccessors()) { - TTY.print(succ + ";"); - } - - TTY.print(" preds="); - for (Block pred : b.getPredecessors()) { - TTY.print(pred + ";"); - } - - if (b.dominator() != null) { - TTY.print(" dom=" + b.dominator()); - } - TTY.println(); - - if (b.getInstructions().size() > 0) { - TTY.print("first instr: " + b.getInstructions().get(0)); - TTY.print("last instr: " + b.getInstructions().get(b.getInstructions().size() - 1)); - } - } - -/* - TTY.println("============================================"); - TTY.println("%d nodes", nodeToBlock.size()); - for (Node n : graph.getNodes()) { - if (n != null) { - TTY.print("Node %d: %s", n.id(), n.getClass().toString()); - Block curBlock = nodeToBlock.get(n); - if (curBlock != null) { - TTY.print(" %s", curBlock); - } - TTY.println(); - } - }*/ - } - public static int trueSuccessorCount(Node n) { if (n == null) { return 0; diff -r 41318fcb6b56 -r 0d103e2a38e5 runfop.sh --- a/runfop.sh Thu Jun 09 18:59:28 2011 +0200 +++ b/runfop.sh Thu Jun 09 19:39:03 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 -XX:-GraalBailoutIsFatal -XX:+PrintCompilation -Xms1g -Xmx2g -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar $* Harness --preserve fop +${JDK7}/bin/java -client -d64 -graal -Xms1g -Xmx2g -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar $* Harness --preserve fop