--- old/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp 2019-01-15 22:00:08.824561633 -0800 +++ new/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp 2019-01-15 22:00:08.640554869 -0800 @@ -38,7 +38,7 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" -int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register scratch, Label& slow_case) { +int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr, Register scratch, Label& slow_case, bool check_always_locked) { const int aligned_mask = BytesPerWord -1; const int hdr_offset = oopDesc::mark_offset_in_bytes(); assert(hdr == rax, "hdr must be rax, for the cmpxchg instruction"); @@ -60,6 +60,10 @@ // Load object header movptr(hdr, Address(obj, hdr_offset)); + if (check_always_locked) { + testl(hdr, markOopDesc::always_locked_pattern); + jcc(Assembler::notZero, slow_case); + } // and mark it as unlocked orptr(hdr, markOopDesc::unlocked_value); // save unlocked object header into the displaced header location on the stack