Mercurial > hg > truffle
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); } } }