--- old/src/hotspot/share/runtime/sharedRuntime.cpp 2019-01-24 12:57:52.302174273 +0100 +++ new/src/hotspot/share/runtime/sharedRuntime.cpp 2019-01-24 12:57:45.820183460 +0100 @@ -1540,16 +1540,27 @@ // resolve a static call and patch code JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_static_call_C(JavaThread *thread )) methodHandle callee_method; - JRT_BLOCK - callee_method = SharedRuntime::resolve_helper(thread, false, false, CHECK_NULL); + JRT_BLOCK { + RegisterMap cbl_map(thread, false); + frame caller_frame = thread->last_frame().sender(&cbl_map); + CodeBlob* caller_cb = caller_frame.cb(); + guarantee(caller_cb != NULL && caller_cb->is_compiled(), "must be called from compiled method"); + CompiledMethod* caller_nm = caller_cb->as_compiled_method_or_null(); + SimpleScopeDesc ssd(caller_nm, caller_frame.pc()); + Bytecode bc(ssd.method(), ssd.method()->bcp_from(ssd.bci())); + if (bc.code() == Bytecodes::_if_acmpeq || bc.code() == Bytecodes::_if_acmpne) { + SystemDictionary::ValueBootstrapMethods_klass()->initialize(CHECK_NULL); + callee_method = SystemDictionary::ValueBootstrapMethods_klass()->find_method(vmSymbols::isSubstitutable_name(), vmSymbols::object_object_boolean_signature()); + } else { + callee_method = SharedRuntime::resolve_helper(thread, false, false, CHECK_NULL); + } thread->set_vm_result_2(callee_method()); - JRT_BLOCK_END + } JRT_BLOCK_END // return compiled code entry point after potential safepoints assert(callee_method->verified_code_entry() != NULL, " Jump to zero!"); return callee_method->verified_code_entry(); JRT_END - // resolve virtual call and update inline cache to monomorphic JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_virtual_call_C(JavaThread *thread )) methodHandle callee_method;