--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java 2017-03-20 17:37:49.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/LowTier.java 2017-03-20 17:37:48.000000000 -0700 @@ -22,26 +22,26 @@ */ package org.graalvm.compiler.core.phases; -import static org.graalvm.compiler.core.common.GraalOptions.ConditionalElimination; import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode; -import static org.graalvm.compiler.core.common.GraalOptions.UseGraalInstrumentation; import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required; +import org.graalvm.compiler.core.common.GraalOptions; import org.graalvm.compiler.nodes.spi.LoweringTool; import org.graalvm.compiler.options.Option; +import org.graalvm.compiler.options.OptionKey; import org.graalvm.compiler.options.OptionType; -import org.graalvm.compiler.options.OptionValue; +import org.graalvm.compiler.options.OptionValues; import org.graalvm.compiler.phases.PhaseSuite; import org.graalvm.compiler.phases.common.CanonicalizerPhase; import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; import org.graalvm.compiler.phases.common.ExpandLogicPhase; -import org.graalvm.compiler.phases.common.IterativeConditionalEliminationPhase; +import org.graalvm.compiler.phases.common.FixReadsPhase; import org.graalvm.compiler.phases.common.LoweringPhase; import org.graalvm.compiler.phases.common.ProfileCompiledMethodsPhase; -import org.graalvm.compiler.phases.common.RemoveValueProxyPhase; +import org.graalvm.compiler.phases.common.PropagateDeoptimizeProbabilityPhase; import org.graalvm.compiler.phases.common.UseTrappingNullChecksPhase; -import org.graalvm.compiler.phases.common.instrumentation.InlineInstrumentationPhase; import org.graalvm.compiler.phases.schedule.SchedulePhase; +import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy; import org.graalvm.compiler.phases.tiers.LowTierContext; public class LowTier extends PhaseSuite { @@ -50,41 +50,38 @@ // @formatter:off @Option(help = "", type = OptionType.Debug) - public static final OptionValue ProfileCompiledMethods = new OptionValue<>(false); + public static final OptionKey ProfileCompiledMethods = new OptionKey<>(false); // @formatter:on } - public LowTier() { + public LowTier(OptionValues options) { CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); - if (ImmutableCode.getValue()) { + CanonicalizerPhase canonicalizerWithoutGVN = new CanonicalizerPhase(); + canonicalizerWithoutGVN.disableGVN(); + if (ImmutableCode.getValue(options)) { canonicalizer.disableReadCanonicalization(); + canonicalizerWithoutGVN.disableReadCanonicalization(); } - if (Options.ProfileCompiledMethods.getValue()) { + if (Options.ProfileCompiledMethods.getValue(options)) { appendPhase(new ProfileCompiledMethodsPhase()); } appendPhase(new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.LOW_TIER)); - if (UseGraalInstrumentation.getValue()) { - appendPhase(new InlineInstrumentationPhase()); - } - - appendPhase(new RemoveValueProxyPhase()); appendPhase(new ExpandLogicPhase()); - /* Cleanup IsNull checks resulting from MID_TIER/LOW_TIER lowering and ExpandLogic phase. */ - if (ConditionalElimination.getValue()) { - appendPhase(new IterativeConditionalEliminationPhase(canonicalizer, false)); - /* Canonicalizer may create some new ShortCircuitOrNodes so clean them up. */ - appendPhase(new ExpandLogicPhase()); - } + appendPhase(new FixReadsPhase(true, new SchedulePhase(GraalOptions.StressTestEarlyReads.getValue(options) ? SchedulingStrategy.EARLIEST : SchedulingStrategy.LATEST_OUT_OF_LOOPS))); + + appendPhase(canonicalizerWithoutGVN); appendPhase(new UseTrappingNullChecksPhase()); appendPhase(new DeadCodeEliminationPhase(Required)); + appendPhase(new PropagateDeoptimizeProbabilityPhase()); + appendPhase(new SchedulePhase(SchedulePhase.SchedulingStrategy.FINAL_SCHEDULE)); } }