6658428: C2 doesn't inline java method if corresponding intrinsic failed to inline
Allow fallback to non-intrinsic inline case Reviewed-by: kvn, jrose, never
This commit is contained in:
parent
2e8a110092
commit
36efb40d10
@ -631,7 +631,7 @@ class Compile : public Phase {
|
||||
|
||||
// Decide how to build a call.
|
||||
// The profile factor is a discount to apply to this site's interp. profile.
|
||||
CallGenerator* call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, JVMState* jvms, bool allow_inline, float profile_factor);
|
||||
CallGenerator* call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, JVMState* jvms, bool allow_inline, float profile_factor, bool allow_intrinsics = true);
|
||||
bool should_delay_inlining(ciMethod* call_method, JVMState* jvms);
|
||||
|
||||
// Report if there were too many traps at a current method and bci.
|
||||
|
@ -61,7 +61,7 @@ void trace_type_profile(ciMethod *method, int depth, int bci, ciMethod *prof_met
|
||||
|
||||
CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual,
|
||||
JVMState* jvms, bool allow_inline,
|
||||
float prof_factor) {
|
||||
float prof_factor, bool allow_intrinsics) {
|
||||
ciMethod* caller = jvms->method();
|
||||
int bci = jvms->bci();
|
||||
Bytecodes::Code bytecode = caller->java_code_at_bci(bci);
|
||||
@ -108,7 +108,7 @@ CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index,
|
||||
// then we return it as the inlined version of the call.
|
||||
// We do this before the strict f.p. check below because the
|
||||
// intrinsics handle strict f.p. correctly.
|
||||
if (allow_inline) {
|
||||
if (allow_inline && allow_intrinsics) {
|
||||
CallGenerator* cg = find_intrinsic(call_method, call_is_virtual);
|
||||
if (cg != NULL) return cg;
|
||||
}
|
||||
@ -455,21 +455,12 @@ void Parse::do_call() {
|
||||
// cg->generate(), we are committed. If it fails, the whole
|
||||
// compilation task is compromised.
|
||||
if (failing()) return;
|
||||
#ifndef PRODUCT
|
||||
if (PrintOpto || PrintOptoInlining || PrintInlining) {
|
||||
// Only one fall-back, so if an intrinsic fails, ignore any bytecodes.
|
||||
if (cg->is_intrinsic() && call_method->code_size() > 0) {
|
||||
tty->print("Bailed out of intrinsic, will not inline: ");
|
||||
call_method->print_name(); tty->cr();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// This can happen if a library intrinsic is available, but refuses
|
||||
// the call site, perhaps because it did not match a pattern the
|
||||
// intrinsic was expecting to optimize. The fallback position is
|
||||
// to call out-of-line.
|
||||
try_inline = false; // Inline tactic bailed out.
|
||||
cg = C->call_generator(call_method, vtable_index, call_is_virtual, jvms, try_inline, prof_factor());
|
||||
// intrinsic was expecting to optimize. Should always be possible to
|
||||
// get a normal java call that may inline in that case
|
||||
cg = C->call_generator(call_method, vtable_index, call_is_virtual, jvms, try_inline, prof_factor(), /* allow_intrinsics= */ false);
|
||||
if ((new_jvms = cg->generate(jvms)) == NULL) {
|
||||
guarantee(failing(), "call failed to generate: calls should work");
|
||||
return;
|
||||
|
@ -338,8 +338,27 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_bitCount_i:
|
||||
if (!Matcher::has_match_rule(Op_PopCountI)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_bitCount_l:
|
||||
if (!UsePopCountInstruction) return NULL;
|
||||
if (!Matcher::has_match_rule(Op_PopCountL)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_numberOfLeadingZeros_i:
|
||||
if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_numberOfLeadingZeros_l:
|
||||
if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_numberOfTrailingZeros_i:
|
||||
if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_numberOfTrailingZeros_l:
|
||||
if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return NULL;
|
||||
break;
|
||||
|
||||
case vmIntrinsics::_Reference_get:
|
||||
@ -416,14 +435,12 @@ JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
|
||||
return kit.transfer_exceptions_into_jvms();
|
||||
}
|
||||
|
||||
if (PrintIntrinsics) {
|
||||
// The intrinsic bailed out
|
||||
if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
|
||||
if (jvms->has_method()) {
|
||||
// Not a root compile.
|
||||
tty->print("Did not inline intrinsic %s%s at bci:%d in",
|
||||
vmIntrinsics::name_at(intrinsic_id()),
|
||||
(is_virtual() ? " (virtual)" : ""), kit.bci());
|
||||
kit.caller()->print_short_name(tty);
|
||||
tty->print_cr(" (%d bytes)", kit.caller()->code_size());
|
||||
const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)";
|
||||
CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), msg);
|
||||
} else {
|
||||
// Root compile
|
||||
tty->print("Did not generate intrinsic %s%s at bci:%d in",
|
||||
@ -5453,4 +5470,3 @@ bool LibraryCallKit::inline_reference_get() {
|
||||
push(result);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user