< prev index next >

src/hotspot/share/opto/compile.hpp

Print this page

 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;
< prev index next >