--- old/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp 2019-09-26 07:12:32.457232314 -0400 +++ new/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp 2019-09-26 07:12:32.185232323 -0400 @@ -162,16 +162,26 @@ // Creation also verifies the object. NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + NativeInstruction::instruction_size); -#ifndef PRODUCT + +#ifdef ASSERT NativeGeneralJump* jump = nativeGeneralJump_at(method_holder->next_instruction_address()); - // read the value once - volatile intptr_t data = method_holder->data(); - assert(data == 0 || data == (intptr_t)callee(), + // A generated lambda form might be deleted from the Lambdaform + // cache in MethodTypeForm. If a jit compiled lambdaform method + // becomes not entrant and the cache access returns null, the new + // resolve will lead to a new generated LambdaForm. + Method* volatile old_method = reinterpret_cast(method_holder->data()); + assert(old_method == NULL || old_method == callee() || + callee->is_compiled_lambda_form() || + !old_method->method_holder()->is_loader_alive() || + old_method->is_old(), // may be race patching deoptimized nmethod due to redefinition. "a) MT-unsafe modification of inline cache"); - assert(data == 0 || jump->jump_destination() == entry, + + volatile address destination = jump->jump_destination(); + assert(destination == (address)-1 || destination == entry, "b) MT-unsafe modification of inline cache"); #endif + // Update stub. method_holder->set_data((intptr_t)callee()); NativeGeneralJump::insert_unconditional(method_holder->next_instruction_address(), entry);