25 #include "incls/_precompiled.incl" |
25 #include "incls/_precompiled.incl" |
26 #include "incls/_bytecodeInfo.cpp.incl" |
26 #include "incls/_bytecodeInfo.cpp.incl" |
27 |
27 |
28 //============================================================================= |
28 //============================================================================= |
29 //------------------------------InlineTree------------------------------------- |
29 //------------------------------InlineTree------------------------------------- |
30 InlineTree::InlineTree( Compile* c, const InlineTree *caller_tree, ciMethod* callee, JVMState* caller_jvms, int caller_bci, float site_invoke_ratio ) |
30 InlineTree::InlineTree( Compile* c, |
|
31 const InlineTree *caller_tree, ciMethod* callee, |
|
32 JVMState* caller_jvms, int caller_bci, |
|
33 float site_invoke_ratio, int site_depth_adjust) |
31 : C(c), _caller_jvms(caller_jvms), |
34 : C(c), _caller_jvms(caller_jvms), |
32 _caller_tree((InlineTree*)caller_tree), |
35 _caller_tree((InlineTree*)caller_tree), |
33 _method(callee), _site_invoke_ratio(site_invoke_ratio), |
36 _method(callee), _site_invoke_ratio(site_invoke_ratio), |
34 _count_inline_bcs(method()->code_size()) { |
37 _site_depth_adjust(site_depth_adjust), |
|
38 _count_inline_bcs(method()->code_size()) |
|
39 { |
35 NOT_PRODUCT(_count_inlines = 0;) |
40 NOT_PRODUCT(_count_inlines = 0;) |
36 if (_caller_jvms != NULL) { |
41 if (_caller_jvms != NULL) { |
37 // Keep a private copy of the caller_jvms: |
42 // Keep a private copy of the caller_jvms: |
38 _caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms()); |
43 _caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms()); |
39 _caller_jvms->set_bci(caller_jvms->bci()); |
44 _caller_jvms->set_bci(caller_jvms->bci()); |
40 assert(!caller_jvms->should_reexecute(), "there should be no reexecute bytecode with inlining"); |
45 assert(!caller_jvms->should_reexecute(), "there should be no reexecute bytecode with inlining"); |
41 } |
46 } |
42 assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS"); |
47 assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS"); |
43 assert((caller_tree == NULL ? 0 : caller_tree->inline_depth() + 1) == inline_depth(), "correct (redundant) depth parameter"); |
48 assert((caller_tree == NULL ? 0 : caller_tree->stack_depth() + 1) == stack_depth(), "correct (redundant) depth parameter"); |
44 assert(caller_bci == this->caller_bci(), "correct (redundant) bci parameter"); |
49 assert(caller_bci == this->caller_bci(), "correct (redundant) bci parameter"); |
45 if (UseOldInlining) { |
50 if (UseOldInlining) { |
46 // Update hierarchical counts, count_inline_bcs() and count_inlines() |
51 // Update hierarchical counts, count_inline_bcs() and count_inlines() |
47 InlineTree *caller = (InlineTree *)caller_tree; |
52 InlineTree *caller = (InlineTree *)caller_tree; |
48 for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) { |
53 for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) { |
50 NOT_PRODUCT(caller->_count_inlines++;) |
55 NOT_PRODUCT(caller->_count_inlines++;) |
51 } |
56 } |
52 } |
57 } |
53 } |
58 } |
54 |
59 |
55 InlineTree::InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvms, float site_invoke_ratio) |
60 InlineTree::InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvms, |
|
61 float site_invoke_ratio, int site_depth_adjust) |
56 : C(c), _caller_jvms(caller_jvms), _caller_tree(NULL), |
62 : C(c), _caller_jvms(caller_jvms), _caller_tree(NULL), |
57 _method(callee_method), _site_invoke_ratio(site_invoke_ratio), |
63 _method(callee_method), _site_invoke_ratio(site_invoke_ratio), |
58 _count_inline_bcs(method()->code_size()) { |
64 _site_depth_adjust(site_depth_adjust), |
|
65 _count_inline_bcs(method()->code_size()) |
|
66 { |
59 NOT_PRODUCT(_count_inlines = 0;) |
67 NOT_PRODUCT(_count_inlines = 0;) |
60 assert(!UseOldInlining, "do not use for old stuff"); |
68 assert(!UseOldInlining, "do not use for old stuff"); |
61 } |
69 } |
62 |
70 |
63 |
71 |
267 if ((msg = shouldNotInline(callee_method, caller_method, |
275 if ((msg = shouldNotInline(callee_method, caller_method, |
268 wci_result)) != NULL) { |
276 wci_result)) != NULL) { |
269 return msg; |
277 return msg; |
270 } |
278 } |
271 |
279 |
272 bool is_accessor = InlineAccessors && callee_method->is_accessor(); |
280 if (InlineAccessors && callee_method->is_accessor()) { |
|
281 // accessor methods are not subject to any of the following limits. |
|
282 return NULL; |
|
283 } |
273 |
284 |
274 // suppress a few checks for accessors and trivial methods |
285 // suppress a few checks for accessors and trivial methods |
275 if (!is_accessor && callee_method->code_size() > MaxTrivialSize) { |
286 if (callee_method->code_size() > MaxTrivialSize) { |
276 |
287 |
277 // don't inline into giant methods |
288 // don't inline into giant methods |
278 if (C->unique() > (uint)NodeCountInliningCutoff) { |
289 if (C->unique() > (uint)NodeCountInliningCutoff) { |
279 return "NodeCountInliningCutoff"; |
290 return "NodeCountInliningCutoff"; |
280 } |
291 } |
462 // Attempt inlining. |
473 // Attempt inlining. |
463 InlineTree* old_ilt = callee_at(caller_bci, callee_method); |
474 InlineTree* old_ilt = callee_at(caller_bci, callee_method); |
464 if (old_ilt != NULL) { |
475 if (old_ilt != NULL) { |
465 return old_ilt; |
476 return old_ilt; |
466 } |
477 } |
467 InlineTree *ilt = new InlineTree( C, this, callee_method, caller_jvms, caller_bci, recur_frequency ); |
478 int new_depth_adjust = 0; |
|
479 if (caller_jvms->method() != NULL) { |
|
480 if ((caller_jvms->method()->name() == ciSymbol::invoke_name() && |
|
481 caller_jvms->method()->holder()->name() == ciSymbol::java_dyn_MethodHandle()) |
|
482 || caller_jvms->method()->holder()->name() == ciSymbol::java_dyn_InvokeDynamic()) |
|
483 /* @@@ FIXME: |
|
484 if (caller_jvms->method()->is_method_handle_adapter()) |
|
485 */ |
|
486 new_depth_adjust -= 1; // don't count actions in MH or indy adapter frames |
|
487 else if (callee_method->is_method_handle_invoke()) { |
|
488 new_depth_adjust -= 1; // don't count method handle calls from java.dyn implem |
|
489 } |
|
490 if (new_depth_adjust != 0 && PrintInlining) { |
|
491 stringStream nm1; caller_jvms->method()->print_name(&nm1); |
|
492 stringStream nm2; callee_method->print_name(&nm2); |
|
493 tty->print_cr("discounting inlining depth from %s to %s", nm1.base(), nm2.base()); |
|
494 } |
|
495 if (new_depth_adjust != 0 && C->log()) { |
|
496 int id1 = C->log()->identify(caller_jvms->method()); |
|
497 int id2 = C->log()->identify(callee_method); |
|
498 C->log()->elem("inline_depth_discount caller='%d' callee='%d'", id1, id2); |
|
499 } |
|
500 } |
|
501 InlineTree *ilt = new InlineTree(C, this, callee_method, caller_jvms, caller_bci, recur_frequency, _site_depth_adjust + new_depth_adjust); |
468 _subtrees.append( ilt ); |
502 _subtrees.append( ilt ); |
469 |
503 |
470 NOT_PRODUCT( _count_inlines += 1; ) |
504 NOT_PRODUCT( _count_inlines += 1; ) |
471 |
505 |
472 return ilt; |
506 return ilt; |
488 //------------------------------build_inline_tree_root------------------------- |
522 //------------------------------build_inline_tree_root------------------------- |
489 InlineTree *InlineTree::build_inline_tree_root() { |
523 InlineTree *InlineTree::build_inline_tree_root() { |
490 Compile* C = Compile::current(); |
524 Compile* C = Compile::current(); |
491 |
525 |
492 // Root of inline tree |
526 // Root of inline tree |
493 InlineTree *ilt = new InlineTree(C, NULL, C->method(), NULL, -1, 1.0F); |
527 InlineTree *ilt = new InlineTree(C, NULL, C->method(), NULL, -1, 1.0F, 0); |
494 |
528 |
495 return ilt; |
529 return ilt; |
496 } |
530 } |
497 |
531 |
498 |
532 |