src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/phases/HighTier.java
changeset 58877 aec7bf35d6f5
parent 58299 6df94ce3ab2f
equal deleted inserted replaced
58876:1a8d65e71a66 58877:aec7bf35d6f5
    23 
    23 
    24 
    24 
    25 package org.graalvm.compiler.core.phases;
    25 package org.graalvm.compiler.core.phases;
    26 
    26 
    27 import static org.graalvm.compiler.core.common.GraalOptions.ConditionalElimination;
    27 import static org.graalvm.compiler.core.common.GraalOptions.ConditionalElimination;
    28 import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode;
       
    29 import static org.graalvm.compiler.core.common.GraalOptions.LoopPeeling;
    28 import static org.graalvm.compiler.core.common.GraalOptions.LoopPeeling;
    30 import static org.graalvm.compiler.core.common.GraalOptions.LoopUnswitch;
    29 import static org.graalvm.compiler.core.common.GraalOptions.LoopUnswitch;
    31 import static org.graalvm.compiler.core.common.GraalOptions.OptConvertDeoptsToGuards;
    30 import static org.graalvm.compiler.core.common.GraalOptions.OptConvertDeoptsToGuards;
    32 import static org.graalvm.compiler.core.common.GraalOptions.OptLoopTransform;
       
    33 import static org.graalvm.compiler.core.common.GraalOptions.OptReadElimination;
    31 import static org.graalvm.compiler.core.common.GraalOptions.OptReadElimination;
    34 import static org.graalvm.compiler.core.common.GraalOptions.PartialEscapeAnalysis;
    32 import static org.graalvm.compiler.core.common.GraalOptions.PartialEscapeAnalysis;
    35 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Optional;
    33 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Optional;
    36 
    34 
    37 import org.graalvm.compiler.loop.DefaultLoopPolicies;
    35 import org.graalvm.compiler.loop.DefaultLoopPolicies;
    38 import org.graalvm.compiler.loop.LoopPolicies;
    36 import org.graalvm.compiler.loop.LoopPolicies;
       
    37 import org.graalvm.compiler.loop.phases.ConvertDeoptimizeToGuardPhase;
    39 import org.graalvm.compiler.loop.phases.LoopFullUnrollPhase;
    38 import org.graalvm.compiler.loop.phases.LoopFullUnrollPhase;
    40 import org.graalvm.compiler.loop.phases.LoopPeelingPhase;
    39 import org.graalvm.compiler.loop.phases.LoopPeelingPhase;
    41 import org.graalvm.compiler.loop.phases.LoopUnswitchingPhase;
    40 import org.graalvm.compiler.loop.phases.LoopUnswitchingPhase;
    42 import org.graalvm.compiler.nodes.spi.LoweringTool;
    41 import org.graalvm.compiler.nodes.spi.LoweringTool;
    43 import org.graalvm.compiler.options.Option;
    42 import org.graalvm.compiler.options.Option;
    44 import org.graalvm.compiler.options.OptionKey;
    43 import org.graalvm.compiler.options.OptionKey;
    45 import org.graalvm.compiler.options.OptionType;
    44 import org.graalvm.compiler.options.OptionType;
    46 import org.graalvm.compiler.options.OptionValues;
    45 import org.graalvm.compiler.options.OptionValues;
    47 import org.graalvm.compiler.phases.PhaseSuite;
       
    48 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
    46 import org.graalvm.compiler.phases.common.CanonicalizerPhase;
    49 import org.graalvm.compiler.loop.phases.ConvertDeoptimizeToGuardPhase;
       
    50 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
    47 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase;
    51 import org.graalvm.compiler.phases.common.IncrementalCanonicalizerPhase;
    48 import org.graalvm.compiler.phases.common.IncrementalCanonicalizerPhase;
    52 import org.graalvm.compiler.phases.common.IterativeConditionalEliminationPhase;
    49 import org.graalvm.compiler.phases.common.IterativeConditionalEliminationPhase;
    53 import org.graalvm.compiler.phases.common.LoweringPhase;
    50 import org.graalvm.compiler.phases.common.LoweringPhase;
    54 import org.graalvm.compiler.phases.common.NodeCounterPhase;
    51 import org.graalvm.compiler.phases.common.NodeCounterPhase;
    55 import org.graalvm.compiler.phases.common.RemoveValueProxyPhase;
       
    56 import org.graalvm.compiler.phases.common.inlining.InliningPhase;
    52 import org.graalvm.compiler.phases.common.inlining.InliningPhase;
    57 import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy;
    53 import org.graalvm.compiler.phases.common.inlining.policy.GreedyInliningPolicy;
    58 import org.graalvm.compiler.phases.tiers.HighTierContext;
    54 import org.graalvm.compiler.phases.tiers.HighTierContext;
    59 import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase;
    55 import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase;
    60 import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase;
    56 import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase;
    61 
    57 
    62 public class HighTier extends PhaseSuite<HighTierContext> {
    58 public class HighTier extends BaseTier<HighTierContext> {
    63 
    59 
    64     public static class Options {
    60     public static class Options {
    65 
    61 
    66         // @formatter:off
    62         // @formatter:off
    67         @Option(help = "Enable inlining", type = OptionType.Expert)
    63         @Option(help = "Enable inlining", type = OptionType.Expert)
    68         public static final OptionKey<Boolean> Inline = new OptionKey<>(true);
    64         public static final OptionKey<Boolean> Inline = new OptionKey<>(true);
    69         // @formatter:on
    65         // @formatter:on
    70     }
    66     }
    71 
    67 
    72     public HighTier(OptionValues options) {
    68     public HighTier(OptionValues options) {
    73         CanonicalizerPhase canonicalizer = new CanonicalizerPhase();
    69         CanonicalizerPhase canonicalizer = createCanonicalizerPhase(options);
    74         if (ImmutableCode.getValue(options)) {
       
    75             canonicalizer.disableReadCanonicalization();
       
    76         }
       
    77 
       
    78         appendPhase(canonicalizer);
    70         appendPhase(canonicalizer);
    79 
    71 
    80         if (NodeCounterPhase.Options.NodeCounters.getValue(options)) {
    72         if (NodeCounterPhase.Options.NodeCounters.getValue(options)) {
    81             appendPhase(new NodeCounterPhase(NodeCounterPhase.Stage.INIT));
    73             appendPhase(new NodeCounterPhase(NodeCounterPhase.Stage.INIT));
    82         }
    74         }
    99         }
    91         }
   100 
    92 
   101         LoopPolicies loopPolicies = createLoopPolicies();
    93         LoopPolicies loopPolicies = createLoopPolicies();
   102         appendPhase(new LoopFullUnrollPhase(canonicalizer, loopPolicies));
    94         appendPhase(new LoopFullUnrollPhase(canonicalizer, loopPolicies));
   103 
    95 
   104         if (OptLoopTransform.getValue(options)) {
    96         if (LoopPeeling.getValue(options)) {
   105             if (LoopPeeling.getValue(options)) {
    97             appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new LoopPeelingPhase(loopPolicies)));
   106                 appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new LoopPeelingPhase(loopPolicies)));
    98         }
   107             }
    99 
   108             if (LoopUnswitch.getValue(options)) {
   100         if (LoopUnswitch.getValue(options)) {
   109                 appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new LoopUnswitchingPhase(loopPolicies)));
   101             appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new LoopUnswitchingPhase(loopPolicies)));
   110             }
       
   111         }
   102         }
   112 
   103 
   113         if (PartialEscapeAnalysis.getValue(options)) {
   104         if (PartialEscapeAnalysis.getValue(options)) {
   114             appendPhase(new PartialEscapePhase(true, canonicalizer, options));
   105             appendPhase(new PartialEscapePhase(true, canonicalizer, options));
   115         }
   106         }
   116 
   107 
   117         if (OptReadElimination.getValue(options)) {
   108         if (OptReadElimination.getValue(options)) {
   118             appendPhase(new EarlyReadEliminationPhase(canonicalizer));
   109             appendPhase(new EarlyReadEliminationPhase(canonicalizer));
   119         }
   110         }
   120 
   111 
   121         appendPhase(new RemoveValueProxyPhase());
       
   122 
       
   123         if (NodeCounterPhase.Options.NodeCounters.getValue(options)) {
   112         if (NodeCounterPhase.Options.NodeCounters.getValue(options)) {
   124             appendPhase(new NodeCounterPhase(NodeCounterPhase.Stage.LATE));
   113             appendPhase(new NodeCounterPhase(NodeCounterPhase.Stage.LATE));
   125         }
   114         }
   126 
   115 
   127         appendPhase(new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER));
   116         appendPhase(new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER));
   128     }
   117     }
   129 
   118 
       
   119     @Override
   130     public LoopPolicies createLoopPolicies() {
   120     public LoopPolicies createLoopPolicies() {
   131         return new DefaultLoopPolicies();
   121         return new DefaultLoopPolicies();
   132     }
   122     }
   133 }
   123 }