165 void dump(node_idx_t key, outputStream* st) const;
166
167 int clone_idx() const { return _clone_idx; }
168 void set_clone_idx(int x) { _clone_idx = x; }
169 bool is_debug() const { return _debug; }
170 void set_debug(bool debug) { _debug = debug; }
171
172 bool same_idx(node_idx_t k1, node_idx_t k2) const { return idx(k1) == idx(k2); }
173 bool same_gen(node_idx_t k1, node_idx_t k2) const { return gen(k1) == gen(k2); }
174 };
175
176 class Options {
177 friend class Compile;
178 private:
179 const bool _subsume_loads; // Load can be matched as part of a larger op.
180 const bool _do_escape_analysis; // Do escape analysis.
181 const bool _do_iterative_escape_analysis; // Do iterative escape analysis.
182 const bool _do_reduce_allocation_merges; // Do try to reduce allocation merges.
183 const bool _eliminate_boxing; // Do boxing elimination.
184 const bool _do_locks_coarsening; // Do locks coarsening
185 const bool _do_superword; // Do SuperWord
186 const bool _install_code; // Install the code that was compiled
187 public:
188 Options(bool subsume_loads,
189 bool do_escape_analysis,
190 bool do_iterative_escape_analysis,
191 bool do_reduce_allocation_merges,
192 bool eliminate_boxing,
193 bool do_locks_coarsening,
194 bool do_superword,
195 bool install_code) :
196 _subsume_loads(subsume_loads),
197 _do_escape_analysis(do_escape_analysis),
198 _do_iterative_escape_analysis(do_iterative_escape_analysis),
199 _do_reduce_allocation_merges(do_reduce_allocation_merges),
200 _eliminate_boxing(eliminate_boxing),
201 _do_locks_coarsening(do_locks_coarsening),
202 _do_superword(do_superword),
203 _install_code(install_code) {
204 }
205
206 static Options for_runtime_stub() {
207 return Options(
208 /* subsume_loads = */ true,
209 /* do_escape_analysis = */ false,
210 /* do_iterative_escape_analysis = */ false,
211 /* do_reduce_allocation_merges = */ false,
212 /* eliminate_boxing = */ false,
213 /* do_lock_coarsening = */ false,
214 /* do_superword = */ true,
215 /* install_code = */ true
216 );
217 }
218 };
219
220 //------------------------------Compile----------------------------------------
221 // This class defines a top-level Compiler invocation.
222
223 class Compile : public Phase {
224
225 public:
226 // Fixed alias indexes. (See also MergeMemNode.)
227 enum {
228 AliasIdxTop = 1, // pseudo-index, aliases to nothing (used as sentinel value)
229 AliasIdxBot = 2, // pseudo-index, aliases to everything
230 AliasIdxRaw = 3 // hard-wired index for TypeRawPtr::BOTTOM
231 };
232
233 // Variant of TraceTime(nullptr, &_t_accumulator, CITime);
350 bool _do_scheduling; // True if we intend to do scheduling
351 bool _do_freq_based_layout; // True if we intend to do frequency based block layout
352 bool _do_vector_loop; // True if allowed to execute loop in parallel iterations
353 bool _use_cmove; // True if CMove should be used without profitability analysis
354 bool _do_aliasing; // True if we intend to do aliasing
355 bool _print_assembly; // True if we should dump assembly code for this compilation
356 bool _print_inlining; // True if we should print inlining for this compilation
357 bool _print_intrinsics; // True if we should print intrinsics for this compilation
358 bool _print_phase_loop_opts; // True if we should print before and after loop opts phase
359 #ifndef PRODUCT
360 uint _phase_counter; // Counter for the number of already printed phases
361 uint _igv_idx; // Counter for IGV node identifiers
362 uint _igv_phase_iter[PHASE_NUM_TYPES]; // Counters for IGV phase iterations
363 bool _trace_opto_output;
364 bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
365 #endif
366 bool _has_irreducible_loop; // Found irreducible loops
367 bool _has_monitors; // Metadata transfered to nmethod to enable Continuations lock-detection fastpath
368 bool _has_scoped_access; // For shared scope closure
369 bool _clinit_barrier_on_entry; // True if clinit barrier is needed on nmethod entry
370 int _loop_opts_cnt; // loop opts round
371 uint _stress_seed; // Seed for stress testing
372
373 // Compilation environment.
374 Arena _comp_arena; // Arena with lifetime equivalent to Compile
375 void* _barrier_set_state; // Potential GC barrier state for Compile
376 ciEnv* _env; // CI interface
377 DirectiveSet* _directive; // Compiler directive
378 CompileLog* _log; // from CompilerThread
379 CHeapStringHolder _failure_reason; // for record_failure/failing pattern
380 CompilationFailureInfo* _first_failure_details; // Details for the first failure happening during compilation
381 GrowableArray<CallGenerator*> _intrinsics; // List of intrinsics.
382 GrowableArray<Node*> _macro_nodes; // List of nodes which need to be expanded before matching.
383 GrowableArray<ParsePredicateNode*> _parse_predicates; // List of Parse Predicates.
384 // List of OpaqueTemplateAssertionPredicateNode nodes for Template Assertion Predicates which can be seen as list
385 // of Template Assertion Predicates themselves.
386 GrowableArray<OpaqueTemplateAssertionPredicateNode*> _template_assertion_predicate_opaques;
387 GrowableArray<Node*> _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common
388 GrowableArray<Node*> _for_post_loop_igvn; // List of nodes for IGVN after loop opts are over
389 GrowableArray<Node*> _for_merge_stores_igvn; // List of nodes for IGVN merge stores
561 int compile_id() const { return _compile_id; }
562 DirectiveSet* directive() const { return _directive; }
563
564 // Does this compilation allow instructions to subsume loads? User
565 // instructions that subsume a load may result in an unschedulable
566 // instruction sequence.
567 bool subsume_loads() const { return _options._subsume_loads; }
568 /** Do escape analysis. */
569 bool do_escape_analysis() const { return _options._do_escape_analysis; }
570 bool do_iterative_escape_analysis() const { return _options._do_iterative_escape_analysis; }
571 bool do_reduce_allocation_merges() const { return _options._do_reduce_allocation_merges; }
572 /** Do boxing elimination. */
573 bool eliminate_boxing() const { return _options._eliminate_boxing; }
574 /** Do aggressive boxing elimination. */
575 bool aggressive_unboxing() const { return _options._eliminate_boxing && AggressiveUnboxing; }
576 bool should_install_code() const { return _options._install_code; }
577 /** Do locks coarsening. */
578 bool do_locks_coarsening() const { return _options._do_locks_coarsening; }
579 bool do_superword() const { return _options._do_superword; }
580
581 // Other fixed compilation parameters.
582 ciMethod* method() const { return _method; }
583 int entry_bci() const { return _entry_bci; }
584 bool is_osr_compilation() const { return _entry_bci != InvocationEntryBci; }
585 bool is_method_compilation() const { return (_method != nullptr && !_method->flags().is_native()); }
586 const TypeFunc* tf() const { assert(_tf!=nullptr, ""); return _tf; }
587 void init_tf(const TypeFunc* tf) { assert(_tf==nullptr, ""); _tf = tf; }
588 InlineTree* ilt() const { return _ilt; }
589 address stub_function() const { return _stub_function; }
590 const char* stub_name() const { return _stub_name; }
591 StubId stub_id() const { return _stub_id; }
592 address stub_entry_point() const { return _stub_entry_point; }
593 void set_stub_entry_point(address z) { _stub_entry_point = z; }
594
595 // Control of this compilation.
596 int fixed_slots() const { assert(_fixed_slots >= 0, ""); return _fixed_slots; }
597 void set_fixed_slots(int n) { _fixed_slots = n; }
598 void set_inlining_progress(bool z) { _inlining_progress = z; }
599 int inlining_progress() const { return _inlining_progress; }
600 void set_inlining_incrementally(bool z) { _inlining_incrementally = z; }
640 void set_do_freq_based_layout(bool z){ _do_freq_based_layout = z; }
641 bool do_vector_loop() const { return _do_vector_loop; }
642 void set_do_vector_loop(bool z) { _do_vector_loop = z; }
643 bool use_cmove() const { return _use_cmove; }
644 void set_use_cmove(bool z) { _use_cmove = z; }
645 bool do_aliasing() const { return _do_aliasing; }
646 bool print_assembly() const { return _print_assembly; }
647 void set_print_assembly(bool z) { _print_assembly = z; }
648 bool print_inlining() const { return _print_inlining; }
649 void set_print_inlining(bool z) { _print_inlining = z; }
650 bool print_intrinsics() const { return _print_intrinsics; }
651 void set_print_intrinsics(bool z) { _print_intrinsics = z; }
652 uint max_node_limit() const { return (uint)_max_node_limit; }
653 void set_max_node_limit(uint n) { _max_node_limit = n; }
654 bool clinit_barrier_on_entry() { return _clinit_barrier_on_entry; }
655 void set_clinit_barrier_on_entry(bool z) { _clinit_barrier_on_entry = z; }
656 bool has_monitors() const { return _has_monitors; }
657 void set_has_monitors(bool v) { _has_monitors = v; }
658 bool has_scoped_access() const { return _has_scoped_access; }
659 void set_has_scoped_access(bool v) { _has_scoped_access = v; }
660
661 // check the CompilerOracle for special behaviours for this compile
662 bool method_has_option(CompileCommandEnum option) const {
663 return method() != nullptr && method()->has_option(option);
664 }
665
666 #ifndef PRODUCT
667 uint next_igv_idx() { return _igv_idx++; }
668 bool trace_opto_output() const { return _trace_opto_output; }
669 void print_phase(const char* phase_name);
670 void print_ideal_ir(const char* compile_phase_name) const;
671 bool should_print_ideal() const { return _directive->PrintIdealOption; }
672 bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; }
673 void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
674 int _in_dump_cnt; // Required for dumping ir nodes.
675 #endif
676 bool has_irreducible_loop() const { return _has_irreducible_loop; }
677 void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; }
678
679 Ticks _latest_stage_start_counter;
|
165 void dump(node_idx_t key, outputStream* st) const;
166
167 int clone_idx() const { return _clone_idx; }
168 void set_clone_idx(int x) { _clone_idx = x; }
169 bool is_debug() const { return _debug; }
170 void set_debug(bool debug) { _debug = debug; }
171
172 bool same_idx(node_idx_t k1, node_idx_t k2) const { return idx(k1) == idx(k2); }
173 bool same_gen(node_idx_t k1, node_idx_t k2) const { return gen(k1) == gen(k2); }
174 };
175
176 class Options {
177 friend class Compile;
178 private:
179 const bool _subsume_loads; // Load can be matched as part of a larger op.
180 const bool _do_escape_analysis; // Do escape analysis.
181 const bool _do_iterative_escape_analysis; // Do iterative escape analysis.
182 const bool _do_reduce_allocation_merges; // Do try to reduce allocation merges.
183 const bool _eliminate_boxing; // Do boxing elimination.
184 const bool _do_locks_coarsening; // Do locks coarsening
185 const bool _for_preload; // Generate code for preload (before Java method execution), do class init barriers
186 const bool _do_superword; // Do SuperWord
187 const bool _install_code; // Install the code that was compiled
188 public:
189 Options(bool subsume_loads,
190 bool do_escape_analysis,
191 bool do_iterative_escape_analysis,
192 bool do_reduce_allocation_merges,
193 bool eliminate_boxing,
194 bool do_locks_coarsening,
195 bool do_superword,
196 bool for_preload,
197 bool install_code) :
198 _subsume_loads(subsume_loads),
199 _do_escape_analysis(do_escape_analysis),
200 _do_iterative_escape_analysis(do_iterative_escape_analysis),
201 _do_reduce_allocation_merges(do_reduce_allocation_merges),
202 _eliminate_boxing(eliminate_boxing),
203 _do_locks_coarsening(do_locks_coarsening),
204 _for_preload(for_preload),
205 _do_superword(do_superword),
206 _install_code(install_code) {
207 }
208
209 static Options for_runtime_stub() {
210 return Options(
211 /* subsume_loads = */ true,
212 /* do_escape_analysis = */ false,
213 /* do_iterative_escape_analysis = */ false,
214 /* do_reduce_allocation_merges = */ false,
215 /* eliminate_boxing = */ false,
216 /* do_lock_coarsening = */ false,
217 /* for_preload = */ false,
218 /* do_superword = */ true,
219 /* install_code = */ true
220 );
221 }
222 };
223
224 //------------------------------Compile----------------------------------------
225 // This class defines a top-level Compiler invocation.
226
227 class Compile : public Phase {
228
229 public:
230 // Fixed alias indexes. (See also MergeMemNode.)
231 enum {
232 AliasIdxTop = 1, // pseudo-index, aliases to nothing (used as sentinel value)
233 AliasIdxBot = 2, // pseudo-index, aliases to everything
234 AliasIdxRaw = 3 // hard-wired index for TypeRawPtr::BOTTOM
235 };
236
237 // Variant of TraceTime(nullptr, &_t_accumulator, CITime);
354 bool _do_scheduling; // True if we intend to do scheduling
355 bool _do_freq_based_layout; // True if we intend to do frequency based block layout
356 bool _do_vector_loop; // True if allowed to execute loop in parallel iterations
357 bool _use_cmove; // True if CMove should be used without profitability analysis
358 bool _do_aliasing; // True if we intend to do aliasing
359 bool _print_assembly; // True if we should dump assembly code for this compilation
360 bool _print_inlining; // True if we should print inlining for this compilation
361 bool _print_intrinsics; // True if we should print intrinsics for this compilation
362 bool _print_phase_loop_opts; // True if we should print before and after loop opts phase
363 #ifndef PRODUCT
364 uint _phase_counter; // Counter for the number of already printed phases
365 uint _igv_idx; // Counter for IGV node identifiers
366 uint _igv_phase_iter[PHASE_NUM_TYPES]; // Counters for IGV phase iterations
367 bool _trace_opto_output;
368 bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
369 #endif
370 bool _has_irreducible_loop; // Found irreducible loops
371 bool _has_monitors; // Metadata transfered to nmethod to enable Continuations lock-detection fastpath
372 bool _has_scoped_access; // For shared scope closure
373 bool _clinit_barrier_on_entry; // True if clinit barrier is needed on nmethod entry
374 bool _has_clinit_barriers; // True if compiled code has clinit barriers
375 int _loop_opts_cnt; // loop opts round
376 uint _stress_seed; // Seed for stress testing
377
378 // Compilation environment.
379 Arena _comp_arena; // Arena with lifetime equivalent to Compile
380 void* _barrier_set_state; // Potential GC barrier state for Compile
381 ciEnv* _env; // CI interface
382 DirectiveSet* _directive; // Compiler directive
383 CompileLog* _log; // from CompilerThread
384 CHeapStringHolder _failure_reason; // for record_failure/failing pattern
385 CompilationFailureInfo* _first_failure_details; // Details for the first failure happening during compilation
386 GrowableArray<CallGenerator*> _intrinsics; // List of intrinsics.
387 GrowableArray<Node*> _macro_nodes; // List of nodes which need to be expanded before matching.
388 GrowableArray<ParsePredicateNode*> _parse_predicates; // List of Parse Predicates.
389 // List of OpaqueTemplateAssertionPredicateNode nodes for Template Assertion Predicates which can be seen as list
390 // of Template Assertion Predicates themselves.
391 GrowableArray<OpaqueTemplateAssertionPredicateNode*> _template_assertion_predicate_opaques;
392 GrowableArray<Node*> _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common
393 GrowableArray<Node*> _for_post_loop_igvn; // List of nodes for IGVN after loop opts are over
394 GrowableArray<Node*> _for_merge_stores_igvn; // List of nodes for IGVN merge stores
566 int compile_id() const { return _compile_id; }
567 DirectiveSet* directive() const { return _directive; }
568
569 // Does this compilation allow instructions to subsume loads? User
570 // instructions that subsume a load may result in an unschedulable
571 // instruction sequence.
572 bool subsume_loads() const { return _options._subsume_loads; }
573 /** Do escape analysis. */
574 bool do_escape_analysis() const { return _options._do_escape_analysis; }
575 bool do_iterative_escape_analysis() const { return _options._do_iterative_escape_analysis; }
576 bool do_reduce_allocation_merges() const { return _options._do_reduce_allocation_merges; }
577 /** Do boxing elimination. */
578 bool eliminate_boxing() const { return _options._eliminate_boxing; }
579 /** Do aggressive boxing elimination. */
580 bool aggressive_unboxing() const { return _options._eliminate_boxing && AggressiveUnboxing; }
581 bool should_install_code() const { return _options._install_code; }
582 /** Do locks coarsening. */
583 bool do_locks_coarsening() const { return _options._do_locks_coarsening; }
584 bool do_superword() const { return _options._do_superword; }
585
586 bool do_clinit_barriers() const { return _options._for_preload; }
587 bool for_preload() const { return _options._for_preload; }
588
589 // Other fixed compilation parameters.
590 ciMethod* method() const { return _method; }
591 int entry_bci() const { return _entry_bci; }
592 bool is_osr_compilation() const { return _entry_bci != InvocationEntryBci; }
593 bool is_method_compilation() const { return (_method != nullptr && !_method->flags().is_native()); }
594 const TypeFunc* tf() const { assert(_tf!=nullptr, ""); return _tf; }
595 void init_tf(const TypeFunc* tf) { assert(_tf==nullptr, ""); _tf = tf; }
596 InlineTree* ilt() const { return _ilt; }
597 address stub_function() const { return _stub_function; }
598 const char* stub_name() const { return _stub_name; }
599 StubId stub_id() const { return _stub_id; }
600 address stub_entry_point() const { return _stub_entry_point; }
601 void set_stub_entry_point(address z) { _stub_entry_point = z; }
602
603 // Control of this compilation.
604 int fixed_slots() const { assert(_fixed_slots >= 0, ""); return _fixed_slots; }
605 void set_fixed_slots(int n) { _fixed_slots = n; }
606 void set_inlining_progress(bool z) { _inlining_progress = z; }
607 int inlining_progress() const { return _inlining_progress; }
608 void set_inlining_incrementally(bool z) { _inlining_incrementally = z; }
648 void set_do_freq_based_layout(bool z){ _do_freq_based_layout = z; }
649 bool do_vector_loop() const { return _do_vector_loop; }
650 void set_do_vector_loop(bool z) { _do_vector_loop = z; }
651 bool use_cmove() const { return _use_cmove; }
652 void set_use_cmove(bool z) { _use_cmove = z; }
653 bool do_aliasing() const { return _do_aliasing; }
654 bool print_assembly() const { return _print_assembly; }
655 void set_print_assembly(bool z) { _print_assembly = z; }
656 bool print_inlining() const { return _print_inlining; }
657 void set_print_inlining(bool z) { _print_inlining = z; }
658 bool print_intrinsics() const { return _print_intrinsics; }
659 void set_print_intrinsics(bool z) { _print_intrinsics = z; }
660 uint max_node_limit() const { return (uint)_max_node_limit; }
661 void set_max_node_limit(uint n) { _max_node_limit = n; }
662 bool clinit_barrier_on_entry() { return _clinit_barrier_on_entry; }
663 void set_clinit_barrier_on_entry(bool z) { _clinit_barrier_on_entry = z; }
664 bool has_monitors() const { return _has_monitors; }
665 void set_has_monitors(bool v) { _has_monitors = v; }
666 bool has_scoped_access() const { return _has_scoped_access; }
667 void set_has_scoped_access(bool v) { _has_scoped_access = v; }
668 bool has_clinit_barriers() { return _has_clinit_barriers; }
669 void set_has_clinit_barriers(bool z) { _has_clinit_barriers = z; }
670
671 // check the CompilerOracle for special behaviours for this compile
672 bool method_has_option(CompileCommandEnum option) const {
673 return method() != nullptr && method()->has_option(option);
674 }
675
676 #ifndef PRODUCT
677 uint next_igv_idx() { return _igv_idx++; }
678 bool trace_opto_output() const { return _trace_opto_output; }
679 void print_phase(const char* phase_name);
680 void print_ideal_ir(const char* compile_phase_name) const;
681 bool should_print_ideal() const { return _directive->PrintIdealOption; }
682 bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; }
683 void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
684 int _in_dump_cnt; // Required for dumping ir nodes.
685 #endif
686 bool has_irreducible_loop() const { return _has_irreducible_loop; }
687 void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; }
688
689 Ticks _latest_stage_start_counter;
|