changeset 3105:f14632d52ab3

Fix loop peeling exit values fixup
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Wed, 29 Jun 2011 12:23:13 +0200
parents f34c90b89f54
children d9fa4309f89e
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java
diffstat 5 files changed, 27 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Jun 28 19:54:51 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Wed Jun 29 12:23:13 2011 +0200
@@ -130,9 +130,9 @@
         }
         List<Loop> loops = null;
         try {
-            LoopUtil.computeLoops(graph);
+            loops = LoopUtil.computeLoops(graph);
         } catch (Throwable t) {
-
+            t.printStackTrace();
         }
 
         stream.println("  <nodes>");
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Jun 28 19:54:51 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Wed Jun 29 12:23:13 2011 +0200
@@ -38,14 +38,14 @@
     protected void run(Graph graph) {
         List<Loop> loops = LoopUtil.computeLoops(graph);
 
+        for (Loop loop : loops) {
+            LoopUtil.peelLoop(loop);
+        }
+        loops = LoopUtil.computeLoops(graph); // TODO (gd) avoid recomputing loops
+
 //        for (Loop loop : loops) {
-//            LoopUtil.peelLoop(loop);
+//            doLoopCounters(loop);
 //        }
-//        loops = LoopUtil.computeLoops(graph); // TODO (gd) avoid recomputing loops
-
-        for (Loop loop : loops) {
-            doLoopCounters(loop);
-        }
     }
 
     private void doLoopCounters(Loop loop) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Tue Jun 28 19:54:51 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Wed Jun 29 12:23:13 2011 +0200
@@ -24,7 +24,6 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.graph.*;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java	Tue Jun 28 19:54:51 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java	Wed Jun 29 12:23:13 2011 +0200
@@ -346,7 +346,7 @@
                         phiMap = graph.createNodeMap();
                         newExitValues.set(originalValue, phiMap);
                     }
-                    phiMap.set(oEnd, (Value) originalValue);
+                    phiMap.set(original, (Value) originalValue);
                     phiMap.set(nEnd, (Value) newValue);
 
                     phiMap = newExitValues.get(newValue);
@@ -354,7 +354,7 @@
                         phiMap = graph.createNodeMap();
                         newExitValues.set(newValue, phiMap);
                     }
-                    phiMap.set(oEnd, (Value) originalValue);
+                    phiMap.set(original, (Value) originalValue);
                     phiMap.set(nEnd, (Value) newValue);
                 }
             }
@@ -447,6 +447,7 @@
             private Value getValueAt(Node point, NodeMap<Value> valueMap, CiKind kind) {
                 Value value = valueMap.get(point);
                 if (value != null) {
+                    //System.out.println("getValueAt(" + point + ", valueMap, kind) = " + value);
                     return value;
                 }
                 Merge merge = (Merge) point;
@@ -468,10 +469,12 @@
                     for (EndNode end : merge.cfgPredecessors()) {
                         phi.addInput(getValueAt(colors.get(end), valueMap, kind));
                     }
+                    //System.out.println("getValueAt(" + point + ", valueMap, kind) = " + phi);
                     return phi;
                 } else {
                     assert v != null;
                     valueMap.set(point, v);
+                    //System.out.println("getValueAt(" + point + ", valueMap, kind) = " + v);
                     return v;
                 }
             }
@@ -481,6 +484,7 @@
             }
             @Override
             public void fixNode(Node node, Node color) {
+                //System.out.println("fixNode(" + node + ", " + color + ")");
                 for (int i = 0; i < node.inputs().size(); i++) {
                     Node input = node.inputs().get(i);
                     if (input == null || newExitValues.isNew(input)) {
@@ -489,9 +493,7 @@
                     NodeMap<Value> valueMap = newExitValues.get(input);
                     if (valueMap != null) {
                         Value replacement = getValueAt(color, valueMap, ((Value) input).kind);
-                        //if (!(replacement instanceof Phi && replacement == node)) { // handle the Phi that were created when merging loop exits
-                            node.inputs().set(i, replacement);
-                        //}
+                        node.inputs().set(i, replacement);
                     }
                 }
             }
@@ -526,6 +528,7 @@
 
         for (Node exit : loop.exits()) {
             if (marked.isMarked(exit.singlePredecessor())) {
+                //System.out.println("Exit : " + exit);
                 marked.mark(((Placeholder) exit).stateAfter());
                 Placeholder p = new Placeholder(graph);
                 replacements.put(exit, p);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Tue Jun 28 19:54:51 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Wed Jun 29 12:23:13 2011 +0200
@@ -480,9 +480,17 @@
 
     @Override
     public String toString() {
-        /*StringBuilder sb = new StringBuilder();
+        return super.toString();
+    }
+
+    public String toDetailedString() {
+        StringBuilder sb = new StringBuilder();
         String nl = String.format("%n");
-        sb.append("[bci: ").append(bci).append("]").append(nl);
+        sb.append("[bci: ").append(bci).append("]");
+        if (rethrowException()) {
+            sb.append(" rethrows Exception");
+        }
+        sb.append(nl);
         for (int i = 0; i < localsSize(); ++i) {
             Value value = localAt(i);
             sb.append(String.format("  local[%d] = %-8s : %s%n", i, value == null ? "bogus" : value.kind.javaName, value));
@@ -495,8 +503,7 @@
             Value value = lockAt(i);
             sb.append(String.format("  lock[%d] = %-8s : %s%n", i, value == null ? "bogus" : value.kind.javaName, value));
         }
-        return sb.toString();*/
-        return super.toString();
+        return sb.toString();
     }
 
     @Override