Mercurial > hg > truffle
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 {