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 } |