1 | /* |
2 | * Copyright (c) 2000, 2019, 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 | */ |
24 | |
25 | #ifndef SHARE_OPTO_C2_GLOBALS_HPP |
26 | #define SHARE_OPTO_C2_GLOBALS_HPP |
27 | |
28 | #include "runtime/globals_shared.hpp" |
29 | #include "utilities/macros.hpp" |
30 | |
31 | #include CPU_HEADER(c2_globals) |
32 | #include OS_HEADER(c2_globals) |
33 | |
34 | // |
35 | // Defines all globals flags used by the server compiler. |
36 | // |
37 | |
38 | #define C2_FLAGS(develop, \ |
39 | develop_pd, \ |
40 | product, \ |
41 | product_pd, \ |
42 | diagnostic, \ |
43 | diagnostic_pd, \ |
44 | experimental, \ |
45 | notproduct, \ |
46 | range, \ |
47 | constraint, \ |
48 | writeable) \ |
49 | \ |
50 | diagnostic(bool, StressLCM, false, \ |
51 | "Randomize instruction scheduling in LCM") \ |
52 | \ |
53 | diagnostic(bool, StressGCM, false, \ |
54 | "Randomize instruction scheduling in GCM") \ |
55 | \ |
56 | develop(bool, StressMethodHandleLinkerInlining, false, \ |
57 | "Stress inlining through method handle linkers") \ |
58 | \ |
59 | develop(intx, OptoPrologueNops, 0, \ |
60 | "Insert this many extra nop instructions " \ |
61 | "in the prologue of every nmethod") \ |
62 | range(0, 128) \ |
63 | \ |
64 | product_pd(intx, InteriorEntryAlignment, \ |
65 | "Code alignment for interior entry points " \ |
66 | "in generated code (in bytes)") \ |
67 | constraint(InteriorEntryAlignmentConstraintFunc, AfterErgo) \ |
68 | \ |
69 | product(intx, MaxLoopPad, (OptoLoopAlignment-1), \ |
70 | "Align a loop if padding size in bytes is less or equal to this " \ |
71 | "value") \ |
72 | range(0, max_jint) \ |
73 | \ |
74 | product(intx, MaxVectorSize, 64, \ |
75 | "Max vector size in bytes, " \ |
76 | "actual size could be less depending on elements type") \ |
77 | range(0, max_jint) \ |
78 | \ |
79 | product(bool, AlignVector, true, \ |
80 | "Perform vector store/load alignment in loop") \ |
81 | \ |
82 | product(intx, NumberOfLoopInstrToAlign, 4, \ |
83 | "Number of first instructions in a loop to align") \ |
84 | range(0, max_jint) \ |
85 | \ |
86 | notproduct(intx, IndexSetWatch, 0, \ |
87 | "Trace all operations on this IndexSet (-1 means all, 0 none)") \ |
88 | range(-1, 0) \ |
89 | \ |
90 | develop(intx, OptoNodeListSize, 4, \ |
91 | "Starting allocation size of Node_List data structures") \ |
92 | range(0, max_jint) \ |
93 | \ |
94 | develop(intx, OptoBlockListSize, 8, \ |
95 | "Starting allocation size of Block_List data structures") \ |
96 | range(0, max_jint) \ |
97 | \ |
98 | develop(intx, OptoPeepholeAt, -1, \ |
99 | "Apply peephole optimizations to this peephole rule") \ |
100 | \ |
101 | notproduct(bool, PrintIdeal, false, \ |
102 | "Print ideal graph before code generation") \ |
103 | \ |
104 | notproduct(bool, PrintOpto, false, \ |
105 | "Print compiler2 attempts") \ |
106 | \ |
107 | notproduct(bool, PrintOptoInlining, false, \ |
108 | "Print compiler2 inlining decisions") \ |
109 | \ |
110 | notproduct(bool, VerifyOpto, false, \ |
111 | "Apply more time consuming verification during compilation") \ |
112 | \ |
113 | notproduct(bool, VerifyIdealNodeCount, false, \ |
114 | "Verify that tracked dead ideal node count is accurate") \ |
115 | \ |
116 | notproduct(bool, PrintIdealNodeCount, false, \ |
117 | "Print liveness counts of ideal nodes") \ |
118 | \ |
119 | notproduct(bool, VerifyOptoOopOffsets, false, \ |
120 | "Check types of base addresses in field references") \ |
121 | \ |
122 | develop(bool, IdealizedNumerics, false, \ |
123 | "Check performance difference allowing FP " \ |
124 | "associativity and commutativity...") \ |
125 | \ |
126 | diagnostic_pd(bool, IdealizeClearArrayNode, \ |
127 | "Replace ClearArrayNode by subgraph of basic operations.") \ |
128 | \ |
129 | develop(bool, OptoBreakpoint, false, \ |
130 | "insert breakpoint at method entry") \ |
131 | \ |
132 | notproduct(bool, OptoBreakpointOSR, false, \ |
133 | "insert breakpoint at osr method entry") \ |
134 | \ |
135 | notproduct(intx, BreakAtNode, 0, \ |
136 | "Break at construction of this Node (either _idx or _debug_idx)") \ |
137 | \ |
138 | notproduct(bool, OptoBreakpointC2R, false, \ |
139 | "insert breakpoint at runtime stub entry") \ |
140 | \ |
141 | notproduct(bool, OptoNoExecute, false, \ |
142 | "Attempt to parse and compile but do not execute generated code") \ |
143 | \ |
144 | notproduct(bool, PrintOptoStatistics, false, \ |
145 | "Print New compiler statistics") \ |
146 | \ |
147 | diagnostic(bool, PrintOptoAssembly, false, \ |
148 | "Print New compiler assembly output") \ |
149 | \ |
150 | develop_pd(bool, OptoPeephole, \ |
151 | "Apply peephole optimizations after register allocation") \ |
152 | \ |
153 | develop(bool, OptoRemoveUseless, true, \ |
154 | "Remove useless nodes after parsing") \ |
155 | \ |
156 | notproduct(bool, PrintFrameConverterAssembly, false, \ |
157 | "Print New compiler assembly output for frame converters") \ |
158 | \ |
159 | notproduct(bool, PrintParseStatistics, false, \ |
160 | "Print nodes, transforms and new values made per bytecode parsed")\ |
161 | \ |
162 | notproduct(bool, PrintOptoPeephole, false, \ |
163 | "Print New compiler peephole replacements") \ |
164 | \ |
165 | develop(bool, PrintCFGBlockFreq, false, \ |
166 | "Print CFG block freqencies") \ |
167 | \ |
168 | develop(bool, TraceOptoParse, false, \ |
169 | "Trace bytecode parse and control-flow merge") \ |
170 | \ |
171 | product_pd(intx, LoopUnrollLimit, \ |
172 | "Unroll loop bodies with node count less than this") \ |
173 | range(0, max_jint / 4) \ |
174 | \ |
175 | product_pd(intx, LoopPercentProfileLimit, \ |
176 | "Unroll loop bodies with % node count of profile limit") \ |
177 | range(10, 100) \ |
178 | \ |
179 | product(intx, LoopMaxUnroll, 16, \ |
180 | "Maximum number of unrolls for main loop") \ |
181 | range(0, max_jint) \ |
182 | \ |
183 | product_pd(bool, SuperWordLoopUnrollAnalysis, \ |
184 | "Map number of unrolls for main loop via " \ |
185 | "Superword Level Parallelism analysis") \ |
186 | \ |
187 | experimental(bool, PostLoopMultiversioning, false, \ |
188 | "Multi versioned post loops to eliminate range checks") \ |
189 | \ |
190 | notproduct(bool, TraceSuperWordLoopUnrollAnalysis, false, \ |
191 | "Trace what Superword Level Parallelism analysis applies") \ |
192 | \ |
193 | product(intx, LoopUnrollMin, 4, \ |
194 | "Minimum number of unroll loop bodies before checking progress" \ |
195 | "of rounds of unroll,optimize,..") \ |
196 | range(0, max_jint) \ |
197 | \ |
198 | product(bool, UseSubwordForMaxVector, true, \ |
199 | "Use Subword Analysis to set maximum vector size") \ |
200 | \ |
201 | product(bool, UseVectorCmov, false, \ |
202 | "Use Vectorized Cmov") \ |
203 | \ |
204 | develop(intx, UnrollLimitForProfileCheck, 1, \ |
205 | "Don't use profile_trip_cnt() to restrict unrolling until " \ |
206 | "unrolling would push the number of unrolled iterations above " \ |
207 | "UnrollLimitForProfileCheck. A higher value allows more " \ |
208 | "unrolling. Zero acts as a very large value." ) \ |
209 | range(0, max_intx) \ |
210 | \ |
211 | product(intx, MultiArrayExpandLimit, 6, \ |
212 | "Maximum number of individual allocations in an inline-expanded " \ |
213 | "multianewarray instruction") \ |
214 | range(0, max_jint) \ |
215 | \ |
216 | notproduct(bool, TraceProfileTripCount, false, \ |
217 | "Trace profile loop trip count information") \ |
218 | \ |
219 | product(bool, UseCountedLoopSafepoints, false, \ |
220 | "Force counted loops to keep a safepoint") \ |
221 | \ |
222 | product(bool, UseLoopPredicate, true, \ |
223 | "Generate a predicate to select fast/slow loop versions") \ |
224 | \ |
225 | develop(bool, TraceLoopPredicate, false, \ |
226 | "Trace generation of loop predicates") \ |
227 | \ |
228 | develop(bool, TraceLoopOpts, false, \ |
229 | "Trace executed loop optimizations") \ |
230 | \ |
231 | develop(bool, TraceLoopLimitCheck, false, \ |
232 | "Trace generation of loop limits checks") \ |
233 | \ |
234 | develop(bool, TraceRangeLimitCheck, false, \ |
235 | "Trace additional overflow checks in RCE") \ |
236 | \ |
237 | /* OptimizeFill not yet supported on PowerPC. */ \ |
238 | product(bool, OptimizeFill, true PPC64_ONLY(&& false), \ |
239 | "convert fill/copy loops into intrinsic") \ |
240 | \ |
241 | develop(bool, TraceOptimizeFill, false, \ |
242 | "print detailed information about fill conversion") \ |
243 | \ |
244 | develop(bool, OptoCoalesce, true, \ |
245 | "Use Conservative Copy Coalescing in the Register Allocator") \ |
246 | \ |
247 | develop(bool, UseUniqueSubclasses, true, \ |
248 | "Narrow an abstract reference to the unique concrete subclass") \ |
249 | \ |
250 | develop(bool, UseExactTypes, true, \ |
251 | "Use exact types to eliminate array store checks and v-calls") \ |
252 | \ |
253 | product(intx, TrackedInitializationLimit, 50, \ |
254 | "When initializing fields, track up to this many words") \ |
255 | range(0, 65535) \ |
256 | \ |
257 | product(bool, ReduceFieldZeroing, true, \ |
258 | "When initializing fields, try to avoid needless zeroing") \ |
259 | \ |
260 | product(bool, ReduceInitialCardMarks, true, \ |
261 | "When initializing fields, try to avoid needless card marks") \ |
262 | \ |
263 | product(bool, ReduceBulkZeroing, true, \ |
264 | "When bulk-initializing, try to avoid needless zeroing") \ |
265 | \ |
266 | product(bool, UseFPUForSpilling, false, \ |
267 | "Spill integer registers to FPU instead of stack when possible") \ |
268 | \ |
269 | develop_pd(intx, RegisterCostAreaRatio, \ |
270 | "Spill selection in reg allocator: scale area by (X/64K) before " \ |
271 | "adding cost") \ |
272 | \ |
273 | develop_pd(bool, UseCISCSpill, \ |
274 | "Use ADLC supplied cisc instructions during allocation") \ |
275 | \ |
276 | notproduct(bool, VerifyGraphEdges , false, \ |
277 | "Verify Bi-directional Edges") \ |
278 | \ |
279 | notproduct(bool, VerifyDUIterators, true, \ |
280 | "Verify the safety of all iterations of Bi-directional Edges") \ |
281 | \ |
282 | notproduct(bool, VerifyHashTableKeys, true, \ |
283 | "Verify the immutability of keys in the VN hash tables") \ |
284 | \ |
285 | notproduct(bool, VerifyRegisterAllocator , false, \ |
286 | "Verify Register Allocator") \ |
287 | \ |
288 | develop_pd(intx, FLOATPRESSURE, \ |
289 | "Number of float LRG's that constitute high register pressure") \ |
290 | range(0, max_jint) \ |
291 | \ |
292 | develop_pd(intx, INTPRESSURE, \ |
293 | "Number of integer LRG's that constitute high register pressure") \ |
294 | range(0, max_jint) \ |
295 | \ |
296 | notproduct(bool, TraceOptoPipelining, false, \ |
297 | "Trace pipelining information") \ |
298 | \ |
299 | notproduct(bool, TraceOptoOutput, false, \ |
300 | "Trace pipelining information") \ |
301 | \ |
302 | product_pd(bool, OptoScheduling, \ |
303 | "Instruction Scheduling after register allocation") \ |
304 | \ |
305 | product_pd(bool, OptoRegScheduling, \ |
306 | "Instruction Scheduling before register allocation for pressure") \ |
307 | \ |
308 | product(bool, PartialPeelLoop, true, \ |
309 | "Partial peel (rotate) loops") \ |
310 | \ |
311 | product(intx, PartialPeelNewPhiDelta, 0, \ |
312 | "Additional phis that can be created by partial peeling") \ |
313 | range(0, max_jint) \ |
314 | \ |
315 | notproduct(bool, TracePartialPeeling, false, \ |
316 | "Trace partial peeling (loop rotation) information") \ |
317 | \ |
318 | product(bool, PartialPeelAtUnsignedTests, true, \ |
319 | "Partial peel at unsigned tests if no signed test exists") \ |
320 | \ |
321 | product(bool, ReassociateInvariants, true, \ |
322 | "Enable reassociation of expressions with loop invariants.") \ |
323 | \ |
324 | product(bool, LoopUnswitching, true, \ |
325 | "Enable loop unswitching (a form of invariant test hoisting)") \ |
326 | \ |
327 | notproduct(bool, TraceLoopUnswitching, false, \ |
328 | "Trace loop unswitching") \ |
329 | \ |
330 | product(bool, AllowVectorizeOnDemand, true, \ |
331 | "Globally supress vectorization set in VectorizeMethod") \ |
332 | \ |
333 | product(bool, UseSuperWord, true, \ |
334 | "Transform scalar operations into superword operations") \ |
335 | \ |
336 | develop(bool, SuperWordRTDepCheck, false, \ |
337 | "Enable runtime dependency checks.") \ |
338 | \ |
339 | product(bool, SuperWordReductions, true, \ |
340 | "Enable reductions support in superword.") \ |
341 | \ |
342 | product(bool, UseCMoveUnconditionally, false, \ |
343 | "Use CMove (scalar and vector) ignoring profitability test.") \ |
344 | \ |
345 | product(bool, DoReserveCopyInSuperWord, true, \ |
346 | "Create reserve copy of graph in SuperWord.") \ |
347 | \ |
348 | notproduct(bool, TraceSuperWord, false, \ |
349 | "Trace superword transforms") \ |
350 | \ |
351 | notproduct(bool, TraceNewVectors, false, \ |
352 | "Trace creation of Vector nodes") \ |
353 | \ |
354 | product_pd(bool, OptoBundling, \ |
355 | "Generate nops to fill i-cache lines") \ |
356 | \ |
357 | product_pd(intx, ConditionalMoveLimit, \ |
358 | "Limit of ops to make speculative when using CMOVE") \ |
359 | range(0, max_jint) \ |
360 | \ |
361 | /* Set BranchOnRegister == false. See 4965987. */ \ |
362 | product(bool, BranchOnRegister, false, \ |
363 | "Use Sparc V9 branch-on-register opcodes") \ |
364 | \ |
365 | develop(bool, SparcV9RegsHiBitsZero, true, \ |
366 | "Assume Sparc V9 I&L registers on V8+ systems are zero-extended") \ |
367 | \ |
368 | product(bool, UseRDPCForConstantTableBase, false, \ |
369 | "Use Sparc RDPC instruction for the constant table base.") \ |
370 | \ |
371 | notproduct(bool, PrintIdealGraph, false, \ |
372 | "Print ideal graph to XML file / network interface. " \ |
373 | "By default attempts to connect to the visualizer on a socket.") \ |
374 | \ |
375 | notproduct(intx, PrintIdealGraphLevel, 0, \ |
376 | "Level of detail of the ideal graph printout. " \ |
377 | "System-wide value, 0=nothing is printed, 4=all details printed. "\ |
378 | "Level of detail of printouts can be set on a per-method level " \ |
379 | "as well by using CompileCommand=option.") \ |
380 | range(0, 4) \ |
381 | \ |
382 | notproduct(intx, PrintIdealGraphPort, 4444, \ |
383 | "Ideal graph printer to network port") \ |
384 | range(0, SHRT_MAX) \ |
385 | \ |
386 | notproduct(ccstr, PrintIdealGraphAddress, "127.0.0.1", \ |
387 | "IP address to connect to visualizer") \ |
388 | \ |
389 | notproduct(ccstr, PrintIdealGraphFile, NULL, \ |
390 | "File to dump ideal graph to. If set overrides the " \ |
391 | "use of the network") \ |
392 | \ |
393 | product(bool, UseBimorphicInlining, true, \ |
394 | "Profiling based inlining for two receivers") \ |
395 | \ |
396 | product(bool, UseOnlyInlinedBimorphic, true, \ |
397 | "Don't use BimorphicInlining if can't inline a second method") \ |
398 | \ |
399 | product(bool, InsertMemBarAfterArraycopy, true, \ |
400 | "Insert memory barrier after arraycopy call") \ |
401 | \ |
402 | develop(bool, SubsumeLoads, true, \ |
403 | "Attempt to compile while subsuming loads into machine " \ |
404 | "instructions.") \ |
405 | \ |
406 | develop(bool, StressRecompilation, false, \ |
407 | "Recompile each compiled method without subsuming loads " \ |
408 | "or escape analysis.") \ |
409 | \ |
410 | develop(intx, ImplicitNullCheckThreshold, 3, \ |
411 | "Don't do implicit null checks if NPE's in a method exceeds " \ |
412 | "limit") \ |
413 | range(0, max_jint) \ |
414 | \ |
415 | product(intx, LoopOptsCount, 43, \ |
416 | "Set level of loop optimization for tier 1 compiles") \ |
417 | range(5, 43) \ |
418 | \ |
419 | /* controls for heat-based inlining */ \ |
420 | \ |
421 | develop(intx, NodeCountInliningCutoff, 18000, \ |
422 | "If parser node generation exceeds limit stop inlining") \ |
423 | range(0, max_jint) \ |
424 | \ |
425 | develop(intx, NodeCountInliningStep, 1000, \ |
426 | "Target size of warm calls inlined between optimization passes") \ |
427 | range(0, max_jint) \ |
428 | \ |
429 | develop(bool, InlineWarmCalls, false, \ |
430 | "Use a heat-based priority queue to govern inlining") \ |
431 | \ |
432 | /* Max values must not exceed WarmCallInfo::MAX_VALUE(). */ \ |
433 | develop(intx, HotCallCountThreshold, 999999, \ |
434 | "large numbers of calls (per method invocation) force hotness") \ |
435 | range(0, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
436 | \ |
437 | develop(intx, HotCallProfitThreshold, 999999, \ |
438 | "highly profitable inlining opportunities force hotness") \ |
439 | range(0, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
440 | \ |
441 | develop(intx, HotCallTrivialWork, -1, \ |
442 | "trivial execution time (no larger than this) forces hotness") \ |
443 | range(-1, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
444 | \ |
445 | develop(intx, HotCallTrivialSize, -1, \ |
446 | "trivial methods (no larger than this) force calls to be hot") \ |
447 | range(-1, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
448 | \ |
449 | develop(intx, WarmCallMinCount, -1, \ |
450 | "number of calls (per method invocation) to enable inlining") \ |
451 | range(-1, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
452 | \ |
453 | develop(intx, WarmCallMinProfit, -1, \ |
454 | "number of calls (per method invocation) to enable inlining") \ |
455 | range(-1, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
456 | \ |
457 | develop(intx, WarmCallMaxWork, 999999, \ |
458 | "execution time of the largest inlinable method") \ |
459 | range(0, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
460 | \ |
461 | develop(intx, WarmCallMaxSize, 999999, \ |
462 | "size of the largest inlinable method") \ |
463 | range(0, ((intx)MIN2((int64_t)max_intx,(int64_t)(+1.0e10)))) \ |
464 | \ |
465 | product(intx, MaxNodeLimit, 80000, \ |
466 | "Maximum number of nodes") \ |
467 | range(1000, max_jint / 3) \ |
468 | \ |
469 | product(intx, NodeLimitFudgeFactor, 2000, \ |
470 | "Fudge Factor for certain optimizations") \ |
471 | constraint(NodeLimitFudgeFactorConstraintFunc, AfterErgo) \ |
472 | \ |
473 | product(bool, UseJumpTables, true, \ |
474 | "Use JumpTables instead of a binary search tree for switches") \ |
475 | \ |
476 | product(bool, UseDivMod, true, \ |
477 | "Use combined DivMod instruction if available") \ |
478 | \ |
479 | product_pd(intx, MinJumpTableSize, \ |
480 | "Minimum number of targets in a generated jump table") \ |
481 | range(0, max_intx) \ |
482 | \ |
483 | product(intx, MaxJumpTableSize, 65000, \ |
484 | "Maximum number of targets in a generated jump table") \ |
485 | range(0, max_intx) \ |
486 | \ |
487 | product(intx, MaxJumpTableSparseness, 5, \ |
488 | "Maximum sparseness for jumptables") \ |
489 | range(0, max_intx / 4) \ |
490 | \ |
491 | product(bool, EliminateLocks, true, \ |
492 | "Coarsen locks when possible") \ |
493 | \ |
494 | product(bool, EliminateNestedLocks, true, \ |
495 | "Eliminate nested locks of the same object when possible") \ |
496 | \ |
497 | notproduct(bool, PrintLockStatistics, false, \ |
498 | "Print precise statistics on the dynamic lock usage") \ |
499 | \ |
500 | diagnostic(bool, PrintPreciseBiasedLockingStatistics, false, \ |
501 | "Print per-lock-site statistics of biased locking in JVM") \ |
502 | \ |
503 | diagnostic(bool, PrintPreciseRTMLockingStatistics, false, \ |
504 | "Print per-lock-site statistics of rtm locking in JVM") \ |
505 | \ |
506 | notproduct(bool, PrintEliminateLocks, false, \ |
507 | "Print out when locks are eliminated") \ |
508 | \ |
509 | product(bool, EliminateAutoBox, true, \ |
510 | "Control optimizations for autobox elimination") \ |
511 | \ |
512 | product(intx, AutoBoxCacheMax, 128, \ |
513 | "Sets max value cached by the java.lang.Integer autobox cache") \ |
514 | range(0, max_jint) \ |
515 | \ |
516 | experimental(bool, AggressiveUnboxing, true, \ |
517 | "Control optimizations for aggressive boxing elimination") \ |
518 | \ |
519 | develop(bool, TracePostallocExpand, false, "Trace expanding nodes after" \ |
520 | " register allocation.") \ |
521 | \ |
522 | product(bool, DoEscapeAnalysis, true, \ |
523 | "Perform escape analysis") \ |
524 | \ |
525 | product(double, EscapeAnalysisTimeout, 20. DEBUG_ONLY(+40.), \ |
526 | "Abort EA when it reaches time limit (in sec)") \ |
527 | range(0, DBL_MAX) \ |
528 | \ |
529 | develop(bool, ExitEscapeAnalysisOnTimeout, true, \ |
530 | "Exit or throw assert in EA when it reaches time limit") \ |
531 | \ |
532 | notproduct(bool, PrintEscapeAnalysis, false, \ |
533 | "Print the results of escape analysis") \ |
534 | \ |
535 | product(bool, EliminateAllocations, true, \ |
536 | "Use escape analysis to eliminate allocations") \ |
537 | \ |
538 | notproduct(bool, PrintEliminateAllocations, false, \ |
539 | "Print out when allocations are eliminated") \ |
540 | \ |
541 | product(intx, EliminateAllocationArraySizeLimit, 64, \ |
542 | "Array size (number of elements) limit for scalar replacement") \ |
543 | range(0, max_jint) \ |
544 | \ |
545 | product(bool, OptimizePtrCompare, true, \ |
546 | "Use escape analysis to optimize pointers compare") \ |
547 | \ |
548 | notproduct(bool, PrintOptimizePtrCompare, false, \ |
549 | "Print information about optimized pointers compare") \ |
550 | \ |
551 | notproduct(bool, VerifyConnectionGraph , true, \ |
552 | "Verify Connection Graph construction in Escape Analysis") \ |
553 | \ |
554 | product(bool, UseOptoBiasInlining, true, \ |
555 | "Generate biased locking code in C2 ideal graph") \ |
556 | \ |
557 | product(bool, OptimizeStringConcat, true, \ |
558 | "Optimize the construction of Strings by StringBuilder") \ |
559 | \ |
560 | notproduct(bool, PrintOptimizeStringConcat, false, \ |
561 | "Print information about transformations performed on Strings") \ |
562 | \ |
563 | product(intx, ValueSearchLimit, 1000, \ |
564 | "Recursion limit in PhaseMacroExpand::value_from_mem_phi") \ |
565 | range(0, max_jint) \ |
566 | \ |
567 | product(intx, MaxLabelRootDepth, 1100, \ |
568 | "Maximum times call Label_Root to prevent stack overflow") \ |
569 | range(100, max_jint) \ |
570 | \ |
571 | diagnostic(intx, DominatorSearchLimit, 1000, \ |
572 | "Iterations limit in Node::dominates") \ |
573 | range(0, max_jint) \ |
574 | \ |
575 | product(bool, BlockLayoutByFrequency, true, \ |
576 | "Use edge frequencies to drive block ordering") \ |
577 | \ |
578 | product(intx, BlockLayoutMinDiamondPercentage, 20, \ |
579 | "Miniumum %% of a successor (predecessor) for which block " \ |
580 | "layout a will allow a fork (join) in a single chain") \ |
581 | range(0, 100) \ |
582 | \ |
583 | product(bool, BlockLayoutRotateLoops, true, \ |
584 | "Allow back branches to be fall throughs in the block layout") \ |
585 | \ |
586 | diagnostic(bool, InlineReflectionGetCallerClass, true, \ |
587 | "inline sun.reflect.Reflection.getCallerClass(), known to be " \ |
588 | "part of base library DLL") \ |
589 | \ |
590 | diagnostic(bool, InlineObjectCopy, true, \ |
591 | "inline Object.clone and Arrays.copyOf[Range] intrinsics") \ |
592 | \ |
593 | diagnostic(bool, SpecialStringCompareTo, true, \ |
594 | "special version of string compareTo") \ |
595 | \ |
596 | diagnostic(bool, SpecialStringIndexOf, true, \ |
597 | "special version of string indexOf") \ |
598 | \ |
599 | diagnostic(bool, SpecialStringEquals, true, \ |
600 | "special version of string equals") \ |
601 | \ |
602 | diagnostic(bool, SpecialArraysEquals, true, \ |
603 | "special version of Arrays.equals(char[],char[])") \ |
604 | \ |
605 | diagnostic(bool, SpecialEncodeISOArray, true, \ |
606 | "special version of ISO_8859_1$Encoder.encodeISOArray") \ |
607 | \ |
608 | develop(bool, BailoutToInterpreterForThrows, false, \ |
609 | "Compiled methods which throws/catches exceptions will be " \ |
610 | "deopt and intp.") \ |
611 | \ |
612 | develop(bool, ConvertCmpD2CmpF, true, \ |
613 | "Convert cmpD to cmpF when one input is constant in float range") \ |
614 | \ |
615 | develop(bool, ConvertFloat2IntClipping, true, \ |
616 | "Convert float2int clipping idiom to integer clipping") \ |
617 | \ |
618 | develop(bool, Use24BitFPMode, true, \ |
619 | "Set 24-bit FPU mode on a per-compile basis ") \ |
620 | \ |
621 | develop(bool, Use24BitFP, true, \ |
622 | "use FP instructions that produce 24-bit precise results") \ |
623 | \ |
624 | develop(bool, MonomorphicArrayCheck, true, \ |
625 | "Uncommon-trap array store checks that require full type check") \ |
626 | \ |
627 | notproduct(bool, TracePhaseCCP, false, \ |
628 | "Print progress during Conditional Constant Propagation") \ |
629 | \ |
630 | develop(bool, PrintDominators, false, \ |
631 | "Print out dominator trees for GVN") \ |
632 | \ |
633 | diagnostic(bool, TraceSpilling, false, \ |
634 | "Trace spilling") \ |
635 | \ |
636 | diagnostic(bool, TraceTypeProfile, false, \ |
637 | "Trace type profile") \ |
638 | \ |
639 | develop(bool, PoisonOSREntry, true, \ |
640 | "Detect abnormal calls to OSR code") \ |
641 | \ |
642 | develop(bool, SoftMatchFailure, trueInProduct, \ |
643 | "If the DFA fails to match a node, print a message and bail out") \ |
644 | \ |
645 | develop(bool, InlineAccessors, true, \ |
646 | "inline accessor methods (get/set)") \ |
647 | \ |
648 | product(intx, TypeProfileMajorReceiverPercent, 90, \ |
649 | "% of major receiver type to all profiled receivers") \ |
650 | range(0, 100) \ |
651 | \ |
652 | diagnostic(bool, PrintIntrinsics, false, \ |
653 | "prints attempted and successful inlining of intrinsics") \ |
654 | \ |
655 | develop(bool, StressReflectiveCode, false, \ |
656 | "Use inexact types at allocations, etc., to test reflection") \ |
657 | \ |
658 | diagnostic(bool, DebugInlinedCalls, true, \ |
659 | "If false, restricts profiled locations to the root method only") \ |
660 | \ |
661 | notproduct(bool, VerifyLoopOptimizations, false, \ |
662 | "verify major loop optimizations") \ |
663 | \ |
664 | diagnostic(bool, ProfileDynamicTypes, true, \ |
665 | "do extra type profiling and use it more aggressively") \ |
666 | \ |
667 | develop(bool, TraceIterativeGVN, false, \ |
668 | "Print progress during Iterative Global Value Numbering") \ |
669 | \ |
670 | develop(bool, VerifyIterativeGVN, false, \ |
671 | "Verify Def-Use modifications during sparse Iterative Global " \ |
672 | "Value Numbering") \ |
673 | \ |
674 | notproduct(bool, TraceCISCSpill, false, \ |
675 | "Trace allocators use of cisc spillable instructions") \ |
676 | \ |
677 | product(bool, SplitIfBlocks, true, \ |
678 | "Clone compares and control flow through merge points to fold " \ |
679 | "some branches") \ |
680 | \ |
681 | develop(intx, FreqCountInvocations, 1, \ |
682 | "Scaling factor for branch frequencies (deprecated)") \ |
683 | range(1, max_intx) \ |
684 | \ |
685 | product(intx, AliasLevel, 3, \ |
686 | "0 for no aliasing, 1 for oop/field/static/array split, " \ |
687 | "2 for class split, 3 for unique instances") \ |
688 | range(0, 3) \ |
689 | constraint(AliasLevelConstraintFunc,AfterErgo) \ |
690 | \ |
691 | develop(bool, VerifyAliases, false, \ |
692 | "perform extra checks on the results of alias analysis") \ |
693 | \ |
694 | product(bool, IncrementalInline, true, \ |
695 | "do post parse inlining") \ |
696 | \ |
697 | develop(bool, AlwaysIncrementalInline, false, \ |
698 | "do all inlining incrementally") \ |
699 | \ |
700 | product(intx, LiveNodeCountInliningCutoff, 40000, \ |
701 | "max number of live nodes in a method") \ |
702 | range(0, max_juint / 8) \ |
703 | \ |
704 | diagnostic(bool, OptimizeExpensiveOps, true, \ |
705 | "Find best control for expensive operations") \ |
706 | \ |
707 | diagnostic(bool, UseMathExactIntrinsics, true, \ |
708 | "Enables intrinsification of various java.lang.Math functions") \ |
709 | \ |
710 | diagnostic(bool, UseCharacterCompareIntrinsics, false, \ |
711 | "Enables intrinsification of java.lang.Character functions") \ |
712 | \ |
713 | diagnostic(bool, UseMultiplyToLenIntrinsic, false, \ |
714 | "Enables intrinsification of BigInteger.multiplyToLen()") \ |
715 | \ |
716 | diagnostic(bool, UseSquareToLenIntrinsic, false, \ |
717 | "Enables intrinsification of BigInteger.squareToLen()") \ |
718 | \ |
719 | diagnostic(bool, UseMulAddIntrinsic, false, \ |
720 | "Enables intrinsification of BigInteger.mulAdd()") \ |
721 | \ |
722 | diagnostic(bool, UseMontgomeryMultiplyIntrinsic, false, \ |
723 | "Enables intrinsification of BigInteger.montgomeryMultiply()") \ |
724 | \ |
725 | diagnostic(bool, UseMontgomerySquareIntrinsic, false, \ |
726 | "Enables intrinsification of BigInteger.montgomerySquare()") \ |
727 | \ |
728 | product(bool, UseTypeSpeculation, true, \ |
729 | "Speculatively propagate types from profiles") \ |
730 | \ |
731 | diagnostic(bool, UseInlineDepthForSpeculativeTypes, true, \ |
732 | "Carry inline depth of profile point with speculative type " \ |
733 | "and give priority to profiling from lower inline depth") \ |
734 | \ |
735 | product_pd(bool, TrapBasedRangeChecks, \ |
736 | "Generate code for range checks that uses a cmp and trap " \ |
737 | "instruction raising SIGTRAP. Used on PPC64.") \ |
738 | \ |
739 | product(intx, ArrayCopyLoadStoreMaxElem, 8, \ |
740 | "Maximum number of arraycopy elements inlined as a sequence of" \ |
741 | "loads/stores") \ |
742 | range(0, max_intx) \ |
743 | \ |
744 | develop(bool, StressArrayCopyMacroNode, false, \ |
745 | "Perform ArrayCopy load/store replacement during IGVN only") \ |
746 | \ |
747 | develop(bool, RenumberLiveNodes, true, \ |
748 | "Renumber live nodes") \ |
749 | \ |
750 | product(uintx, LoopStripMiningIter, 0, \ |
751 | "Number of iterations in strip mined loop") \ |
752 | range(0, max_juint) \ |
753 | \ |
754 | product(uintx, LoopStripMiningIterShortLoop, 0, \ |
755 | "Loop with fewer iterations are not strip mined") \ |
756 | range(0, max_juint) \ |
757 | \ |
758 | product(bool, UseProfiledLoopPredicate, true, \ |
759 | "move predicates out of loops based on profiling data") \ |
760 | |
761 | #endif // SHARE_OPTO_C2_GLOBALS_HPP |
762 | |