1 /*
   2  * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package com.oracle.graal.phases;
  24 
  25 import com.oracle.graal.options.*;
  26 
  27 /**
  28  * This class encapsulates options that control the behavior of the Graal compiler.
  29  */
  30 // @formatter:off
  31 public final class GraalOptions {
  32 
  33     @Option(help = "Enable use of compiler intrinsics")
  34     public static final OptionValue<Boolean> Intrinsify = new OptionValue<>(true);
  35     @Option(help = "Enable inlining of monomorphic calls")
  36     static final OptionValue<Boolean> InlineMonomorphicCalls = new OptionValue<>(true);
  37     @Option(help = "Enable inlining of polymorphic calls")
  38     static final OptionValue<Boolean> InlinePolymorphicCalls = new OptionValue<>(true);
  39     @Option(help = "Enable inlining of megamorphic calls")
  40     static final OptionValue<Boolean> InlineMegamorphicCalls = new OptionValue<>(true);
  41     @Option(help = "")
  42     public static final OptionValue<Double> MegamorphicInliningMinMethodProbability = new OptionValue<>(0.33D);
  43     @Option(help = "")
  44     public static final OptionValue<Integer> MaximumDesiredSize = new OptionValue<>(20000);
  45     @Option(help = "")
  46     public static final OptionValue<Integer> MaximumRecursiveInlining = new OptionValue<>(1);
  47 
  48     // inlining settings
  49     @Option(help = "")
  50     public static final OptionValue<Float> BoostInliningForEscapeAnalysis = new OptionValue<>(2f);
  51     @Option(help = "")
  52     public static final OptionValue<Float> RelevanceCapForInlining = new OptionValue<>(1f);
  53     @Option(help = "")
  54     public static final OptionValue<Float> CapInheritedRelevance = new OptionValue<>(1f);
  55     @Option(help = "")
  56     public static final OptionValue<Boolean> IterativeInlining = new OptionValue<>(false);
  57 
  58     @Option(help = "")
  59     public static final OptionValue<Integer> TrivialInliningSize = new OptionValue<>(10);
  60     @Option(help = "")
  61     public static final OptionValue<Integer> MaximumInliningSize = new OptionValue<>(300);
  62     @Option(help = "")
  63     public static final OptionValue<Integer> SmallCompiledLowLevelGraphSize = new OptionValue<>(300);
  64     @Option(help = "")
  65     public static final OptionValue<Double> LimitInlinedInvokes = new OptionValue<>(5.0);
  66     @Option(help = "")
  67     public static final OptionValue<Boolean> InlineEverything = new OptionValue<>(false);
  68 
  69     // escape analysis settings
  70     @Option(help = "")
  71     public static final OptionValue<Boolean> PartialEscapeAnalysis = new OptionValue<>(true);
  72     @Option(help = "")
  73     public static final OptionValue<Boolean> EscapeAnalysisHistogram = new OptionValue<>(false);
  74     @Option(help = "")
  75     public static final OptionValue<Integer> EscapeAnalysisIterations = new OptionValue<>(2);
  76     @Option(help = "")
  77     public static final OptionValue<String> EscapeAnalyzeOnly = new OptionValue<>(null);
  78     @Option(help = "")
  79     public static final OptionValue<Integer> MaximumEscapeAnalysisArrayLength = new OptionValue<>(32);
  80     @Option(help = "")
  81     public static final OptionValue<Boolean> PEAInliningHints = new OptionValue<>(false);
  82 
  83     @Option(help = "")
  84     public static final OptionValue<Double> TailDuplicationProbability = new OptionValue<>(0.5);
  85     @Option(help = "")
  86     public static final OptionValue<Integer> TailDuplicationTrivialSize = new OptionValue<>(1);
  87 
  88     // profiling information
  89     @Option(help = "")
  90     public static final OptionValue<Integer> DeoptsToDisableOptimisticOptimization = new OptionValue<>(40);
  91 
  92     // comilation queue
  93     @Option(help = "")
  94     public static final OptionValue<Boolean> DynamicCompilePriority = new OptionValue<>(false);
  95     @Option(help = "")
  96     public static final OptionValue<String> CompileTheWorld = new OptionValue<>(null);
  97     @Option(help = "")
  98     public static final OptionValue<Integer> CompileTheWorldStartAt = new OptionValue<>(1);
  99     @Option(help = "")
 100     public static final OptionValue<Integer> CompileTheWorldStopAt = new OptionValue<>(Integer.MAX_VALUE);
 101 
 102     // graph caching
 103     @Option(help = "")
 104     public static final OptionValue<Boolean> CacheGraphs = new OptionValue<>(true);
 105     @Option(help = "")
 106     public static final OptionValue<Integer> GraphCacheSize = new OptionValue<>(1000);
 107     @Option(help = "")
 108     public static final OptionValue<Boolean> PrintGraphCache = new OptionValue<>(false);
 109 
 110     //loop transform settings TODO (gd) tune
 111     @Option(help = "")
 112     public static final OptionValue<Boolean> LoopPeeling = new OptionValue<>(true);
 113     @Option(help = "")
 114     public static final OptionValue<Boolean> ReassociateInvariants = new OptionValue<>(true);
 115     @Option(help = "")
 116     public static final OptionValue<Boolean> FullUnroll = new OptionValue<>(true);
 117     @Option(help = "")
 118     public static final OptionValue<Boolean> LoopUnswitch = new OptionValue<>(true);
 119     @Option(help = "")
 120     public static final OptionValue<Integer> FullUnrollMaxNodes = new OptionValue<>(300);
 121     @Option(help = "")
 122     public static final OptionValue<Integer> ExactFullUnrollMaxNodes = new OptionValue<>(1200);
 123     @Option(help = "")
 124     public static final OptionValue<Float> MinimumPeelProbability = new OptionValue<>(0.35f);
 125     @Option(help = "")
 126     public static final OptionValue<Integer> LoopMaxUnswitch = new OptionValue<>(3);
 127     @Option(help = "")
 128     public static final OptionValue<Integer> LoopUnswitchMaxIncrease = new OptionValue<>(50);
 129     @Option(help = "")
 130     public static final OptionValue<Integer> LoopUnswitchUncertaintyBoost = new OptionValue<>(5);
 131     @Option(help = "")
 132     public static final OptionValue<Boolean> UseLoopLimitChecks = new OptionValue<>(true);
 133 
 134     // debugging settings
 135     @Option(help = "")
 136     public static final OptionValue<Boolean> ZapStackOnMethodEntry = new OptionValue<>(false);
 137     @Option(help = "")
 138     public static final OptionValue<Boolean> DeoptALot = new OptionValue<>(false);
 139     @Option(help = "")
 140     public static final OptionValue<Boolean> VerifyPhases = new OptionValue<>(false);
 141 
 142     @Option(help = "")
 143     public static final OptionValue<String> PrintFilter = new OptionValue<>(null);
 144 
 145     // Debug settings:
 146     @Option(help = "")
 147     public static final OptionValue<Boolean> BootstrapReplacements = new OptionValue<>(false);
 148     @Option(help = "")
 149     public static final OptionValue<Integer> GCDebugStartCycle = new OptionValue<>(-1);
 150     // Ideal graph visualizer output settings
 151     @Option(help = "")
 152     public static final OptionValue<Boolean> PrintBinaryGraphs = new OptionValue<>(true);
 153     @Option(help = "")
 154     public static final OptionValue<Boolean> PrintCFG = new OptionValue<>(false);
 155     @Option(help = "")
 156     public static final OptionValue<Boolean> PrintIdealGraphFile = new OptionValue<>(false);
 157     @Option(help = "")
 158     public static final OptionValue<String> PrintIdealGraphAddress = new OptionValue<>("127.0.0.1");
 159     @Option(help = "")
 160     public static final OptionValue<Integer> PrintIdealGraphPort = new OptionValue<>(4444);
 161     @Option(help = "")
 162     public static final OptionValue<Integer> PrintBinaryGraphPort = new OptionValue<>(4445);
 163 
 164     // Other printing settings
 165     @Option(help = "")
 166     public static final OptionValue<Boolean> PrintCompilation = new OptionValue<>(false);
 167     @Option(help = "")
 168     public static final OptionValue<Boolean> PrintProfilingInformation = new OptionValue<>(false);
 169     @Option(help = "")
 170     public static final OptionValue<Boolean> PrintIRWithLIR = new OptionValue<>(false);
 171     @Option(help = "")
 172     public static final OptionValue<Boolean> PrintCodeBytes = new OptionValue<>(false);
 173     @Option(help = "")
 174     public static final OptionValue<Boolean> PrintBailout = new OptionValue<>(false);
 175     @Option(help = "")
 176     public static final OptionValue<Integer> TraceLinearScanLevel = new OptionValue<>(0);
 177     @Option(help = "")
 178     public static final OptionValue<Integer> TraceLIRGeneratorLevel = new OptionValue<>(0);
 179     @Option(help = "")
 180     public static final OptionValue<Boolean> TraceEscapeAnalysis = new OptionValue<>(false);
 181     @Option(help = "")
 182     public static final OptionValue<Integer> TraceBytecodeParserLevel = new OptionValue<>(0);
 183     @Option(help = "")
 184     public static final OptionValue<Boolean> ExitVMOnBailout = new OptionValue<>(false);
 185     @Option(help = "")
 186     public static final OptionValue<Boolean> ExitVMOnException = new OptionValue<>(true);
 187     @Option(help = "")
 188     public static final OptionValue<Boolean> PrintStackTraceOnException = new OptionValue<>(false);
 189     @Option(help = "Sets a phase after which the decompiler dumps the graph, -G:Dump= required")
 190     public static final OptionValue<String> DecompileAfterPhase = new OptionValue<>(null);
 191 
 192     // HotSpot command line options
 193     @Option(help = "")
 194     public static final OptionValue<Boolean> HotSpotPrintCompilation = new OptionValue<>(false);
 195     @Option(help = "")
 196     public static final OptionValue<Boolean> HotSpotPrintInlining = new OptionValue<>(false);
 197 
 198     // Register allocator debugging
 199     @Option(help = "")
 200     public static final OptionValue<String> RegisterPressure = new OptionValue<>(null);
 201 
 202     // Code generator settings
 203     @Option(help = "")
 204     public static final OptionValue<Boolean> ConditionalElimination = new OptionValue<>(true);
 205     @Option(help = "")
 206     public static final OptionValue<Boolean> UseProfilingInformation = new OptionValue<>(true);
 207     @Option(help = "")
 208            static final OptionValue<Boolean> RemoveNeverExecutedCode = new OptionValue<>(true);
 209            @Option(help = "")
 210            static final OptionValue<Boolean> UseExceptionProbability = new OptionValue<>(true);
 211            @Option(help = "")
 212            static final OptionValue<Boolean> UseExceptionProbabilityForOperations = new OptionValue<>(true);
 213            @Option(help = "")
 214     public static final OptionValue<Boolean> OmitHotExceptionStacktrace = new OptionValue<>(false);
 215     @Option(help = "")
 216     public static final OptionValue<Boolean> GenSafepoints = new OptionValue<>(true);
 217     @Option(help = "")
 218     public static final OptionValue<Boolean> GenLoopSafepoints = new OptionValue<>(true);
 219     @Option(help = "")
 220            static final OptionValue<Boolean> UseTypeCheckHints = new OptionValue<>(true);
 221            @Option(help = "")
 222     public static final OptionValue<Boolean> InlineVTableStubs = new OptionValue<>(true);
 223     @Option(help = "")
 224     public static final OptionValue<Boolean> AlwaysInlineVTableStubs = new OptionValue<>(false);
 225     @Option(help = "")
 226     public static final OptionValue<Boolean> GenAssertionCode = new OptionValue<>(false);
 227     @Option(help = "")
 228     public static final OptionValue<Boolean> AlignCallsForPatching = new OptionValue<>(true);
 229     @Option(help = "")
 230     public static final OptionValue<Boolean> ResolveClassBeforeStaticInvoke = new OptionValue<>(false);
 231     @Option(help = "")
 232     public static final OptionValue<Boolean> CanOmitFrame = new OptionValue<>(true);
 233     @Option(help = "")
 234     public static final OptionValue<Integer> SafepointPollOffset = new OptionValue<>(256);
 235 
 236     @Option(help = "")
 237     public static final OptionValue<Boolean> MemoryAwareScheduling = new OptionValue<>(true);
 238 
 239     // Translating tableswitch instructions
 240     @Option(help = "")
 241     public static final OptionValue<Integer> MinimumJumpTableSize = new OptionValue<>(5);
 242     @Option(help = "")
 243     public static final OptionValue<Integer> RangeTestsSwitchDensity = new OptionValue<>(5);
 244     @Option(help = "")
 245     public static final OptionValue<Double> MinTableSwitchDensity = new OptionValue<>(0.5);
 246 
 247     // Ahead of time compilation
 248     @Option(help = "configure compiler to emit code compatible with AOT requirements for HotSpot")
 249     public static final OptionValue<Boolean> AOTCompilation = new OptionValue<>(false);
 250 
 251     // Runtime settings
 252     @Option(help = "")
 253     public static final OptionValue<Integer> StackShadowPages = new OptionValue<>(2);
 254 
 255     @Option(help = "")
 256     public static final OptionValue<Boolean> SupportJsrBytecodes = new OptionValue<>(true);
 257 
 258     @Option(help = "")
 259     public static final OptionValue<Boolean> OptAssumptions = new OptionValue<>(true);
 260     @Option(help = "")
 261     public static final OptionValue<Boolean> OptConvertDeoptsToGuards = new OptionValue<>(true);
 262     @Option(help = "")
 263     public static final OptionValue<Boolean> OptReadElimination = new OptionValue<>(true);
 264     @Option(help = "")
 265     public static final OptionValue<Boolean> OptCanonicalizer = new OptionValue<>(true);
 266     @Option(help = "")
 267      public static final OptionValue<Boolean> OptScheduleOutOfLoops = new OptionValue<>(true);
 268     @Option(help = "")
 269     public static final OptionValue<Boolean> OptEliminateGuards = new OptionValue<>(true);
 270     @Option(help = "")
 271     public static final OptionValue<Boolean> OptEliminateSafepoints = new OptionValue<>(true);
 272     @Option(help = "")
 273     public static final OptionValue<Boolean> OptImplicitNullChecks = new OptionValue<>(true);
 274     @Option(help = "")
 275     public static final OptionValue<Boolean> OptLivenessAnalysis = new OptionValue<>(true);
 276     @Option(help = "")
 277     public static final OptionValue<Boolean> OptLoopTransform = new OptionValue<>(true);
 278     @Option(help = "")
 279     public static final OptionValue<Boolean> OptFloatingReads = new OptionValue<>(true);
 280     @Option(help = "")
 281     public static final OptionValue<Boolean> OptTailDuplication = new OptionValue<>(true);
 282     @Option(help = "")
 283     public static final OptionValue<Boolean> OptEliminatePartiallyRedundantGuards = new OptionValue<>(true);
 284     @Option(help = "")
 285     public static final OptionValue<Boolean> OptFilterProfiledTypes = new OptionValue<>(true);
 286     @Option(help = "")
 287     public static final OptionValue<Boolean> OptDevirtualizeInvokesOptimistically = new OptionValue<>(true);
 288     @Option(help = "")
 289     public static final OptionValue<Boolean> OptPushThroughPi = new OptionValue<>(true);
 290 
 291     // Intrinsification settings
 292     @Option(help = "")
 293     public static final OptionValue<Boolean> IntrinsifyObjectClone = new OptionValue<>(false);
 294     @Option(help = "")
 295     public static final OptionValue<Boolean> IntrinsifyArrayCopy = new OptionValue<>(true);
 296     @Option(help = "")
 297     public static final OptionValue<Boolean> IntrinsifyObjectMethods = new OptionValue<>(true);
 298     @Option(help = "")
 299     public static final OptionValue<Boolean> IntrinsifySystemMethods = new OptionValue<>(true);
 300     @Option(help = "")
 301     public static final OptionValue<Boolean> IntrinsifyClassMethods = new OptionValue<>(true);
 302     @Option(help = "")
 303     public static final OptionValue<Boolean> IntrinsifyThreadMethods = new OptionValue<>(true);
 304     @Option(help = "")
 305     public static final OptionValue<Boolean> IntrinsifyUnsafeMethods = new OptionValue<>(true);
 306     @Option(help = "")
 307     public static final OptionValue<Boolean> IntrinsifyMathMethods = new OptionValue<>(true);
 308     @Option(help = "")
 309     public static final OptionValue<Boolean> IntrinsifyAESMethods = new OptionValue<>(true);
 310     @Option(help = "")
 311     public static final OptionValue<Boolean> IntrinsifyReflectionMethods = new OptionValue<>(true);
 312     @Option(help = "")
 313     public static final OptionValue<Boolean> IntrinsifyInstalledCodeMethods = new OptionValue<>(true);
 314     @Option(help = "")
 315     public static final OptionValue<Boolean> IntrinsifyCallSiteTarget = new OptionValue<>(true);
 316 
 317     /**
 318      * Counts the various paths taken through snippets.
 319      */
 320     @Option(help = "")
 321     public static final OptionValue<Boolean> SnippetCounters = new OptionValue<>(false);
 322 
 323     /**
 324      * If the probability that a checkcast will hit one the profiled types (up to {@link #CheckcastMaxHints})
 325      * is below this value, the checkcast will be compiled without hints.
 326      */
 327     @Option(help = "")
 328     public static final OptionValue<Double> CheckcastMinHintHitProbability = new OptionValue<>(0.5);
 329 
 330     /**
 331      * The maximum number of hint types that will be used when compiling a checkcast for which
 332      * profiling information is available. Note that {@link #CheckcastMinHintHitProbability}
 333      * also influences whether hints are used.
 334      */
 335     @Option(help = "")
 336     public static final OptionValue<Integer> CheckcastMaxHints = new OptionValue<>(2);
 337 
 338     /**
 339      * If the probability that an instanceof will hit one the profiled types (up to {@link #InstanceOfMaxHints})
 340      * is below this value, the instanceof will be compiled without hints.
 341      */
 342     @Option(help = "")
 343     public static final OptionValue<Double> InstanceOfMinHintHitProbability = new OptionValue<>(0.5);
 344 
 345     /**
 346      * The maximum number of hint types that will be used when compiling an instanceof for which
 347      * profiling information is available. Note that {@link #InstanceOfMinHintHitProbability}
 348      * also influences whether hints are used.
 349      */
 350     @Option(help = "")
 351     public static final OptionValue<Integer> InstanceOfMaxHints = new OptionValue<>(2);
 352 }