hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java
--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java Mon Dec 12 16:16:27 2016 +0300
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java Wed Mar 22 13:42:45 2017 -0700
@@ -48,6 +48,7 @@
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.calc.FloatingNode;
import org.graalvm.compiler.nodes.util.GraphUtil;
+import org.graalvm.compiler.options.OptionValues;
import org.graalvm.compiler.phases.BasePhase;
import org.graalvm.compiler.phases.Phase;
import org.graalvm.compiler.phases.tiers.PhaseContext;
@@ -68,6 +69,7 @@
private static final DebugCounter COUNTER_SIMPLIFICATION_CONSIDERED_NODES = Debug.counter("SimplificationConsideredNodes");
private static final DebugCounter COUNTER_GLOBAL_VALUE_NUMBERING_HITS = Debug.counter("GlobalValueNumberingHits");
+ private boolean globalValueNumber = true;
private boolean canonicalizeReads = true;
private boolean simplify = true;
private final CustomCanonicalizer customCanonicalizer;
@@ -91,6 +93,10 @@
this.customCanonicalizer = customCanonicalizer;
}
+ public void disableGVN() {
+ globalValueNumber = false;
+ }
+
public void disableReadCanonicalization() {
canonicalizeReads = false;
}
@@ -185,7 +191,7 @@
if (!wholeGraph) {
workList.addAll(graph.getNewNodes(newNodesMark));
}
- tool = new Tool(graph.getAssumptions());
+ tool = new Tool(graph.getAssumptions(), graph.getOptions());
processWorkSet(graph);
}
@@ -231,24 +237,18 @@
if (!node.isAlive()) {
return false;
}
- if (node instanceof FloatingNode && node.hasNoUsages()) {
- // Dead but on the worklist so simply kill it
- GraphUtil.killWithUnusedFloatingInputs(node);
- return false;
- }
COUNTER_PROCESSED_NODES.increment();
-
- NodeClass<?> nodeClass = node.getNodeClass();
- if (tryGlobalValueNumbering(node, nodeClass)) {
- return true;
- }
- StructuredGraph graph = (StructuredGraph) node.graph();
if (GraphUtil.tryKillUnused(node)) {
return true;
}
+ NodeClass<?> nodeClass = node.getNodeClass();
+ StructuredGraph graph = (StructuredGraph) node.graph();
if (tryCanonicalize(node, nodeClass)) {
return true;
}
+ if (globalValueNumber && tryGlobalValueNumbering(node, nodeClass)) {
+ return true;
+ }
if (node instanceof ValueNode) {
ValueNode valueNode = (ValueNode) node;
boolean improvedStamp = tryInferStamp(valueNode);
@@ -372,7 +372,7 @@
(canonical.predecessor() != null || canonical instanceof StartNode || canonical instanceof AbstractMergeNode) : node +
" -> " + canonical + " : replacement should be floating or fixed and connected";
node.replaceAtUsages(canonical);
- GraphUtil.killWithUnusedFloatingInputs(node);
+ GraphUtil.killWithUnusedFloatingInputs(node, true);
} else {
assert node instanceof FixedNode && node.predecessor() != null : node + " -> " + canonical + " : node should be fixed & connected (" + node.predecessor() + ")";
FixedNode fixed = (FixedNode) node;
@@ -437,9 +437,11 @@
private final class Tool implements SimplifierTool {
private final Assumptions assumptions;
+ private final OptionValues options;
- Tool(Assumptions assumptions) {
+ Tool(Assumptions assumptions, OptionValues options) {
this.assumptions = assumptions;
+ this.options = options;
}
@Override
@@ -498,6 +500,11 @@
public boolean supportSubwordCompare(int bits) {
return context.getLowerer().supportSubwordCompare(bits);
}
+
+ @Override
+ public OptionValues getOptions() {
+ return options;
+ }
}
}