# HG changeset patch # User Thomas Wuerthinger # Date 1424643151 -3600 # Node ID f98e2f0c35d85c4323c22e7e159130aa5cfe2424 # Parent c66037cb9cd1eeb7a5d7f88d5cdc0a3bc71bca21 Make GraphUtil#propagateKill more efficient. diff -r c66037cb9cd1 -r f98e2f0c35d8 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- 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); diff -r c66037cb9cd1 -r f98e2f0c35d8 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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 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 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 {