hotspot/src/share/vm/opto/doCall.cpp
changeset 12107 0d67c9f2abf2
parent 11193 d8de495d05e0
child 12741 9315df9ea655
equal deleted inserted replaced
12106:5a4af5175bd3 12107:0d67c9f2abf2
    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   }