# HG changeset patch # User Doug Simon # Date 1410204198 -7200 # Node ID 37d6d174bc40027f259c2237e57ea3ad201f88b0 # Parent 3c54a098455f6b396c970eb8bc427b0c1023c608 denote certain applications of DeadCodeEliminationPhase as optional and only run them if -G:-ReduceDCE diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Sep 08 21:23:18 2014 +0200 @@ -25,6 +25,7 @@ import static com.oracle.graal.compiler.GraalCompiler.Options.*; import static com.oracle.graal.compiler.MethodFilter.*; import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import java.util.*; @@ -167,7 +168,7 @@ HighTierContext highTierContext = new HighTierContext(providers, assumptions, cache, graphBuilderSuite, optimisticOpts); if (graph.start().next() == null) { graphBuilderSuite.apply(graph, highTierContext); - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); } else { Debug.dump(graph, "initial state"); } diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java Mon Sep 08 21:23:18 2014 +0200 @@ -24,12 +24,14 @@ import static com.oracle.graal.compiler.common.GraalOptions.*; import static com.oracle.graal.compiler.phases.HighTier.Options.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; + import com.oracle.graal.loop.phases.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.options.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; -import com.oracle.graal.phases.common.cfs.IterativeFlowSensitiveReductionPhase; +import com.oracle.graal.phases.common.cfs.*; import com.oracle.graal.phases.common.inlining.*; import com.oracle.graal.phases.tiers.*; import com.oracle.graal.virtual.phases.ea.*; @@ -56,7 +58,7 @@ appendPhase(new IterativeInliningPhase(canonicalizer)); } else { appendPhase(new InliningPhase(canonicalizer)); - appendPhase(new DeadCodeEliminationPhase()); + appendPhase(new DeadCodeEliminationPhase(OPTIONAL)); boolean reduceOrEliminate = FlowSensitiveReduction.getValue() || ConditionalElimination.getValue(); if (reduceOrEliminate && OptCanonicalizer.getValue()) { diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java Mon Sep 08 21:23:18 2014 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.compiler.phases; import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.options.*; @@ -63,6 +64,6 @@ appendPhase(new UseTrappingNullChecksPhase()); - appendPhase(new DeadCodeEliminationPhase()); + appendPhase(new DeadCodeEliminationPhase(REQUIRED)); } } diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java Mon Sep 08 21:23:18 2014 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.hotspot.phases; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.debug.*; @@ -109,6 +111,6 @@ GraphUtil.killCFG(start); Debug.dump(graph, "OnStackReplacement result"); - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); } } diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Mon Sep 08 21:23:18 2014 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.phases.common; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; + import java.util.*; import com.oracle.graal.api.meta.*; @@ -101,7 +103,7 @@ } } - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); } private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph) { diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeadCodeEliminationPhase.java Mon Sep 08 21:23:18 2014 +0200 @@ -22,18 +22,54 @@ */ package com.oracle.graal.phases.common; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Options.*; + import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.options.*; import com.oracle.graal.phases.*; public class DeadCodeEliminationPhase extends Phase { + public static class Options { + // @formatter:off + @Option(help = "Disable optional dead code eliminations") + public static final OptionValue ReduceDCE = new OptionValue<>(true); + // @formatter:on + } + // Metrics private static final DebugMetric metricNodesRemoved = Debug.metric("NodesRemoved"); + public enum Optionality { + OPTIONAL, + REQUIRED; + } + + /** + * Creates a dead code elimination phase that will be run irrespective of + * {@link Options#ReduceDCE}. + */ + public DeadCodeEliminationPhase() { + this(Optionality.REQUIRED); + } + + /** + * Creates a dead code elimination phase that will be run only if it is + * {@linkplain Optionality#REQUIRED non-optional} or {@link Options#ReduceDCE} is false. + */ + public DeadCodeEliminationPhase(Optionality optionality) { + this.optional = optionality == Optionality.OPTIONAL; + } + + private final boolean optional; + @Override public void run(StructuredGraph graph) { + if (optional && ReduceDCE.getValue()) { + return; + } NodeFlood flood = graph.createNodeFlood(); flood.add(graph.start()); diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java Mon Sep 08 21:23:18 2014 +0200 @@ -22,24 +22,23 @@ */ package com.oracle.graal.phases.common.cfs; +import static com.oracle.graal.api.meta.DeoptimizationAction.*; +import static com.oracle.graal.api.meta.DeoptimizationReason.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; + +import java.lang.reflect.*; + import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.Node; +import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.calc.FloatingNode; -import com.oracle.graal.nodes.calc.IsNullNode; -import com.oracle.graal.nodes.extended.LoadHubNode; -import com.oracle.graal.nodes.extended.NullCheckNode; +import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; -import com.oracle.graal.compiler.common.type.IllegalStamp; -import com.oracle.graal.nodes.type.StampTool; -import com.oracle.graal.nodes.util.GraphUtil; -import com.oracle.graal.phases.common.DeadCodeEliminationPhase; -import com.oracle.graal.phases.tiers.PhaseContext; - -import java.lang.reflect.Modifier; - -import static com.oracle.graal.api.meta.DeoptimizationAction.InvalidateReprofile; -import static com.oracle.graal.api.meta.DeoptimizationReason.*; +import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.util.*; +import com.oracle.graal.phases.common.*; +import com.oracle.graal.phases.tiers.*; /** *

@@ -152,7 +151,7 @@ for (PostponedDeopt postponed : postponedDeopts) { postponed.doRewrite(falseConstant); } - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); } for (MethodCallTargetNode mcn : graph.getNodes().filter(MethodCallTargetNode.class)) { if (mcn.isAlive() && FlowUtil.lacksUsages(mcn)) { diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Mon Sep 08 21:23:18 2014 +0200 @@ -22,21 +22,20 @@ */ package com.oracle.graal.phases.common.inlining.info.elem; +import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; + import java.util.*; -import com.oracle.graal.api.meta.Constant; -import com.oracle.graal.api.meta.ResolvedJavaMethod; -import com.oracle.graal.compiler.common.type.Stamp; -import com.oracle.graal.debug.Debug; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.phases.common.CanonicalizerPhase; -import com.oracle.graal.phases.common.DeadCodeEliminationPhase; -import com.oracle.graal.phases.common.cfs.FlowUtil; -import com.oracle.graal.phases.common.inlining.InliningUtil; -import com.oracle.graal.phases.tiers.HighTierContext; - -import static com.oracle.graal.compiler.common.GraalOptions.OptCanonicalizer; +import com.oracle.graal.phases.common.*; +import com.oracle.graal.phases.common.cfs.*; +import com.oracle.graal.phases.common.inlining.*; +import com.oracle.graal.phases.tiers.*; /** *

@@ -245,7 +244,7 @@ } assert newGraph.start().next() != null : "graph needs to be populated by the GraphBuilderSuite"; - new DeadCodeEliminationPhase().apply(newGraph); + new DeadCodeEliminationPhase(OPTIONAL).apply(newGraph); if (OptCanonicalizer.getValue()) { canonicalizer.apply(newGraph, context); diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Sep 08 21:23:18 2014 +0200 @@ -25,6 +25,7 @@ import static com.oracle.graal.api.meta.MetaUtil.*; import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import java.lang.reflect.*; import java.util.*; @@ -511,7 +512,7 @@ new CollapseFrameForSingleSideEffectPhase().apply(graph); break; } - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(REQUIRED).apply(graph); } /** @@ -613,7 +614,7 @@ */ protected void afterInlining(StructuredGraph graph) { new NodeIntrinsificationPhase(providers, snippetReflection).apply(graph); - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); if (OptCanonicalizer.getValue()) { new CanonicalizerPhase(true).apply(graph, new PhaseContext(providers, assumptions)); } @@ -686,7 +687,7 @@ end.disableSafepoint(); } - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(REQUIRED).apply(graph); } catch (Throwable e) { throw Debug.handle(e); } diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Sep 08 21:23:18 2014 +0200 @@ -26,6 +26,7 @@ import static com.oracle.graal.compiler.common.GraalOptions.*; import static com.oracle.graal.debug.Debug.*; import static com.oracle.graal.graph.util.CollectionsAccess.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import static com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates.*; import static java.util.FormattableFlags.*; @@ -670,7 +671,7 @@ } } - new DeadCodeEliminationPhase().apply(snippetCopy); + new DeadCodeEliminationPhase(REQUIRED).apply(snippetCopy); assert checkAllVarargPlaceholdersAreDeleted(parameterCount, placeholders); diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java Mon Sep 08 21:23:18 2014 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.virtual.phases.ea; import static com.oracle.graal.debug.Debug.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import java.util.*; @@ -100,7 +101,7 @@ Debug.dump(graph, "after " + getName() + " iteration"); } - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(REQUIRED).apply(graph); Set changedNodes = listener.getNodes(); for (Node node : graph.getNodes()) { diff -r 3c54a098455f -r 37d6d174bc40 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Mon Sep 08 21:00:12 2014 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Mon Sep 08 21:23:18 2014 +0200 @@ -24,6 +24,7 @@ import static com.oracle.graal.compiler.common.GraalOptions.*; import static com.oracle.graal.debug.Debug.*; +import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import java.util.*; @@ -70,7 +71,7 @@ inlining.apply(graph, context); progress |= inlining.getInliningCount() > 0; - new DeadCodeEliminationPhase().apply(graph); + new DeadCodeEliminationPhase(OPTIONAL).apply(graph); boolean reduceOrEliminate = FlowSensitiveReduction.getValue() || ConditionalElimination.getValue(); if (reduceOrEliminate && OptCanonicalizer.getValue()) {