changeset 4619:a09b44a28e7f

clenup unused floating nodes on killCFG CheckCast nodes can be anchored to any fixed node add an assert to scheduling
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 16 Feb 2012 17:47:14 +0100
parents d8e84cf186a4
children bd8aca42516f
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/schedule/SchedulePhase.java graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java
diffstat 8 files changed, 44 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Thu Feb 16 17:47:14 2012 +0100
@@ -387,7 +387,11 @@
                 stateAfter = ((StateSplit) instr).stateAfter();
             }
             if (instr instanceof ValueNode) {
-                doRoot((ValueNode) instr);
+                try {
+                    doRoot((ValueNode) instr);
+                } catch (Throwable e) {
+                    throw new GraalInternalError(e).addContext(instr);
+                }
             }
             if (stateAfter != null) {
                 lastState = stateAfter;
@@ -402,7 +406,7 @@
         }
         if (block.numberOfSux() >= 1 && !endsWithJump(block)) {
             NodeSuccessorsIterable successors = block.getEndNode().successors();
-            assert successors.count() >= 1 : "should have at least one successor : " + block.getEndNode();
+            assert successors.isNotEmpty() : "should have at least one successor : " + block.getEndNode();
 
             emitJump(getLIRBlock((FixedNode) successors.first()), null);
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Thu Feb 16 17:47:14 2012 +0100
@@ -24,7 +24,6 @@
 
 import java.util.*;
 
-import com.oracle.max.cri.ci.*;
 import com.oracle.max.criutils.*;
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.phases.*;
@@ -102,6 +101,7 @@
         } else if (GraalOptions.ScheduleOutOfLoops && !(n instanceof VirtualObjectFieldNode) && !(n instanceof VirtualObjectNode)) {
             Block earliestBlock = earliestBlock(n);
             block = scheduleOutOfLoops(n, latestBlock, earliestBlock);
+            assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsisitant for " + n;
         } else {
             block = latestBlock;
         }
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/GraalInternalError.java	Thu Feb 16 17:47:14 2012 +0100
@@ -77,7 +77,7 @@
         StringBuilder str = new StringBuilder();
         str.append(super.toString());
         for (String s : context) {
-            str.append("\n\t\tat ").append(s);
+            str.append("\n\tat ").append(s);
         }
         return str.toString();
     }
--- a/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/Block.java	Thu Feb 16 17:47:14 2012 +0100
@@ -24,6 +24,7 @@
 
 import java.util.*;
 
+import com.oracle.max.graal.debug.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.lir.*;
 import com.oracle.max.graal.nodes.*;
@@ -196,4 +197,18 @@
         return getSuccessors().get(i);
     }
 // end to be inlined later on
+
+    public boolean dominates(Block block) {
+        return block.isDominatedBy(this);
+    }
+
+    public boolean isDominatedBy(Block block) {
+        if (block == this) {
+            return true;
+        }
+        if (dominator == null) {
+            return false;
+        }
+        return dominator.isDominatedBy(block);
+    }
 }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/LoopBeginNode.java	Thu Feb 16 17:47:14 2012 +0100
@@ -125,7 +125,7 @@
 
     @Override
     public boolean verify() {
-        assertTrue(loopEnds().count() > 0, "missing loopEnd");
+        assertTrue(loopEnds().isNotEmpty(), "missing loopEnd");
         assertTrue(forwardEndCount() == 1, "LoopBegin should only have one forward edge");
         return super.verify();
     }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/StructuredGraph.java	Thu Feb 16 17:47:14 2012 +0100
@@ -201,7 +201,6 @@
         }
         node.replaceAtPredecessors(next);
         node.safeDelete();
-        begin.safeDelete();
     }
 
     public void removeSplitPropagate(ControlSplitNode node, int survivingSuccessor) {
@@ -286,7 +285,7 @@
     }
 
     public void reduceDegenerateLoopBegin(LoopBeginNode begin) {
-        assert begin.loopEnds().count() == 0 : "Loop begin still has backedges";
+        assert begin.loopEnds().isEmpty() : "Loop begin still has backedges";
         if (begin.forwardEndCount() == 1) { // bypass merge and remove
             reduceTrivialMerge(begin);
         } else { // convert to merge
@@ -297,7 +296,7 @@
 
     public void reduceTrivialMerge(MergeNode merge) {
         assert merge.forwardEndCount() == 1;
-        assert !(merge instanceof LoopBeginNode) || ((LoopBeginNode) merge).loopEnds().count() == 0;
+        assert !(merge instanceof LoopBeginNode) || ((LoopBeginNode) merge).loopEnds().isEmpty();
         for (PhiNode phi : merge.phis().snapshot()) {
             assert phi.valueCount() == 1;
             ValueNode singleValue = phi.valueAt(0);
@@ -308,7 +307,7 @@
         FixedNode sux = merge.next();
         FrameState stateAfter = merge.stateAfter();
         merge.safeDelete();
-        if (stateAfter != null && stateAfter.usages().count() == 0) {
+        if (stateAfter != null && stateAfter.usages().isEmpty()) {
             stateAfter.safeDelete();
         }
         if (sux == null) {
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/java/CheckCastNode.java	Thu Feb 16 17:47:14 2012 +0100
@@ -37,9 +37,9 @@
  */
 public final class CheckCastNode extends TypeCheckNode implements Canonicalizable, LIRLowerable, Node.IterableNodeType {
 
-    @Input protected final AnchorNode anchor;
+    @Input protected final FixedNode anchor;
 
-    public AnchorNode anchor() {
+    public FixedNode anchor() {
         return anchor;
     }
 
@@ -50,11 +50,11 @@
      * @param targetClass the class being cast to
      * @param object the instruction producing the object
      */
-    public CheckCastNode(AnchorNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object) {
+    public CheckCastNode(FixedNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object) {
         this(anchor, targetClassInstruction, targetClass, object, EMPTY_HINTS, false);
     }
 
-    public CheckCastNode(AnchorNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object, RiResolvedType[] hints, boolean hintsExact) {
+    public CheckCastNode(FixedNode anchor, ValueNode targetClassInstruction, RiResolvedType targetClass, ValueNode object, RiResolvedType[] hints, boolean hintsExact) {
         super(targetClassInstruction, targetClass, object, hints, hintsExact, targetClass == null ? StampFactory.forKind(CiKind.Object) : StampFactory.declared(targetClass));
         this.anchor = anchor;
     }
--- a/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java	Thu Feb 16 14:53:04 2012 +0100
+++ b/graal/com.oracle.max.graal.nodes/src/com/oracle/max/graal/nodes/util/GraphUtil.java	Thu Feb 16 17:47:14 2012 +0100
@@ -63,14 +63,13 @@
             FixedNode next = begin.next();
             begin.safeDelete();
             killCFG(next);
-        } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().count() == 0) { // not a loop anymore
+        } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not a loop anymore
             ((StructuredGraph) end.graph()).reduceDegenerateLoopBegin((LoopBeginNode) merge);
         } else if (merge.phiPredecessorCount() == 1) { // not a merge anymore
             ((StructuredGraph) end.graph()).reduceTrivialMerge(merge);
         }
     }
 
-    // TODO(tw): Factor this code with other branch deletion code.
     public static void propagateKill(Node node) {
         if (node != null && node.isAlive()) {
             List<Node> usagesSnapshot = node.usages().filter(isA(FloatingNode.class).or(CallTargetNode.class)).snapshot();
@@ -78,7 +77,7 @@
             // null out remaining usages
             node.replaceAtUsages(null);
             node.replaceAtPredecessors(null);
-            node.safeDelete();
+            killUnusedFloatingInputs(node);
 
             for (Node usage : usagesSnapshot) {
                 if (!usage.isDeleted()) {
@@ -91,4 +90,15 @@
             }
         }
     }
+
+    public static void killUnusedFloatingInputs(Node node) {
+        List<FloatingNode> floatingInputs = node.inputs().filter(FloatingNode.class).snapshot();
+        node.safeDelete();
+
+        for (FloatingNode in : floatingInputs) {
+            if (in.usages().isEmpty()) {
+                killUnusedFloatingInputs(in);
+            }
+        }
+    }
 }