changeset 2946:0d103e2a38e5

More work on lowering phase.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 09 Jun 2011 19:39:03 +0200
parents 41318fcb6b56
children e86e83c5adbc
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/SplitCriticalEdgesPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java runfop.sh
diffstat 6 files changed, 36 insertions(+), 177 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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);
     }
 }
--- 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<Node> javaBlockNodes = graph.createNodeMap();
-        NodeMap<Node> 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<Node> javaBlockNodes, NodeMap<Node> 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<Node> visitedNodesList = new ArrayList<Node>();
-                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<Node> javaBlockNodes, NodeMap<Node> 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<Node> javaBlockNodes, NodeMap<Node> 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);
     }
 }
--- 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);
                     }
                 }
--- 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<Node> 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;
--- 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