Skip to content

Commit

Permalink
8252990: Intrinsify Unsafe.storeStoreFence
Browse files Browse the repository at this point in the history
Backport-of: b7a06be98d3057dac4adbb7f4071ac62cf88fe52
  • Loading branch information
shipilev committed Apr 25, 2023
1 parent 24e91c1 commit e6e6bed
Show file tree
Hide file tree
Showing 16 changed files with 33 additions and 6 deletions.
1 change: 1 addition & 0 deletions src/hotspot/cpu/aarch64/aarch64.ad
Original file line number Diff line number Diff line change
Expand Up @@ -8646,6 +8646,7 @@ instruct membar_release() %{

instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(VOLATILE_REF_COST);

format %{ "MEMBAR-store-store" %}
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/arm/arm.ad
Original file line number Diff line number Diff line change
Expand Up @@ -4511,6 +4511,7 @@ instruct storeF( memoryF mem, regF src) %{
// pattern-match out unnecessary membars
instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(4*MEMORY_REF_COST);

size(4);
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/ppc/ppc.ad
Original file line number Diff line number Diff line change
Expand Up @@ -7152,6 +7152,7 @@ instruct membar_release() %{

instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(4*MEMORY_REF_COST);

format %{ "MEMBAR-store-store" %}
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/s390/s390.ad
Original file line number Diff line number Diff line change
Expand Up @@ -5048,6 +5048,7 @@ instruct membar_CPUOrder() %{

instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(0);
size(0);
format %{ "MEMBAR-storestore (empty)" %}
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/x86/x86_32.ad
Original file line number Diff line number Diff line change
Expand Up @@ -6646,6 +6646,7 @@ instruct unnecessary_membar_volatile() %{

instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(0);

size(0);
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/x86/x86_64.ad
Original file line number Diff line number Diff line change
Expand Up @@ -6765,6 +6765,7 @@ instruct unnecessary_membar_volatile()

instruct membar_storestore() %{
match(MemBarStoreStore);
match(StoreStoreFence);
ins_cost(0);

size(0);
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/adlc/formssel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4117,6 +4117,7 @@ bool MatchRule::is_ideal_membar() const {
!strcmp(_opType,"MemBarReleaseLock") ||
!strcmp(_opType,"LoadFence" ) ||
!strcmp(_opType,"StoreFence") ||
!strcmp(_opType,"StoreStoreFence") ||
!strcmp(_opType,"MemBarVolatile") ||
!strcmp(_opType,"MemBarCPUOrder") ||
!strcmp(_opType,"MemBarStoreStore") ||
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/c1/c1_Compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ bool Compiler::is_intrinsic_supported(const methodHandle& method) {
// since GC can change its value.
case vmIntrinsics::_loadFence:
case vmIntrinsics::_storeFence:
case vmIntrinsics::_storeStoreFence:
case vmIntrinsics::_fullFence:
case vmIntrinsics::_floatToRawIntBits:
case vmIntrinsics::_intBitsToFloat:
Expand Down
3 changes: 3 additions & 0 deletions src/hotspot/share/c1/c1_LIRGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3149,6 +3149,9 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
case vmIntrinsics::_storeFence:
__ membar_release();
break;
case vmIntrinsics::_storeStoreFence:
__ membar_storestore();
break;
case vmIntrinsics::_fullFence :
__ membar();
break;
Expand Down
3 changes: 3 additions & 0 deletions src/hotspot/share/classfile/vmIntrinsics.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,9 @@ class methodHandle;
do_intrinsic(_storeFence, jdk_internal_misc_Unsafe, storeFence_name, storeFence_signature, F_RN) \
do_name( storeFence_name, "storeFence") \
do_alias( storeFence_signature, void_method_signature) \
do_intrinsic(_storeStoreFence, jdk_internal_misc_Unsafe, storeStoreFence_name, storeStoreFence_signature, F_R) \
do_name( storeStoreFence_name, "storeStoreFence") \
do_alias( storeStoreFence_signature, void_method_signature) \
do_intrinsic(_fullFence, jdk_internal_misc_Unsafe, fullFence_name, fullFence_signature, F_RN) \
do_name( fullFence_name, "fullFence") \
do_alias( fullFence_signature, void_method_signature) \
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/opto/c2compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,7 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
case vmIntrinsics::_putLongUnaligned:
case vmIntrinsics::_loadFence:
case vmIntrinsics::_storeFence:
case vmIntrinsics::_storeStoreFence:
case vmIntrinsics::_fullFence:
case vmIntrinsics::_currentThread:
#ifdef JFR_HAVE_INTRINSICS
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/opto/classes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ macro(MemBarAcquireLock)
macro(MemBarCPUOrder)
macro(MemBarRelease)
macro(StoreFence)
macro(StoreStoreFence)
macro(MemBarReleaseLock)
macro(MemBarVolatile)
macro(MemBarStoreStore)
Expand Down
4 changes: 4 additions & 0 deletions src/hotspot/share/opto/library_call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ bool LibraryCallKit::try_to_inline(int predicate) {

case vmIntrinsics::_loadFence:
case vmIntrinsics::_storeFence:
case vmIntrinsics::_storeStoreFence:
case vmIntrinsics::_fullFence: return inline_unsafe_fence(intrinsic_id());

case vmIntrinsics::_onSpinWait: return inline_onspinwait();
Expand Down Expand Up @@ -2690,6 +2691,9 @@ bool LibraryCallKit::inline_unsafe_fence(vmIntrinsics::ID id) {
case vmIntrinsics::_storeFence:
insert_mem_bar(Op_StoreFence);
return true;
case vmIntrinsics::_storeStoreFence:
insert_mem_bar(Op_StoreStoreFence);
return true;
case vmIntrinsics::_fullFence:
insert_mem_bar(Op_MemBarVolatile);
return true;
Expand Down
6 changes: 4 additions & 2 deletions src/hotspot/share/opto/memnode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1054,7 +1054,8 @@ Node* MemNode::can_see_stored_value(Node* st, PhaseTransform* phase) const {
opc == Op_MemBarRelease ||
opc == Op_StoreFence ||
opc == Op_MemBarReleaseLock ||
opc == Op_MemBarStoreStore) {
opc == Op_MemBarStoreStore ||
opc == Op_StoreStoreFence) {
Node* mem = current->in(0)->in(TypeFunc::Memory);
if (mem->is_MergeMem()) {
MergeMemNode* merge = mem->as_MergeMem();
Expand Down Expand Up @@ -3286,13 +3287,14 @@ MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) {
case Op_LoadFence: return new LoadFenceNode(C, atp, pn);
case Op_MemBarRelease: return new MemBarReleaseNode(C, atp, pn);
case Op_StoreFence: return new StoreFenceNode(C, atp, pn);
case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn);
case Op_StoreStoreFence: return new StoreStoreFenceNode(C, atp, pn);
case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn);
case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
case Op_MemBarVolatile: return new MemBarVolatileNode(C, atp, pn);
case Op_MemBarCPUOrder: return new MemBarCPUOrderNode(C, atp, pn);
case Op_OnSpinWait: return new OnSpinWaitNode(C, atp, pn);
case Op_Initialize: return new InitializeNode(C, atp, pn);
case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn);
case Op_Blackhole: return new BlackholeNode(C, atp, pn);
default: ShouldNotReachHere(); return NULL;
}
Expand Down
7 changes: 7 additions & 0 deletions src/hotspot/share/opto/memnode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1309,6 +1309,13 @@ class MemBarStoreStoreNode: public MemBarNode {
virtual int Opcode() const;
};

class StoreStoreFenceNode: public MemBarNode {
public:
StoreStoreFenceNode(Compile* C, int alias_idx, Node* precedent)
: MemBarNode(C, alias_idx, precedent) {}
virtual int Opcode() const;
};

// Ordering between a volatile store and a following volatile load.
// Requires multi-CPU visibility?
class MemBarVolatileNode: public MemBarNode {
Expand Down
6 changes: 2 additions & 4 deletions src/java.base/share/classes/jdk/internal/misc/Unsafe.java
Original file line number Diff line number Diff line change
Expand Up @@ -3436,16 +3436,14 @@ public final void loadLoadFence() {
* Ensures that stores before the fence will not be reordered with
* stores after the fence.
*
* @implNote
* This method is operationally equivalent to {@link #storeFence()}.
*
* @since 9
*/
@IntrinsicCandidate
public final void storeStoreFence() {
// If storeStoreFence intrinsic is not available, fall back to storeFence.
storeFence();
}


/**
* Throws IllegalAccessError; for use by the VM for access control
* error support.
Expand Down

1 comment on commit e6e6bed

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.