hotspot/src/share/vm/opto/bytecodeInfo.cpp
changeset 17383 3665c0901a0d
parent 16373 8f8a2a1c5d09
child 17386 e3b1a1af9968
equal deleted inserted replaced
17382:bba473b81ec0 17383:3665c0901a0d
    95             caller_method != C->method() &&
    95             caller_method != C->method() &&
    96             caller_method->holder()->is_subclass_of(callee_method->holder()))
    96             caller_method->holder()->is_subclass_of(callee_method->holder()))
    97          );
    97          );
    98 }
    98 }
    99 
    99 
       
   100 static bool is_unboxing_method(ciMethod* callee_method, Compile* C) {
       
   101   // Force inlining unboxing accessor.
       
   102   return C->eliminate_boxing() && callee_method->is_unboxing_method();
       
   103 }
       
   104 
   100 // positive filter: should callee be inlined?
   105 // positive filter: should callee be inlined?
   101 bool InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_method,
   106 bool InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_method,
   102                                int caller_bci, ciCallProfile& profile,
   107                                int caller_bci, ciCallProfile& profile,
   103                                WarmCallInfo* wci_result) {
   108                                WarmCallInfo* wci_result) {
   104   // Allows targeted inlining
   109   // Allows targeted inlining
   142   int freq = call_site_count / invoke_count;
   147   int freq = call_site_count / invoke_count;
   143 
   148 
   144   // bump the max size if the call is frequent
   149   // bump the max size if the call is frequent
   145   if ((freq >= InlineFrequencyRatio) ||
   150   if ((freq >= InlineFrequencyRatio) ||
   146       (call_site_count >= InlineFrequencyCount) ||
   151       (call_site_count >= InlineFrequencyCount) ||
       
   152       is_unboxing_method(callee_method, C) ||
   147       is_init_with_ea(callee_method, caller_method, C)) {
   153       is_init_with_ea(callee_method, caller_method, C)) {
   148 
   154 
   149     max_inline_size = C->freq_inline_size();
   155     max_inline_size = C->freq_inline_size();
   150     if (size <= max_inline_size && TraceFrequencyInlining) {
   156     if (size <= max_inline_size && TraceFrequencyInlining) {
   151       CompileTask::print_inline_indent(inline_level());
   157       CompileTask::print_inline_indent(inline_level());
   235   if (callee_method->should_inline()) {
   241   if (callee_method->should_inline()) {
   236     set_msg("force inline by CompilerOracle");
   242     set_msg("force inline by CompilerOracle");
   237     return false;
   243     return false;
   238   }
   244   }
   239 
   245 
       
   246   if (callee_method->should_not_inline()) {
       
   247     set_msg("disallowed by CompilerOracle");
       
   248     return true;
       
   249   }
       
   250 
       
   251 #ifndef PRODUCT
       
   252   if (ciReplay::should_not_inline(callee_method)) {
       
   253     set_msg("disallowed by ciReplay");
       
   254     return true;
       
   255   }
       
   256 #endif
       
   257 
   240   // Now perform checks which are heuristic
   258   // Now perform checks which are heuristic
       
   259 
       
   260   if (is_unboxing_method(callee_method, C)) {
       
   261     // Inline unboxing methods.
       
   262     return false;
       
   263   }
   241 
   264 
   242   if (!callee_method->force_inline()) {
   265   if (!callee_method->force_inline()) {
   243     if (callee_method->has_compiled_code() &&
   266     if (callee_method->has_compiled_code() &&
   244         callee_method->instructions_size() > InlineSmallCode) {
   267         callee_method->instructions_size() > InlineSmallCode) {
   245       set_msg("already compiled into a big method");
   268       set_msg("already compiled into a big method");
   258       set_msg("exception method");
   281       set_msg("exception method");
   259       return true;
   282       return true;
   260     }
   283     }
   261   }
   284   }
   262 
   285 
   263   if (callee_method->should_not_inline()) {
       
   264     set_msg("disallowed by CompilerOracle");
       
   265     return true;
       
   266   }
       
   267 
       
   268 #ifndef PRODUCT
       
   269   if (ciReplay::should_not_inline(callee_method)) {
       
   270     set_msg("disallowed by ciReplay");
       
   271     return true;
       
   272   }
       
   273 #endif
       
   274 
       
   275   if (UseStringCache) {
   286   if (UseStringCache) {
   276     // Do not inline StringCache::profile() method used only at the beginning.
   287     // Do not inline StringCache::profile() method used only at the beginning.
   277     if (callee_method->name() == ciSymbol::profile_name() &&
   288     if (callee_method->name() == ciSymbol::profile_name() &&
   278         callee_method->holder()->name() == ciSymbol::java_lang_StringCache()) {
   289         callee_method->holder()->name() == ciSymbol::java_lang_StringCache()) {
   279       set_msg("profiling method");
   290       set_msg("profiling method");
   294       set_msg("never executed");
   305       set_msg("never executed");
   295       return true;
   306       return true;
   296     }
   307     }
   297 
   308 
   298     if (is_init_with_ea(callee_method, caller_method, C)) {
   309     if (is_init_with_ea(callee_method, caller_method, C)) {
   299 
       
   300       // Escape Analysis: inline all executed constructors
   310       // Escape Analysis: inline all executed constructors
   301 
   311       return false;
   302     } else if (!callee_method->was_executed_more_than(MIN2(MinInliningThreshold,
   312     } else if (!callee_method->was_executed_more_than(MIN2(MinInliningThreshold,
   303                                                            CompileThreshold >> 1))) {
   313                                                            CompileThreshold >> 1))) {
   304       set_msg("executed < MinInliningThreshold times");
   314       set_msg("executed < MinInliningThreshold times");
   305       return true;
   315       return true;
   306     }
   316     }