< prev index next >

src/hotspot/share/opto/doCall.cpp

Print this page




 118   CallGenerator* cg_intrinsic = NULL;
 119   if (allow_inline && allow_intrinsics) {
 120     CallGenerator* cg = find_intrinsic(callee, call_does_dispatch);
 121     if (cg != NULL) {
 122       if (cg->is_predicated()) {
 123         // Code without intrinsic but, hopefully, inlined.
 124         CallGenerator* inline_cg = this->call_generator(callee,
 125               vtable_index, call_does_dispatch, jvms, allow_inline, prof_factor, speculative_receiver_type, false);
 126         if (inline_cg != NULL) {
 127           cg = CallGenerator::for_predicated_intrinsic(cg, inline_cg);
 128         }
 129       }
 130 
 131       // If intrinsic does the virtual dispatch, we try to use the type profile
 132       // first, and hopefully inline it as the regular virtual call below.
 133       // We will retry the intrinsic if nothing had claimed it afterwards.
 134       if (cg->does_virtual_dispatch()) {
 135         cg_intrinsic = cg;
 136         cg = NULL;
 137       } else if (should_delay_vector_inlining(callee, jvms)) {
 138         assert(!delayed_forbidden, "delay should be allowed");
 139         return CallGenerator::for_late_inline(callee, cg);
 140       } else {
 141         return cg;
 142       }
 143     }
 144   }
 145 
 146   // Do method handle calls.
 147   // NOTE: This must happen before normal inlining logic below since
 148   // MethodHandle.invoke* are native methods which obviously don't
 149   // have bytecodes and so normal inlining fails.
 150   if (callee->is_method_handle_intrinsic()) {
 151     CallGenerator* cg = CallGenerator::for_method_handle_call(jvms, caller, callee);
 152     return cg;
 153   }
 154 
 155   // If explicit rounding is required, do not inline strict into non-strict code (or the reverse).
 156   if (Matcher::strict_fp_requires_explicit_rounding &&
 157       caller->is_strict() != callee->is_strict()) {
 158     allow_inline = false;




 118   CallGenerator* cg_intrinsic = NULL;
 119   if (allow_inline && allow_intrinsics) {
 120     CallGenerator* cg = find_intrinsic(callee, call_does_dispatch);
 121     if (cg != NULL) {
 122       if (cg->is_predicated()) {
 123         // Code without intrinsic but, hopefully, inlined.
 124         CallGenerator* inline_cg = this->call_generator(callee,
 125               vtable_index, call_does_dispatch, jvms, allow_inline, prof_factor, speculative_receiver_type, false);
 126         if (inline_cg != NULL) {
 127           cg = CallGenerator::for_predicated_intrinsic(cg, inline_cg);
 128         }
 129       }
 130 
 131       // If intrinsic does the virtual dispatch, we try to use the type profile
 132       // first, and hopefully inline it as the regular virtual call below.
 133       // We will retry the intrinsic if nothing had claimed it afterwards.
 134       if (cg->does_virtual_dispatch()) {
 135         cg_intrinsic = cg;
 136         cg = NULL;
 137       } else if (should_delay_vector_inlining(callee, jvms)) {

 138         return CallGenerator::for_late_inline(callee, cg);
 139       } else {
 140         return cg;
 141       }
 142     }
 143   }
 144 
 145   // Do method handle calls.
 146   // NOTE: This must happen before normal inlining logic below since
 147   // MethodHandle.invoke* are native methods which obviously don't
 148   // have bytecodes and so normal inlining fails.
 149   if (callee->is_method_handle_intrinsic()) {
 150     CallGenerator* cg = CallGenerator::for_method_handle_call(jvms, caller, callee);
 151     return cg;
 152   }
 153 
 154   // If explicit rounding is required, do not inline strict into non-strict code (or the reverse).
 155   if (Matcher::strict_fp_requires_explicit_rounding &&
 156       caller->is_strict() != callee->is_strict()) {
 157     allow_inline = false;


< prev index next >