diff a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp @@ -127,10 +127,16 @@ _preserve.remove(OptoReg::as_OptoReg(vm_reg)); vm_reg = vm_reg->next(); } while (vm_reg->is_Register() && !vm_reg->is_concrete()); } +bool BarrierStubC2::is_preserved(Register r) { + const VMReg vm_reg = r->as_VMReg(); + assert(vm_reg->is_Register(), "r must be a general-purpose register"); + return _preserve.member(OptoReg::as_OptoReg(vm_reg)); +} + const RegMask& BarrierStubC2::preserve_set() const { return _preserve; } Node* BarrierSetC2::store_at_resolved(C2Access& access, C2AccessValue& val) const { @@ -1109,11 +1115,11 @@ const uint mem_index = block_index(mem_block, mem); if (access_block == mem_block) { // Earlier accesses in the same block if (mem_index < access_index && !block_has_safepoint(mem_block, mem_index + 1, access_index)) { - elide_dominated_barrier(access); + elide_dominated_barrier(access, mem->is_Mach() ? mem->as_Mach() : nullptr); } } else if (mem_block->dominates(access_block)) { // Dominating block? Look around for safepoints ResourceMark rm; Block_List stack; @@ -1139,11 +1145,11 @@ stack.push(pred); } } if (!safepoint_found) { - elide_dominated_barrier(access); + elide_dominated_barrier(access, mem->is_Mach() ? mem->as_Mach() : nullptr); } } } } }