changeset 19542:f98e2f0c35d8

Make GraphUtil#propagateKill more efficient.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 22 Feb 2015 23:12:31 +0100
parents c66037cb9cd1
children 353669a84287
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java
diffstat 2 files changed, 25 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Sun Feb 22 22:39:26 2015 +0100
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Sun Feb 22 23:12:31 2015 +0100
@@ -598,7 +598,8 @@
             assert !graph.isFrozen();
             NodeEventListener listener = graph.nodeEventListener;
             if (listener != null) {
-                listener.usagesDroppedToZero(node);
+                // System.out.println("usage dropped to zero: " + node);
+                // listener.usagesDroppedToZero(node);
             }
             if (Fingerprint.ENABLED) {
                 Fingerprint.submit("%s: %s", NodeEvent.ZERO_USAGES, node);
@@ -683,6 +684,10 @@
      */
     public void safeDelete() {
         assert checkDeletion();
+        unsafeDelete();
+    }
+
+    public void unsafeDelete() {
         unregisterInputs();
         unregisterSuccessors();
         graph.unregister(this);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Sun Feb 22 22:39:26 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Sun Feb 22 23:12:31 2015 +0100
@@ -61,6 +61,7 @@
                 killCFG(successor, tool);
             }
         }
+        node.replaceAtPredecessor(null);
         propagateKill(node);
     }
 
@@ -113,15 +114,25 @@
 
     public static void propagateKill(Node node) {
         if (node != null && node.isAlive()) {
-            List<Node> usagesSnapshot = node.usages().filter(isFloatingNode()).snapshot();
+            node.unsafeDelete();
+
+            for (Node in : node.inputs()) {
+                if (in.isAlive() && in.hasNoUsages() && !(in instanceof FixedNode)) {
+                    killWithUnusedFloatingInputs(in);
+                }
+            }
 
-            // null out remaining usages
-            node.replaceAtUsages(null);
-            node.replaceAtPredecessor(null);
-            killWithUnusedFloatingInputs(node);
-
-            for (Node usage : usagesSnapshot) {
-                if (!usage.isDeleted()) {
+            ArrayList<Node> usageToKill = null;
+            for (Node usage : node.usages()) {
+                if (usage.isAlive() && !(usage instanceof FixedNode)) {
+                    if (usageToKill == null) {
+                        usageToKill = new ArrayList<>();
+                    }
+                    usageToKill.add(usage);
+                }
+            }
+            if (usageToKill != null) {
+                for (Node usage : usageToKill) {
                     if (usage instanceof PhiNode) {
                         usage.replaceFirstInput(node, null);
                     } else {