Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/compilationPolicy.cpp @ 10200:d1c9384eecb4
8012322: Tiered: CompilationPolicy::can_be_compiled(CompLevel_all) mistakenly return false
Reviewed-by: kvn, vlivanov
author | iignatyev |
---|---|
date | Fri, 26 Apr 2013 07:21:41 -0700 |
parents | 8df6ddda8090 |
children | 836a62f43af9 f99558245e5c |
comparison
equal
deleted
inserted
replaced
10197:7b23cb975cf2 | 10200:d1c9384eecb4 |
---|---|
107 (UseCompiler && AlwaysCompileLoopMethods && m->has_loops() && CompileBroker::should_compile_new_jobs()); // eagerly compile loop methods | 107 (UseCompiler && AlwaysCompileLoopMethods && m->has_loops() && CompileBroker::should_compile_new_jobs()); // eagerly compile loop methods |
108 } | 108 } |
109 | 109 |
110 // Returns true if m is allowed to be compiled | 110 // Returns true if m is allowed to be compiled |
111 bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) { | 111 bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) { |
112 // allow any levels for WhiteBox | |
113 assert(WhiteBoxAPI || comp_level == CompLevel_all || is_compile(comp_level), "illegal compilation level"); | |
114 | |
112 if (m->is_abstract()) return false; | 115 if (m->is_abstract()) return false; |
113 if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false; | 116 if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false; |
114 | 117 |
115 // Math intrinsics should never be compiled as this can lead to | 118 // Math intrinsics should never be compiled as this can lead to |
116 // monotonicity problems because the interpreter will prefer the | 119 // monotonicity problems because the interpreter will prefer the |
120 // modes. | 123 // modes. |
121 if (!AbstractInterpreter::can_be_compiled(m)) { | 124 if (!AbstractInterpreter::can_be_compiled(m)) { |
122 return false; | 125 return false; |
123 } | 126 } |
124 if (comp_level == CompLevel_all) { | 127 if (comp_level == CompLevel_all) { |
125 return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization); | 128 if (TieredCompilation) { |
129 // enough to be compilable at any level for tiered | |
130 return !m->is_not_compilable(CompLevel_simple) || !m->is_not_compilable(CompLevel_full_optimization); | |
131 } else { | |
132 // must be compilable at available level for non-tiered | |
133 return !m->is_not_compilable(CompLevel_highest_tier); | |
134 } | |
126 } else if (is_compile(comp_level)) { | 135 } else if (is_compile(comp_level)) { |
127 return !m->is_not_compilable(comp_level); | 136 return !m->is_not_compilable(comp_level); |
128 } | 137 } |
129 return false; | 138 return false; |
130 } | 139 } |
434 const int comp_level = CompLevel_highest_tier; | 443 const int comp_level = CompLevel_highest_tier; |
435 const int hot_count = m->invocation_count(); | 444 const int hot_count = m->invocation_count(); |
436 reset_counter_for_invocation_event(m); | 445 reset_counter_for_invocation_event(m); |
437 const char* comment = "count"; | 446 const char* comment = "count"; |
438 | 447 |
439 if (is_compilation_enabled() && can_be_compiled(m)) { | 448 if (is_compilation_enabled() && can_be_compiled(m, comp_level)) { |
440 nmethod* nm = m->code(); | 449 nmethod* nm = m->code(); |
441 if (nm == NULL ) { | 450 if (nm == NULL ) { |
442 CompileBroker::compile_method(m, InvocationEntryBci, comp_level, m, hot_count, comment, thread); | 451 CompileBroker::compile_method(m, InvocationEntryBci, comp_level, m, hot_count, comment, thread); |
443 } | 452 } |
444 } | 453 } |
447 void SimpleCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) { | 456 void SimpleCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) { |
448 const int comp_level = CompLevel_highest_tier; | 457 const int comp_level = CompLevel_highest_tier; |
449 const int hot_count = m->backedge_count(); | 458 const int hot_count = m->backedge_count(); |
450 const char* comment = "backedge_count"; | 459 const char* comment = "backedge_count"; |
451 | 460 |
452 if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m)) { | 461 if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m, comp_level)) { |
453 CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread); | 462 CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread); |
454 NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));) | 463 NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));) |
455 } | 464 } |
456 } | 465 } |
457 // StackWalkCompPolicy - walk up stack to find a suitable method to compile | 466 // StackWalkCompPolicy - walk up stack to find a suitable method to compile |
465 const int comp_level = CompLevel_highest_tier; | 474 const int comp_level = CompLevel_highest_tier; |
466 const int hot_count = m->invocation_count(); | 475 const int hot_count = m->invocation_count(); |
467 reset_counter_for_invocation_event(m); | 476 reset_counter_for_invocation_event(m); |
468 const char* comment = "count"; | 477 const char* comment = "count"; |
469 | 478 |
470 if (is_compilation_enabled() && m->code() == NULL && can_be_compiled(m)) { | 479 if (is_compilation_enabled() && m->code() == NULL && can_be_compiled(m, comp_level)) { |
471 ResourceMark rm(thread); | 480 ResourceMark rm(thread); |
472 frame fr = thread->last_frame(); | 481 frame fr = thread->last_frame(); |
473 assert(fr.is_interpreted_frame(), "must be interpreted"); | 482 assert(fr.is_interpreted_frame(), "must be interpreted"); |
474 assert(fr.interpreter_frame_method() == m(), "bad method"); | 483 assert(fr.interpreter_frame_method() == m(), "bad method"); |
475 | 484 |
503 void StackWalkCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) { | 512 void StackWalkCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) { |
504 const int comp_level = CompLevel_highest_tier; | 513 const int comp_level = CompLevel_highest_tier; |
505 const int hot_count = m->backedge_count(); | 514 const int hot_count = m->backedge_count(); |
506 const char* comment = "backedge_count"; | 515 const char* comment = "backedge_count"; |
507 | 516 |
508 if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m)) { | 517 if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m, comp_level)) { |
509 CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread); | 518 CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread); |
510 NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));) | 519 NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));) |
511 } | 520 } |
512 } | 521 } |
513 | 522 |
598 } | 607 } |
599 | 608 |
600 | 609 |
601 // If the caller method is too big or something then we do not want to | 610 // If the caller method is too big or something then we do not want to |
602 // compile it just to inline a method | 611 // compile it just to inline a method |
603 if (!can_be_compiled(next_m)) { | 612 if (!can_be_compiled(next_m, CompLevel_any)) { |
604 msg = "caller cannot be compiled"; | 613 msg = "caller cannot be compiled"; |
605 break; | 614 break; |
606 } | 615 } |
607 | 616 |
608 if( next_m->name() == vmSymbols::class_initializer_name() ) { | 617 if( next_m->name() == vmSymbols::class_initializer_name() ) { |