changeset 5305:527ff42e0b26

In canonicalizer, when cleaning node with no usages, use a better definition of 'floating' node
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 26 Apr 2012 13:59:12 +0200
parents 6a7b16cc142d
children 654318af685d
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java
diffstat 2 files changed, 8 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java	Thu Apr 26 13:57:35 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java	Thu Apr 26 13:59:12 2012 +0200
@@ -129,8 +129,7 @@
         graph.stopTrackingInputChange();
         while (graph.getUsagesDroppedNodesCount() > 0) {
             for (Node n : graph.getAndCleanUsagesDroppedNodes()) {
-                if (!n.isDeleted() && n.usages().size() == 0 && n instanceof FloatingNode) {
-                    n.clearInputs();
+                if (!n.isDeleted() && n.usages().size() == 0 && GraphUtil.isFloatingNode().apply(n)) {
                     n.safeDelete();
                 }
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Thu Apr 26 13:57:35 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Thu Apr 26 13:59:12 2012 +0200
@@ -28,12 +28,15 @@
 
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.iterators.*;
+import com.oracle.graal.graph.iterators.NodePredicates.PositiveTypePredicate;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.virtual.*;
 
 public class GraphUtil {
 
+    private static final PositiveTypePredicate FLOATING = isA(FloatingNode.class).or(CallTargetNode.class).or(FrameState.class).or(VirtualObjectFieldNode.class).or(VirtualObjectNode.class);
+
     public static void killCFG(FixedNode node) {
         assert node.isAlive();
         if (node instanceof EndNode) {
@@ -83,7 +86,7 @@
     }
 
     public static NodePredicate isFloatingNode() {
-        return isA(FloatingNode.class).or(CallTargetNode.class).or(FrameState.class).or(VirtualObjectFieldNode.class).or(VirtualObjectNode.class);
+        return FLOATING;
     }
 
     public static void propagateKill(Node node) {
@@ -93,7 +96,7 @@
             // null out remaining usages
             node.replaceAtUsages(null);
             node.replaceAtPredecessors(null);
-            killUnusedFloatingInputs(node);
+            killWithUnusedFloatingInputs(node);
 
             for (Node usage : usagesSnapshot) {
                 if (!usage.isDeleted()) {
@@ -107,13 +110,13 @@
         }
     }
 
-    public static void killUnusedFloatingInputs(Node node) {
+    public static void killWithUnusedFloatingInputs(Node node) {
         List<Node> floatingInputs = node.inputs().filter(isFloatingNode()).snapshot();
         node.safeDelete();
 
         for (Node in : floatingInputs) {
             if (in.isAlive() && in.usages().isEmpty()) {
-                killUnusedFloatingInputs(in);
+                killWithUnusedFloatingInputs(in);
             }
         }
     }