59 } |
59 } |
60 #endif |
60 #endif |
61 |
61 |
62 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, |
62 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, |
63 JVMState* jvms, bool allow_inline, |
63 JVMState* jvms, bool allow_inline, |
64 float prof_factor) { |
64 float prof_factor, bool allow_intrinsics) { |
65 ciMethod* caller = jvms->method(); |
65 ciMethod* caller = jvms->method(); |
66 int bci = jvms->bci(); |
66 int bci = jvms->bci(); |
67 Bytecodes::Code bytecode = caller->java_code_at_bci(bci); |
67 Bytecodes::Code bytecode = caller->java_code_at_bci(bci); |
68 guarantee(call_method != NULL, "failed method resolution"); |
68 guarantee(call_method != NULL, "failed method resolution"); |
69 |
69 |
106 // Special case the handling of certain common, profitable library |
106 // Special case the handling of certain common, profitable library |
107 // methods. If these methods are replaced with specialized code, |
107 // methods. If these methods are replaced with specialized code, |
108 // then we return it as the inlined version of the call. |
108 // then we return it as the inlined version of the call. |
109 // We do this before the strict f.p. check below because the |
109 // We do this before the strict f.p. check below because the |
110 // intrinsics handle strict f.p. correctly. |
110 // intrinsics handle strict f.p. correctly. |
111 if (allow_inline) { |
111 if (allow_inline && allow_intrinsics) { |
112 CallGenerator* cg = find_intrinsic(call_method, call_is_virtual); |
112 CallGenerator* cg = find_intrinsic(call_method, call_is_virtual); |
113 if (cg != NULL) return cg; |
113 if (cg != NULL) return cg; |
114 } |
114 } |
115 |
115 |
116 // Do method handle calls. |
116 // Do method handle calls. |
453 // it may contaminate the current compile state, making it |
453 // it may contaminate the current compile state, making it |
454 // impossible to pull back and try again. Once we call |
454 // impossible to pull back and try again. Once we call |
455 // cg->generate(), we are committed. If it fails, the whole |
455 // cg->generate(), we are committed. If it fails, the whole |
456 // compilation task is compromised. |
456 // compilation task is compromised. |
457 if (failing()) return; |
457 if (failing()) return; |
458 #ifndef PRODUCT |
458 |
459 if (PrintOpto || PrintOptoInlining || PrintInlining) { |
|
460 // Only one fall-back, so if an intrinsic fails, ignore any bytecodes. |
|
461 if (cg->is_intrinsic() && call_method->code_size() > 0) { |
|
462 tty->print("Bailed out of intrinsic, will not inline: "); |
|
463 call_method->print_name(); tty->cr(); |
|
464 } |
|
465 } |
|
466 #endif |
|
467 // This can happen if a library intrinsic is available, but refuses |
459 // This can happen if a library intrinsic is available, but refuses |
468 // the call site, perhaps because it did not match a pattern the |
460 // the call site, perhaps because it did not match a pattern the |
469 // intrinsic was expecting to optimize. The fallback position is |
461 // intrinsic was expecting to optimize. Should always be possible to |
470 // to call out-of-line. |
462 // get a normal java call that may inline in that case |
471 try_inline = false; // Inline tactic bailed out. |
463 cg = C->call_generator(call_method, vtable_index, call_is_virtual, jvms, try_inline, prof_factor(), /* allow_intrinsics= */ false); |
472 cg = C->call_generator(call_method, vtable_index, call_is_virtual, jvms, try_inline, prof_factor()); |
|
473 if ((new_jvms = cg->generate(jvms)) == NULL) { |
464 if ((new_jvms = cg->generate(jvms)) == NULL) { |
474 guarantee(failing(), "call failed to generate: calls should work"); |
465 guarantee(failing(), "call failed to generate: calls should work"); |
475 return; |
466 return; |
476 } |
467 } |
477 } |
468 } |