Mercurial > hg > graal-jvmci-8
diff src/share/vm/opto/doCall.cpp @ 3852:fdb992d83a87
7071653: JSR 292: call site change notification should be pushed not pulled
Reviewed-by: kvn, never, bdelsart
author | twisti |
---|---|
date | Tue, 16 Aug 2011 04:14:05 -0700 |
parents | aabf25fa3f05 |
children | aa67216400d3 |
line wrap: on
line diff
--- a/src/share/vm/opto/doCall.cpp Thu Aug 11 12:08:11 2011 -0700 +++ b/src/share/vm/opto/doCall.cpp Tue Aug 16 04:14:05 2011 -0700 @@ -114,7 +114,7 @@ if (cg != NULL) return cg; } - // Do MethodHandle calls. + // Do method handle calls. // NOTE: This must happen before normal inlining logic below since // MethodHandle.invoke* are native methods which obviously don't // have bytecodes and so normal inlining fails. @@ -127,33 +127,25 @@ if (cg != NULL) { return cg; } - return CallGenerator::for_direct_call(call_method); } else { - // Get the MethodHandle from the CallSite. + // Get the CallSite object. ciMethod* caller_method = jvms->method(); ciBytecodeStream str(caller_method); str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci. - ciCallSite* call_site = str.get_call_site(); - ciMethodHandle* method_handle = call_site->get_target(); + ciCallSite* call_site = str.get_call_site(); - // Set the callee to have access to the class and signature in - // the MethodHandleCompiler. - method_handle->set_callee(call_method); - method_handle->set_caller(caller); - method_handle->set_call_profile(profile); - - // Get an adapter for the MethodHandle. - ciMethod* target_method = method_handle->get_invokedynamic_adapter(); - if (target_method != NULL) { - CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor); - if (hit_cg != NULL && hit_cg->is_inline()) { - CallGenerator* miss_cg = CallGenerator::for_dynamic_call(call_method); - return CallGenerator::for_predicted_dynamic_call(method_handle, miss_cg, hit_cg, prof_factor); + // Inline constant and mutable call sites. We don't inline + // volatile call sites optimistically since they are specified + // to change their value often and that would result in a lot of + // deoptimizations and recompiles. + if (call_site->is_constant_call_site() || call_site->is_mutable_call_site()) { + CallGenerator* cg = CallGenerator::for_invokedynamic_inline(call_site, jvms, caller, call_method, profile); + if (cg != NULL) { + return cg; } } - // If something failed, generate a normal dynamic call. return CallGenerator::for_dynamic_call(call_method); }