changeset 2951:0c0e407faa39

another fix to debug info (on-stack parameters), DCE removes unnecessary merges and LoopBegins whose LoopEnd went away
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 14 Jun 2011 16:47:31 +0200
parents 8b2953f6d325
children ec86f14be4cf
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/ir/Deoptimize.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalVMExits.cpp
diffstat 10 files changed, 64 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Jun 14 16:47:31 2011 +0200
@@ -173,7 +173,7 @@
             }
             for (Entry<Object, Object> entry : props.entrySet()) {
                 String key = entry.getKey().toString();
-                String value = entry.getValue().toString();
+                String value = entry.getValue() == null ? "null" : entry.getValue().toString();
                 stream.printf("    <p name='%s'>%s</p>%n", escape(key), escape(value));
             }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java	Tue Jun 14 16:47:31 2011 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.max.graal.compiler.ir;
 
+import java.util.*;
+
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -75,6 +77,14 @@
     }
 
     @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("message", message);
+        properties.put("action", action);
+        return properties;
+    }
+
+    @Override
     public Node copy(Graph into) {
         Deoptimize x = new Deoptimize(action, into);
         x.setMessage(message);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java	Tue Jun 14 16:47:31 2011 +0200
@@ -127,7 +127,7 @@
         @Override
         public Node lower(Node n, LoweringTool tool) {
             LoadField field = (LoadField) n;
-            return null;//field.field().createLoad(tool);
+            return null; //field.field().createLoad(tool);
         }
 
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java	Tue Jun 14 16:47:31 2011 +0200
@@ -43,7 +43,7 @@
                 }
             }
         }
-        assert false : "Begin should always have a LoopEnd";
+        assert false : "LoopBegin should always have a LoopEnd";
         return null;
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Jun 14 16:47:31 2011 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.max.graal.compiler.phases;
 
+import java.util.*;
+
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.gen.*;
 import com.oracle.max.graal.compiler.ir.*;
@@ -32,38 +34,42 @@
 
     private NodeFlood flood;
     private Graph graph;
+    private ArrayList<LoopBegin> brokenLoops;
 
     @Override
     protected void run(Graph graph) {
         this.graph = graph;
         this.flood = graph.createNodeFlood();
+        this.brokenLoops = new ArrayList<LoopBegin>();
 
         // remove chained Merges
-//        for (Merge merge : graph.getNodes(Merge.class)) {
-//            if (merge.predecessors().size() == 1 && merge.usages().size() == 0) {
-//                if (merge.successors().get(0) instanceof Merge) {
-//                    Node pred = merge.predecessors().get(0);
-//                    int predIndex = merge.predecessorsIndex().get(0);
-//                    pred.successors().setAndClear(predIndex, merge, 0);
-//                    merge.delete();
-//                }
-//            }
-//        }
-//        Node startSuccessor = graph.start().successors().get(0);
-//        if (startSuccessor instanceof Merge) {
-//            Merge startMerge = (Merge) startSuccessor;
-//            if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) {
-//                int predIndex = startMerge.predecessorsIndex().get(0);
-//                graph.start().successors().setAndClear(predIndex, startMerge, 0);
-//                startMerge.delete();
-//            }
-//        }
+        for (Merge merge : graph.getNodes(Merge.class)) {
+            if (merge.predecessors().size() == 1 && merge.usages().size() == 0) {
+                if (merge.successors().get(0) instanceof Merge) {
+                    Node pred = merge.predecessors().get(0);
+                    int predIndex = merge.predecessorsIndex().get(0);
+                    pred.successors().setAndClear(predIndex, merge, 0);
+                    merge.delete();
+                }
+            }
+        }
+        Node startSuccessor = graph.start().successors().get(0);
+        if (startSuccessor instanceof Merge) {
+            Merge startMerge = (Merge) startSuccessor;
+            if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) {
+                int predIndex = startMerge.predecessorsIndex().get(0);
+                graph.start().successors().setAndClear(predIndex, startMerge, 0);
+                startMerge.delete();
+            }
+        }
 
         flood.add(graph.start());
 
         iterateSuccessors();
         disconnectCFGNodes();
 
+        deleteBrokenLoops();
+
         iterateInputs();
         disconnectNonCFGNodes();
 
@@ -72,6 +78,7 @@
 
         new PhiSimplifier(graph);
 
+
         if (GraalOptions.TraceDeadCodeElimination) {
             System.out.printf("dead code elimination finished\n");
         }
@@ -92,6 +99,9 @@
     private void disconnectCFGNodes() {
         for (Node node : graph.getNodes()) {
             if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) {
+                if (node instanceof LoopEnd) {
+                    brokenLoops.add(((LoopEnd) node).loopBegin());
+                }
                 // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct
                 for (int i = node.successors().size() - 1; i >= 0; i--) {
                     Node successor = node.successors().get(i);
@@ -107,6 +117,21 @@
         }
     }
 
+    private void deleteBrokenLoops() {
+        for (LoopBegin loop : brokenLoops) {
+            assert loop.predecessors().size() == 1;
+            for (Node usage : new ArrayList<Node>(loop.usages())) {
+                assert usage instanceof Phi;
+                usage.replace(((Phi) usage).valueAt(0));
+            }
+
+            Node pred = loop.predecessors().get(0);
+            int predIndex = loop.predecessorsIndex().get(0);
+            pred.successors().setAndClear(predIndex, loop, 0);
+            loop.delete();
+        }
+    }
+
     private void deleteCFGNodes() {
         for (Node node : graph.getNodes()) {
             if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Jun 14 16:47:31 2011 +0200
@@ -923,7 +923,9 @@
     private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) {
         CiKind resultType = returnKind(target);
         if (GraalOptions.DeoptALot) {
-            append(new Deoptimize(DeoptAction.None, graph));
+            Deoptimize deoptimize = new Deoptimize(DeoptAction.None, graph);
+            deoptimize.setMessage("invoke " + target.name());
+            append(deoptimize);
             frameState.pushReturn(resultType, Constant.defaultForKind(resultType, graph));
         } else {
             Invoke invoke = new Invoke(bci(), opcode, resultType.stackKind(), args, target, target.signature().returnType(method.holder()), method.typeProfile(bci()), graph);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Tue Jun 14 16:47:31 2011 +0200
@@ -221,7 +221,7 @@
                 }
             } else {
                 Block dominatorBlock = b.getPredecessors().get(0);
-                for (int i=1; i<b.getPredecessors().size(); ++i) {
+                for (int i = 1; i < b.getPredecessors().size(); ++i) {
                     dominatorBlock = getCommonDominator(dominatorBlock, b.getPredecessors().get(i));
                 }
                 CiBitMap blockMap = new CiBitMap(blocks.size());
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Tue Jun 14 11:03:14 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Tue Jun 14 16:47:31 2011 +0200
@@ -65,7 +65,7 @@
         check(node);
         bitMap.clear(node.id());
     }
-    
+
     public void clearAll() {
         bitMap.clearAll();
     }
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Tue Jun 14 11:03:14 2011 +0200
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Tue Jun 14 16:47:31 2011 +0200
@@ -156,8 +156,7 @@
     if (index >= 0) {
       value = new LocationValue(Location::new_stk_loc(locationType, index * HeapWordSize));
     } else {
-      int frame_size_bytes = frame_size + 2 * HeapWordSize;
-      value = new LocationValue(Location::new_stk_loc(locationType, -(index * HeapWordSize) + frame_size_bytes));
+      value = new LocationValue(Location::new_stk_loc(locationType, -(index * HeapWordSize) + frame_size));
     }
     if (type == T_DOUBLE || type == T_LONG) {
       second = value;
--- a/src/share/vm/graal/graalVMExits.cpp	Tue Jun 14 11:03:14 2011 +0200
+++ b/src/share/vm/graal/graalVMExits.cpp	Tue Jun 14 16:47:31 2011 +0200
@@ -113,6 +113,7 @@
 }
 
 void VMExits::shutdownCompiler() {
+  HandleMark hm;
   JavaThread* THREAD = JavaThread::current();
   JavaValue result(T_VOID);
   JavaCallArguments args;