--- old/src/share/vm/opto/compile.hpp 2012-02-21 10:17:37.464565900 +0100 +++ new/src/share/vm/opto/compile.hpp 2012-02-21 10:17:37.216551700 +0100 @@ -631,7 +631,7 @@ // 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. --- old/src/share/vm/opto/doCall.cpp 2012-02-21 10:17:39.328672500 +0100 +++ new/src/share/vm/opto/doCall.cpp 2012-02-21 10:17:39.106659800 +0100 @@ -61,7 +61,7 @@ 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 @@ // 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,24 +455,24 @@ // 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(), false); if ((new_jvms = cg->generate(jvms)) == NULL) { - guarantee(failing(), "call failed to generate: calls should work"); - return; + + // Once again: If it fails, the whole compilation task is compromised. + if (failing()) return; + + // last fallback, out-of-line + try_inline = false; + cg = C->call_generator(call_method, vtable_index, call_is_virtual, jvms, try_inline, prof_factor()); + if ((new_jvms = cg->generate(jvms)) == NULL) { + guarantee(failing(), "call failed to generate: calls should work"); + return; + } } } --- old/src/share/vm/opto/library_call.cpp 2012-02-21 10:17:41.317786300 +0100 +++ new/src/share/vm/opto/library_call.cpp 2012-02-21 10:17:41.092773400 +0100 @@ -339,7 +339,15 @@ case vmIntrinsics::_bitCount_i: case vmIntrinsics::_bitCount_l: - if (!UsePopCountInstruction) return NULL; +#ifdef SPARC + // On sparc these depend on the popcount instruction + // On x86 these intrinsics always exist but may use bsr + case vmIntrinsics::_numberOfLeadingZeros_i: + case vmIntrinsics::_numberOfLeadingZeros_l: + case vmIntrinsics::_numberOfTrailingZeros_i: + case vmIntrinsics::_numberOfTrailingZeros_l: +#endif + if (!UsePopCountInstruction) return NULL; break; case vmIntrinsics::_Reference_get: @@ -416,14 +424,12 @@ return kit.transfer_exceptions_into_jvms(); } - if (PrintIntrinsics) { + // The intrinsic bailed out + if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { + const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)"; 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()); + 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",