diff graal/GraalCompiler/src/com/sun/c1x/ir/BlockBegin.java @ 2674:6ab73784566a

* BlockBegin.predecessors changed to List<BlockEnd> * Node: add input/successor with given back edge index, allows for explicit ordering of predecessors/usages * Graphviz: PDF output, option to omit FrameStates * runscimark.sh: forward additional options to JVM
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 13 May 2011 15:18:41 +0200
parents b2c1e959be46
children 0ea5f12e873a
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/BlockBegin.java	Fri May 13 11:19:25 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/BlockBegin.java	Fri May 13 15:18:41 2011 +0200
@@ -76,12 +76,12 @@
             if (old != null) {
                 // disconnect this block from its current successors
                 for (BlockBegin s : old.blockSuccessors()) {
-                    s.blockPredecessors().remove(this);
+                    s.blockPredecessors().remove(this.end());
                 }
             }
             successors().set(super.successorCount() + SUCCESSOR_END, end);
             for (BlockBegin s : end.blockSuccessors()) {
-                s.addPredecessor(this);
+                s.addPredecessor(end);
             }
         }
     }
@@ -120,7 +120,7 @@
     /**
      * The {@link BlockBegin} nodes for which this node is a successor.
      */
-    private final List<BlockBegin> predecessors;
+    private final List<BlockEnd> predecessors;
 
     private int depthFirstNumber;
     private int linearScanNumber;
@@ -145,7 +145,7 @@
         this.blockID = blockID;
         depthFirstNumber = -1;
         linearScanNumber = -1;
-        predecessors = new ArrayList<BlockBegin>(2);
+        predecessors = new ArrayList<BlockEnd>(2);
         loopIndex = -1;
         setBCI(bci);
     }
@@ -154,8 +154,9 @@
      * Gets the list of predecessors of this block.
      * @return the predecessor list
      */
-    public List<BlockBegin> blockPredecessors() {
-        return predecessors;
+    public List<BlockEnd> blockPredecessors() {
+//      return Collections.unmodifiableList(predecessors);
+      return predecessors;
     }
 
     /**
@@ -289,7 +290,9 @@
             closure.apply(block);
             queueBlocks(queue, block.exceptionHandlerBlocks(), mark);
             queueBlocks(queue, block.end().blockSuccessors(), mark);
-            queueBlocks(queue, predecessors ? block.predecessors : null, mark);
+            if (predecessors) {
+                queueBlockEnds(queue, block.predecessors, mark);
+            }
         }
     }
 
@@ -304,6 +307,18 @@
         }
     }
 
+    private void queueBlockEnds(LinkedList<BlockBegin> queue, List<BlockEnd> list, IdentityHashMap<BlockBegin, BlockBegin> mark) {
+        if (list != null) {
+            for (BlockEnd end : list) {
+                BlockBegin b = end.begin();
+                if (!mark.containsKey(b)) {
+                    queue.offer(b);
+                    mark.put(b, b);
+                }
+            }
+        }
+    }
+
     private void iterate(IdentityHashMap<BlockBegin, BlockBegin> mark, BlockClosure closure) {
         if (!mark.containsKey(this)) {
             mark.put(this, this);
@@ -359,7 +374,8 @@
      * Add a predecessor to this block.
      * @param pred the predecessor to add
      */
-    public void addPredecessor(BlockBegin pred) {
+    public void addPredecessor(BlockEnd pred) {
+        assert pred != null;
         predecessors.add(pred);
     }
 
@@ -367,7 +383,7 @@
      * Removes all occurrences of the specified block from the predecessor list of this block.
      * @param pred the predecessor to remove
      */
-    public void removePredecessor(BlockBegin pred) {
+    public void removePredecessor(BlockEnd pred) {
         while (predecessors.remove(pred)) {
             // the block may appear multiple times in the list
             // XXX: this is not very efficient, consider Util.removeAllFromList
@@ -603,6 +619,7 @@
      * @return the number of predecessors
      */
     public int numberOfPreds() {
+//        assert predecessors.size() == predecessors().size();
         return predecessors.size();
     }
 
@@ -644,7 +661,8 @@
         return exceptionHandlerBlocks.get(i);
     }
 
-    public BlockBegin predAt(int j) {
+    public BlockEnd predAt(int j) {
+//        assert predecessors.get(j) == predecessors().get(j);
         return predecessors.get(j);
     }
 
@@ -664,8 +682,9 @@
         lirBlock.lastLirInstructionID = lastLirInstructionId;
     }
 
-    public boolean isPredecessor(BlockBegin block) {
-        return this.predecessors.contains(block);
+    public boolean isPredecessor(BlockEnd block) {
+//        assert predecessors.contains(block) == predecessors().contains(block);
+        return predecessors.contains(block);
     }
 
     public void printWithoutPhis(LogStream out) {
@@ -721,8 +740,8 @@
         // print predecessors
         if (!blockPredecessors().isEmpty()) {
             out.print(" pred:");
-            for (BlockBegin pred : blockPredecessors()) {
-                out.print(" B").print(pred.blockID);
+            for (BlockEnd pred : blockPredecessors()) {
+                out.print(" B").print(pred.begin().blockID);
             }
         }
     }
@@ -849,4 +868,11 @@
         }
         return sb.toString();
     }
+
+    @Override
+    public String shortName() {
+        return "BlockBegin #" + blockID;
+    }
+
+
 }