# HG changeset patch # User Gilles Duboscq # Date 1335441552 -7200 # Node ID 527ff42e0b26de5ae357834957dddc533b916ec9 # Parent 6a7b16cc142d1673fc59d328471a26d3f6d5a914 In canonicalizer, when cleaning node with no usages, use a better definition of 'floating' node diff -r 6a7b16cc142d -r 527ff42e0b26 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java --- 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(); } } diff -r 6a7b16cc142d -r 527ff42e0b26 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 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 floatingInputs = node.inputs().filter(isFloatingNode()).snapshot(); node.safeDelete(); for (Node in : floatingInputs) { if (in.isAlive() && in.usages().isEmpty()) { - killUnusedFloatingInputs(in); + killWithUnusedFloatingInputs(in); } } }