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 } |