hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java
changeset 46344 694c102fd8ed
parent 43972 1ade39b8381b
child 46371 0337d0617e7b
--- 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;
+            }
         }
     }