From 9201e9fcc28cff37cf9996e8db38f9aee7511b1c Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Fri, 18 Oct 2024 08:30:41 +0000 Subject: [PATCH] 8342409: [s390x] C1 unwind_handler fails to unlock synchronized methods with LM_MONITOR Reviewed-by: rrich, lucy --- src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp | 6 +++++- src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp index 8990cf1663d..8bf11816219 100644 --- a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp @@ -216,7 +216,11 @@ int LIR_Assembler::emit_unwind_handler() { LIR_Opr lock = FrameMap::as_opr(Z_R1_scratch); monitor_address(0, lock); stub = new MonitorExitStub(lock, true, 0); - __ unlock_object(Rtmp1, Rtmp2, lock->as_register(), *stub->entry()); + if (LockingMode == LM_MONITOR) { + __ branch_optimized(Assembler::bcondAlways, *stub->entry()); + } else { + __ unlock_object(Rtmp1, Rtmp2, lock->as_register(), *stub->entry()); + } __ bind(*stub->continuation()); } diff --git a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp index f6dd20db3d6..41c2ae260a6 100644 --- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp @@ -120,6 +120,8 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox branch_optimized(Assembler::bcondNotZero, slow_case); // done bind(done); + } else { + assert(false, "Unhandled LockingMode:%d", LockingMode); } } @@ -151,6 +153,8 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb // If the object header was not pointing to the displaced header, // we do unlocking via runtime call. branch_optimized(Assembler::bcondNotEqual, slow_case); + } else { + assert(false, "Unhandled LockingMode:%d", LockingMode); } // done bind(done);