--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Mon Jul 23 13:04:59 2012 -0700
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Tue Jul 24 10:51:00 2012 -0700
@@ -93,7 +93,7 @@
);
}
-// positive filter: should send be inlined? returns NULL, if yes, or rejection msg
+// positive filter: should callee be inlined? returns NULL, if yes, or rejection msg
const char* InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const {
// Allows targeted inlining
if(callee_method->should_inline()) {
@@ -131,33 +131,6 @@
int call_site_count = method()->scale_count(profile.count());
int invoke_count = method()->interpreter_invocation_count();
- // Bytecoded method handle adapters do not have interpreter
- // profiling data but only made up MDO data. Get the counter from
- // there.
- if (caller_method->is_method_handle_adapter()) {
- assert(method()->method_data_or_null(), "must have an MDO");
- ciMethodData* mdo = method()->method_data();
- ciProfileData* mha_profile = mdo->bci_to_data(caller_bci);
- assert(mha_profile, "must exist");
- CounterData* cd = mha_profile->as_CounterData();
- invoke_count = cd->count();
- if (invoke_count == 0) {
- return "method handle not reached";
- }
-
- if (_caller_jvms != NULL && _caller_jvms->method() != NULL &&
- _caller_jvms->method()->method_data() != NULL &&
- !_caller_jvms->method()->method_data()->is_empty()) {
- ciMethodData* mdo = _caller_jvms->method()->method_data();
- ciProfileData* mha_profile = mdo->bci_to_data(_caller_jvms->bci());
- assert(mha_profile, "must exist");
- CounterData* cd = mha_profile->as_CounterData();
- call_site_count = cd->count();
- } else {
- call_site_count = invoke_count; // use the same value
- }
- }
-
assert(invoke_count != 0, "require invocation count greater than zero");
int freq = call_site_count / invoke_count;
@@ -189,15 +162,16 @@
}
-// negative filter: should send NOT be inlined? returns NULL, ok to inline, or rejection msg
+// negative filter: should callee NOT be inlined? returns NULL, ok to inline, or rejection msg
const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* caller_method, WarmCallInfo* wci_result) const {
// negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
if (!UseOldInlining) {
const char* fail = NULL;
- if (callee_method->is_abstract()) fail = "abstract method";
+ if ( callee_method->is_abstract()) fail = "abstract method";
// note: we allow ik->is_abstract()
- if (!callee_method->holder()->is_initialized()) fail = "method holder not initialized";
- if (callee_method->is_native()) fail = "native method";
+ if (!callee_method->holder()->is_initialized()) fail = "method holder not initialized";
+ if ( callee_method->is_native()) fail = "native method";
+ if ( callee_method->dont_inline()) fail = "don't inline by annotation";
if (fail) {
*wci_result = *(WarmCallInfo::always_cold());
@@ -217,7 +191,8 @@
}
}
- if (callee_method->has_compiled_code() && callee_method->instructions_size(CompLevel_full_optimization) > InlineSmallCode) {
+ if (callee_method->has_compiled_code() &&
+ callee_method->instructions_size(CompLevel_full_optimization) > InlineSmallCode) {
wci_result->set_profit(wci_result->profit() * 0.1);
// %%% adjust wci_result->size()?
}
@@ -225,26 +200,25 @@
return NULL;
}
- // Always inline MethodHandle methods and generated MethodHandle adapters.
- if (callee_method->is_method_handle_invoke() || callee_method->is_method_handle_adapter())
- return NULL;
+ // First check all inlining restrictions which are required for correctness
+ if ( callee_method->is_abstract()) return "abstract method";
+ // note: we allow ik->is_abstract()
+ if (!callee_method->holder()->is_initialized()) return "method holder not initialized";
+ if ( callee_method->is_native()) return "native method";
+ if ( callee_method->dont_inline()) return "don't inline by annotation";
+ if ( callee_method->has_unloaded_classes_in_signature()) return "unloaded signature classes";
- // First check all inlining restrictions which are required for correctness
- if (callee_method->is_abstract()) return "abstract method";
- // note: we allow ik->is_abstract()
- if (!callee_method->holder()->is_initialized()) return "method holder not initialized";
- if (callee_method->is_native()) return "native method";
- if (callee_method->has_unloaded_classes_in_signature()) return "unloaded signature classes";
-
- if (callee_method->should_inline()) {
+ if (callee_method->force_inline() || callee_method->should_inline()) {
// ignore heuristic controls on inlining
return NULL;
}
// Now perform checks which are heuristic
- if( callee_method->has_compiled_code() && callee_method->instructions_size(CompLevel_full_optimization) > InlineSmallCode )
+ if (callee_method->has_compiled_code() &&
+ callee_method->instructions_size(CompLevel_full_optimization) > InlineSmallCode) {
return "already compiled into a big method";
+ }
// don't inline exception code unless the top method belongs to an
// exception class
@@ -270,7 +244,7 @@
}
// use frequency-based objections only for non-trivial methods
- if (callee_method->code_size_for_inlining() <= MaxTrivialSize) return NULL;
+ if (callee_method->code_size() <= MaxTrivialSize) return NULL;
// don't use counts with -Xcomp or CTW
if (UseInterpreter && !CompileTheWorld) {
@@ -319,7 +293,7 @@
}
// suppress a few checks for accessors and trivial methods
- if (callee_method->code_size_for_inlining() > MaxTrivialSize) {
+ if (callee_method->code_size() > MaxTrivialSize) {
// don't inline into giant methods
if (C->unique() > (uint)NodeCountInliningCutoff) {
@@ -346,7 +320,7 @@
}
// detect direct and indirect recursive inlining
- {
+ if (!callee_method->is_compiled_lambda_form()) {
// count the current method and the callee
int inline_level = (method() == callee_method) ? 1 : 0;
if (inline_level > MaxRecursiveInlineLevel)
@@ -412,6 +386,7 @@
const char* InlineTree::check_can_parse(ciMethod* callee) {
// Certain methods cannot be parsed at all:
if ( callee->is_native()) return "native method";
+ if ( callee->is_abstract()) return "abstract method";
if (!callee->can_be_compiled()) return "not compilable (disabled)";
if (!callee->has_balanced_monitors()) return "not compilable (unbalanced monitors)";
if ( callee->get_flow_analysis()->failing()) return "not compilable (flow analysis failed)";
@@ -426,7 +401,7 @@
if (Verbose && callee_method) {
const InlineTree *top = this;
while( top->caller_tree() != NULL ) { top = top->caller_tree(); }
- tty->print(" bcs: %d+%d invoked: %d", top->count_inline_bcs(), callee_method->code_size(), callee_method->interpreter_invocation_count());
+ //tty->print(" bcs: %d+%d invoked: %d", top->count_inline_bcs(), callee_method->code_size(), callee_method->interpreter_invocation_count());
}
}
@@ -449,10 +424,7 @@
// Do some initial checks.
if (!pass_initial_checks(caller_method, caller_bci, callee_method)) {
- if (PrintInlining) {
- failure_msg = "failed_initial_checks";
- print_inlining(callee_method, caller_bci, failure_msg);
- }
+ if (PrintInlining) print_inlining(callee_method, caller_bci, "failed initial checks");
return NULL;
}
@@ -539,9 +511,10 @@
}
int max_inline_level_adjust = 0;
if (caller_jvms->method() != NULL) {
- if (caller_jvms->method()->is_method_handle_adapter())
+ if (caller_jvms->method()->is_compiled_lambda_form())
max_inline_level_adjust += 1; // don't count actions in MH or indy adapter frames
- else if (callee_method->is_method_handle_invoke()) {
+ else if (callee_method->is_method_handle_intrinsic() ||
+ callee_method->is_compiled_lambda_form()) {
max_inline_level_adjust += 1; // don't count method handle calls from java.lang.invoke implem
}
if (max_inline_level_adjust != 0 && PrintInlining && (Verbose || WizardMode)) {
@@ -590,7 +563,7 @@
// Given a jvms, which determines a call chain from the root method,
// find the corresponding inline tree.
// Note: This method will be removed or replaced as InlineTree goes away.
-InlineTree* InlineTree::find_subtree_from_root(InlineTree* root, JVMState* jvms, ciMethod* callee, bool create_if_not_found) {
+InlineTree* InlineTree::find_subtree_from_root(InlineTree* root, JVMState* jvms, ciMethod* callee) {
InlineTree* iltp = root;
uint depth = jvms && jvms->has_method() ? jvms->depth() : 0;
for (uint d = 1; d <= depth; d++) {
@@ -599,12 +572,12 @@
assert(jvmsp->method() == iltp->method(), "tree still in sync");
ciMethod* d_callee = (d == depth) ? callee : jvms->of_depth(d+1)->method();
InlineTree* sub = iltp->callee_at(jvmsp->bci(), d_callee);
- if (!sub) {
- if (create_if_not_found && d == depth) {
- return iltp->build_inline_tree_for_callee(d_callee, jvmsp, jvmsp->bci());
+ if (sub == NULL) {
+ if (d == depth) {
+ sub = iltp->build_inline_tree_for_callee(d_callee, jvmsp, jvmsp->bci());
}
- assert(sub != NULL, "should be a sub-ilt here");
- return NULL;
+ guarantee(sub != NULL, "should be a sub-ilt here");
+ return sub;
}
iltp = sub;
}