Mercurial > hg > truffle
changeset 5806:3842904e46c2
Kill unused floating nodes in Canonicalizer
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 03 Jul 2012 16:11:04 +0200 |
parents | 17d2c3b72762 |
children | ac2970c9ebdf |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/CanonicalizerPhase.java graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Graph.java 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 | 4 files changed, 14 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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<Node> usagesDropped = new ArrayList<>(); InputChangedListener inputChanged; private final HashMap<CacheEntry, Node> cachedNodes = new HashMap<>(); @@ -149,16 +148,6 @@ return node; } - public int getUsagesDroppedNodesCount() { - return usagesDropped.size(); - } - - public List<Node> getAndCleanUsagesDroppedNodes() { - ArrayList<Node> result = usagesDropped; - usagesDropped = new ArrayList<>(); - return result; - } - public interface InputChangedListener { void inputChanged(Node node); }
--- 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;
--- 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();