# HG changeset patch # User Gilles Duboscq # Date 1341324664 -7200 # Node ID 3842904e46c2399c7345050a1a9601034a3b73cc # Parent 17d2c3b727627bc75ade37cf60ef169f3c56f4ab Kill unused floating nodes in Canonicalizer diff -r 17d2c3b72762 -r 3842904e46c2 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 Tue Jul 03 15:00:23 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java Tue Jul 03 16:11:04 2012 +0200 @@ -97,14 +97,6 @@ } tool = new Tool(workList, runtime, target, assumptions, immutabilityPredicate); processWorkSet(graph); - - while (graph.getUsagesDroppedNodesCount() > 0) { - for (Node n : graph.getAndCleanUsagesDroppedNodes()) { - if (!n.isDeleted() && n.usages().size() == 0 && GraphUtil.isFloatingNode().apply(n)) { - n.safeDelete(); - } - } - } } public interface IsImmutablePredicate { @@ -140,6 +132,7 @@ int mark = graph.getMark(); tryCanonicalize(node, graph, tool); tryInferStamp(node, graph); + tryKillUnused(node); for (Node newNode : graph.getNewNodes(mark)) { workList.add(newNode); @@ -147,6 +140,12 @@ } } + private static void tryKillUnused(Node node) { + if (node.isAlive() && GraphUtil.isFloatingNode().apply(node) && node.usages().isEmpty()) { + GraphUtil.killWithUnusedFloatingInputs(node); + } + } + public static boolean tryGlobalValueNumbering(Node node, StructuredGraph graph) { if (node.getNodeClass().valueNumberable()) { Node newNode = graph.findDuplicate(node); diff -r 17d2c3b72762 -r 3842904e46c2 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Tue Jul 03 15:00:23 2012 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java Tue Jul 03 16:11:04 2012 +0200 @@ -47,7 +47,6 @@ private int deletedNodeCount; private GraphEventLog eventLog; - ArrayList usagesDropped = new ArrayList<>(); InputChangedListener inputChanged; private final HashMap cachedNodes = new HashMap<>(); @@ -149,16 +148,6 @@ return node; } - public int getUsagesDroppedNodesCount() { - return usagesDropped.size(); - } - - public List getAndCleanUsagesDroppedNodes() { - ArrayList result = usagesDropped; - usagesDropped = new ArrayList<>(); - return result; - } - public interface InputChangedListener { void inputChanged(Node node); } diff -r 17d2c3b72762 -r 3842904e46c2 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 Tue Jul 03 15:00:23 2012 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Tue Jul 03 16:11:04 2012 +0200 @@ -279,9 +279,6 @@ private boolean removeThisFromUsages(Node n) { if (n.usages.remove(this)) { - if (n.usages.size() == 0) { - graph.usagesDropped.add(n); - } return true; } else { return false; diff -r 17d2c3b72762 -r 3842904e46c2 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 Tue Jul 03 15:00:23 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Tue Jul 03 16:11:04 2012 +0200 @@ -22,21 +22,24 @@ */ package com.oracle.graal.nodes.util; -import static com.oracle.graal.graph.iterators.NodePredicates.*; - import java.util.*; import com.oracle.graal.api.meta.*; 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.java.*; public class GraphUtil { - private static final PositiveTypePredicate FLOATING = isA(FloatingNode.class).or(VirtualState.class).or(CallTargetNode.class); + private static final NodePredicate FLOATING = new NodePredicate() { + @Override + public final boolean apply(Node n) { + //isA(FloatingNode.class).or(VirtualState.class).or(CallTargetNode.class) + return n instanceof FloatingNode || n instanceof VirtualState || n instanceof CallTargetNode; + } + }; public static void killCFG(FixedNode node) { assert node.isAlive();