--- old/src/hotspot/share/interpreter/interpreterRuntime.cpp 2018-07-09 21:39:06.540197737 -0700 +++ new/src/hotspot/share/interpreter/interpreterRuntime.cpp 2018-07-09 21:39:06.160182920 -0700 @@ -1837,6 +1837,22 @@ // preparing the same method will be sure to see non-null entry & mirror. IRT_END +IRT_ENTRY(void, InterpreterRuntime::deoptimize_caller_frame_for_vt(JavaThread* thread, Method* callee)) + // Called from within the owner thread, so no need for safepoint + if (!callee->is_known_returning_vt() && !callee->is_known_not_returning_vt()) { + callee->check_returning_vt(thread); + } + if (!callee->is_known_returning_vt()) { + // deoptimize the caller only if it was compiled code that's calling a method that returns + // a value type. In this case, the return type must have already been resolved. + return; + } + RegisterMap reg_map(thread); + frame last_frame = thread->last_frame(); + frame caller_frame = last_frame.sender(®_map); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); +IRT_END + #if defined(IA32) || defined(AMD64) || defined(ARM) IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address)) if (src_address == dest_address) {