From 641293b81c38f43c1999e8cc24e6baf76af013b7 Mon Sep 17 00:00:00 2001 From: Yudi Zheng Date: Wed, 9 Oct 2024 12:28:57 +0200 Subject: [PATCH 1/8] Adapt JDK-8341708: Optimize safepoint poll encoding with smaller poll data offset --- .../jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java index 4f63e1596064..9e0140a5ec04 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java @@ -431,10 +431,10 @@ public long defaultPrototypeMarkWord() { public final boolean useObjectMonitorTable = getFlag("UseObjectMonitorTable", Boolean.class, false, JDK >= 24); // JDK-8253180 & JDK-8265932 - public final int threadPollingPageOffset = getFieldOffset("JavaThread::_poll_data", Integer.class, "SafepointMechanism::ThreadData") + - getFieldOffset("SafepointMechanism::ThreadData::_polling_page", Integer.class, "volatile uintptr_t"); - public final int threadPollingWordOffset = getFieldOffset("JavaThread::_poll_data", Integer.class, "SafepointMechanism::ThreadData") + - getFieldOffset("SafepointMechanism::ThreadData::_polling_word", Integer.class, "volatile uintptr_t"); + public final int threadPollDataOffset = JDK >= 24 ? getFieldOffset("Thread::_poll_data", Integer.class, "SafepointMechanism::ThreadData") + : getFieldOffset("JavaThread::_poll_data", Integer.class, "SafepointMechanism::ThreadData"); + public final int threadPollingPageOffset = threadPollDataOffset + getFieldOffset("SafepointMechanism::ThreadData::_polling_page", Integer.class, "volatile uintptr_t"); + public final int threadPollingWordOffset = threadPollDataOffset + getFieldOffset("SafepointMechanism::ThreadData::_polling_word", Integer.class, "volatile uintptr_t"); public final int savedExceptionPCOffset = getFieldOffset("JavaThread::_saved_exception_pc", Integer.class, "address"); private final int threadLocalAllocBufferEndOffset = getFieldOffset("ThreadLocalAllocBuffer::_end", Integer.class, "HeapWord*"); From a098070e6ae900fdb0c640bc1baf073fe3fe9acf Mon Sep 17 00:00:00 2001 From: Yudi Zheng Date: Wed, 9 Oct 2024 12:29:32 +0200 Subject: [PATCH 2/8] Update galahad JDK. --- common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.json b/common.json index 026f2d2be635..e3a13f62564a 100644 --- a/common.json +++ b/common.json @@ -8,7 +8,7 @@ "COMMENT.jdks": "When adding or removing JDKs keep in sync with JDKs in ci/common.jsonnet", "jdks": { - "galahad-jdk": {"name": "jpg-jdk", "version": "24", "build_id": "jdk-24+19-2105", "platformspecific": true, "extrabundles": ["static-libs"]}, + "galahad-jdk": {"name": "jpg-jdk", "version": "24", "build_id": "jdk-24+20-2281", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk17": {"name": "jpg-jdk", "version": "17.0.7", "build_id": "jdk-17.0.7+8", "platformspecific": true, "extrabundles": ["static-libs"]}, "labsjdk-ce-17": {"name": "labsjdk", "version": "ce-17.0.7+4-jvmci-23.1-b02", "platformspecific": true }, From 07badd6d2caa311b254589eb9632969b99b50e29 Mon Sep 17 00:00:00 2001 From: ol-automation_ww Date: Thu, 17 Oct 2024 20:00:40 +0000 Subject: [PATCH 3/8] update JVMCI to 24+20-jvmci-b01 --- common.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common.json b/common.json index 026f2d2be635..335a1a882dc7 100644 --- a/common.json +++ b/common.json @@ -45,13 +45,13 @@ "oraclejdk23": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+37", "platformspecific": true, "extrabundles": ["static-libs"]}, - "oraclejdk-latest": {"name": "jpg-jdk", "version": "24", "build_id": "jdk-24+19", "platformspecific": true, "extrabundles": ["static-libs"]}, - "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-24+19-jvmci-b01", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-24+19-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-24+19-jvmci-b01-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-24+19-jvmci-b01", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-24+19-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-24+19-jvmci-b01-sulong", "platformspecific": true } + "oraclejdk-latest": {"name": "jpg-jdk", "version": "24", "build_id": "jdk-24+20", "platformspecific": true, "extrabundles": ["static-libs"]}, + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826-sulong", "platformspecific": true } }, "eclipse": { From e00e41234fa0439007591c5750fed2328a62c0cf Mon Sep 17 00:00:00 2001 From: Josef Eisl Date: Fri, 18 Oct 2024 08:01:33 +0200 Subject: [PATCH 4/8] compiler: update JVMCIVersionCheck --- .../src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java index c04c3ae8facb..cf6deb77efbb 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java @@ -55,8 +55,8 @@ public final class JVMCIVersionCheck { private static final Map> JVMCI_MIN_VERSIONS = Map.of( "21", Map.of(DEFAULT_VENDOR_ENTRY, createLegacyVersion(23, 1, 33)), "24", Map.of( - "Oracle Corporation", createLabsJDKVersion("24+19", 1), - DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("24+19", 1))); + "Oracle Corporation", createLabsJDKVersion("24+20", 1), + DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("24+20", 1))); private static final int NA = 0; /** * Minimum Java release supported by Graal. From 70a944b56d994886a7f7feacfed73e148646d5b2 Mon Sep 17 00:00:00 2001 From: Josef Eisl Date: Fri, 18 Oct 2024 08:17:30 +0200 Subject: [PATCH 5/8] svm: review libcontainer changes from JDK 24+20 --- .../oracle/svm/core/container/ContainerLibrary.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java index f35cc572ffc7..4366b898ec63 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java @@ -60,25 +60,25 @@ @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+19/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/linux/osContainer_linux.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/linux/osContainer_linux.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+19/src/hotspot/os/linux/os_linux.cpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+20/src/hotspot/os/linux/os_linux.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/linux/os_linux.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/linux/os_linux.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/posix/include/jvm_md.h") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/posix/os_posix.cpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/posix/os_posix.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+20/src/hotspot/os/posix/os_posix.cpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+20/src/hotspot/os/posix/os_posix.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/os/posix/os_posix.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/memory/allocation.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/memory/allocation.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/memory/allStatic.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/nmt/memTag.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+17/src/hotspot/share/runtime/os.cpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/runtime/os.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+20/src/hotspot/share/runtime/os.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/runtime/os.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/checkedCast.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/compilerWarnings_gcc.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/compilerWarnings.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/globalDefinitions_gcc.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/globalDefinitions.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+20/src/hotspot/share/utilities/globalDefinitions.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+18/src/hotspot/share/utilities/macros.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/ostream.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-24+16/src/hotspot/share/utilities/ostream.hpp") From 4df44f6cc90a6bc36ad424781486d3ef7c3ffe57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C3=B6=20Barany?= Date: Fri, 18 Oct 2024 10:25:21 +0200 Subject: [PATCH 6/8] compiler: adapt UnimplementedGraalIntrinsics for JDK-8338023 --- .../compiler/hotspot/meta/UnimplementedGraalIntrinsics.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java index ab107792c328..3648c655b324 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java @@ -153,8 +153,10 @@ public UnimplementedGraalIntrinsics(Architecture arch) { if (jdk >= 24) { add(toBeInvestigated, // @formatter:off - "jdk/internal/vm/vector/VectorSupport.selectFromOp(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorSelectFromOp;)Ljdk/internal/vm/vector/VectorSupport$Vector;"); + "jdk/internal/vm/vector/VectorSupport.selectFromOp(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorSelectFromOp;)Ljdk/internal/vm/vector/VectorSupport$Vector;", + "jdk/internal/vm/vector/VectorSupport.selectFromTwoVectorOp(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$SelectFromTwoVector;)Ljdk/internal/vm/vector/VectorSupport$Vector;" // @formatter:on + ); } // These are known to be implemented down stream From 08947b2fc020dbf158870023ebce8a2dbda55b4f Mon Sep 17 00:00:00 2001 From: Marouane El Hallaoui Date: Fri, 18 Oct 2024 11:18:27 +0000 Subject: [PATCH 7/8] deploy snapshots --- common.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common.json b/common.json index 9efe1d95b7af..2f405568eff0 100644 --- a/common.json +++ b/common.json @@ -46,12 +46,12 @@ "oraclejdk23": {"name": "jpg-jdk", "version": "23", "build_id": "jdk-23+37", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk-latest": {"name": "jpg-jdk", "version": "24", "build_id": "jdk-24+20", "platformspecific": true, "extrabundles": ["static-libs"]}, - "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-20241017180532-3e48bf9cdf-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-20241017180532-3e48bf9cdf+a202bc2826-sulong", "platformspecific": true } + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-24+20-jvmci-b01-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-24+20-jvmci-b01-sulong", "platformspecific": true } }, "eclipse": { From 0ee9078d1fb04dda04210399aff56ee59116421c Mon Sep 17 00:00:00 2001 From: Yudi Zheng Date: Tue, 15 Oct 2024 15:20:26 +0200 Subject: [PATCH 8/8] Intrinsify Reference.clear (JDK-8329597) --- .../core/common/memory/BarrierType.java | 7 ++++ .../hotspot/GraalHotSpotVMConfig.java | 6 +++ .../ZWriteBarrierSetLIRGeneratorTool.java | 3 ++ .../meta/HotSpotGraphBuilderPlugins.java | 38 ++++++++++++++++++- .../meta/HotSpotHostForeignCallsProvider.java | 5 +++ .../nodes/gc/CardTableBarrierSet.java | 3 +- .../graal/compiler/nodes/gc/G1BarrierSet.java | 4 +- .../compiler/nodes/memory/WriteNode.java | 2 +- ...Target_java_lang_ref_PhantomReference.java | 9 +++++ .../heap/Target_java_lang_ref_Reference.java | 14 ++++--- 10 files changed, 81 insertions(+), 10 deletions(-) diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/memory/BarrierType.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/memory/BarrierType.java index a4bda771e17d..85d24549a69b 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/memory/BarrierType.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/memory/BarrierType.java @@ -60,6 +60,13 @@ public enum BarrierType { */ POST_INIT_WRITE, + /** + * Clear {@link java.lang.ref.Reference}.referent. In the HotSpot world this corresponds to a + * write decorated with {@code AS_NO_KEEPALIVE}. Depending on the particular garbage collector + * this might do something different than {@link #FIELD}. + */ + AS_NO_KEEPALIVE_WRITE, + /** * Read of {@link java.lang.ref.Reference}.referent. In the HotSpot world this corresponds to an * access decorated with {@code ON_WEAK_OOP_REF}. Depending on the particular garbage collector diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java index 9e0140a5ec04..54db0081a22f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfig.java @@ -83,6 +83,10 @@ public boolean useG1GC() { return gc == HotSpotGraalRuntime.HotSpotGC.G1; } + public boolean useXGC() { + return gc == HotSpotGraalRuntime.HotSpotGC.X; + } + public final HotSpotGraalRuntime.HotSpotGC gc = getSelectedGC(); private HotSpotGraalRuntime.HotSpotGC getSelectedGC() throws GraalError { @@ -585,6 +589,8 @@ private long getZGCAddressField(String name) { "ZBarrierSetRuntime::no_keepalive_load_barrier_on_weak_oop_field_preloaded"); public final long zBarrierSetRuntimeNoKeepaliveLoadBarrierOnPhantomOopFieldPreloaded = getZGCAddressField( "ZBarrierSetRuntime::no_keepalive_load_barrier_on_phantom_oop_field_preloaded"); + public final long zBarrierSetRuntimeNoKeepaliveStoreBarrierOnOopFieldWithoutHealing = getZGCAddressField( + "ZBarrierSetRuntime::no_keepalive_store_barrier_on_oop_field_without_healing"); public final long zBarrierSetRuntimeStoreBarrierOnNativeOopFieldWithoutHealing = getZGCAddressField("ZBarrierSetRuntime::store_barrier_on_native_oop_field_without_healing"); public final long zBarrierSetRuntimeStoreBarrierOnOopFieldWithHealing = getZGCAddressField("ZBarrierSetRuntime::store_barrier_on_oop_field_with_healing"); public final long zBarrierSetRuntimeStoreBarrierOnOopFieldWithoutHealing = getZGCAddressField("ZBarrierSetRuntime::store_barrier_on_oop_field_without_healing"); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/ZWriteBarrierSetLIRGeneratorTool.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/ZWriteBarrierSetLIRGeneratorTool.java index c32581eeb31e..065c9701e743 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/ZWriteBarrierSetLIRGeneratorTool.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/ZWriteBarrierSetLIRGeneratorTool.java @@ -111,6 +111,9 @@ default ForeignCallLinkage getWriteBarrierStub(BarrierType barrierType, StoreKin callTarget = getForeignCalls().lookupForeignCall(HotSpotHostForeignCallsProvider.Z_STORE_BARRIER_WITHOUT_HEALING); } break; + case AS_NO_KEEPALIVE_WRITE: + callTarget = getForeignCalls().lookupForeignCall(HotSpotHostForeignCallsProvider.Z_REFERENCE_CLEAR_BARRIER); + break; default: throw GraalError.shouldNotReachHere("Unexpected barrier type: " + barrierType); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java index 46a753a05829..a1b546c95982 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java @@ -265,7 +265,7 @@ public void run() { registerArrayPlugins(invocationPlugins, replacements, config); registerStringPlugins(invocationPlugins, replacements, wordTypes, foreignCalls, config); registerArraysSupportPlugins(invocationPlugins, replacements, target.arch); - registerReferencePlugins(invocationPlugins, replacements); + registerReferencePlugins(invocationPlugins, config, replacements); registerTrufflePlugins(invocationPlugins, wordTypes, config); registerInstrumentationImplPlugins(invocationPlugins, config, replacements); for (HotSpotInvocationPluginProvider p : GraalServices.load(HotSpotInvocationPluginProvider.class)) { @@ -1366,7 +1366,7 @@ public boolean isGraalOnly() { }); } - private static void registerReferencePlugins(InvocationPlugins plugins, Replacements replacements) { + private static void registerReferencePlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, Replacements replacements) { Registration r = new Registration(plugins, Reference.class, replacements); r.register(new ReachabilityFencePlugin() { @Override @@ -1386,6 +1386,23 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); + if (JavaVersionUtil.JAVA_SPEC >= 24 && !config.useXGC()) { + r.register(new InlineOnlyInvocationPlugin("clear0", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) { + ValueNode offset = b.add(ConstantNode.forLong(HotSpotReplacementsUtil.referentOffset(b.getMetaAccess()))); + AddressNode address = b.add(new OffsetAddressNode(receiver.get(true), offset)); + FieldLocationIdentity locationIdentity = new FieldLocationIdentity(HotSpotReplacementsUtil.referentField(b.getMetaAccess())); + JavaReadNode referent = b.add(new JavaReadNode(StampFactory.object(), JavaKind.Object, address, locationIdentity, BarrierType.WEAK_REFERS_TO, MemoryOrderMode.PLAIN, true)); + helper.emitReturnIf(IsNullNode.create(referent), null, GraalDirectives.LIKELY_PROBABILITY); + b.add(new JavaWriteNode(JavaKind.Object, address, locationIdentity, ConstantNode.defaultForKind(JavaKind.Object), BarrierType.AS_NO_KEEPALIVE_WRITE, true)); + helper.emitFinalReturn(JavaKind.Void, null); + return true; + } + } + }); + } r = new Registration(plugins, PhantomReference.class, replacements); r.register(new InlineOnlyInvocationPlugin("refersTo0", Receiver.class, Object.class) { @Override @@ -1399,6 +1416,23 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); + if (JavaVersionUtil.JAVA_SPEC >= 24 && !config.useXGC()) { + r.register(new InlineOnlyInvocationPlugin("clear0", Receiver.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { + try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) { + ValueNode offset = b.add(ConstantNode.forLong(HotSpotReplacementsUtil.referentOffset(b.getMetaAccess()))); + AddressNode address = b.add(new OffsetAddressNode(receiver.get(true), offset)); + FieldLocationIdentity locationIdentity = new FieldLocationIdentity(HotSpotReplacementsUtil.referentField(b.getMetaAccess())); + JavaReadNode referent = b.add(new JavaReadNode(StampFactory.object(), JavaKind.Object, address, locationIdentity, BarrierType.PHANTOM_REFERS_TO, MemoryOrderMode.PLAIN, true)); + helper.emitReturnIf(IsNullNode.create(referent), null, GraalDirectives.LIKELY_PROBABILITY); + b.add(new JavaWriteNode(JavaKind.Object, address, locationIdentity, ConstantNode.defaultForKind(JavaKind.Object), BarrierType.AS_NO_KEEPALIVE_WRITE, true)); + helper.emitFinalReturn(JavaKind.Void, null); + return true; + } + } + }); + } } private static void registerInstrumentationImplPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, Replacements replacements) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java index 72374c8473c8..0cc01b9fa957 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java @@ -226,6 +226,10 @@ public abstract class HotSpotHostForeignCallsProvider extends HotSpotForeignCall public static final HotSpotForeignCallDescriptor Z_REFERENCE_GET_BARRIER = new HotSpotForeignCallDescriptor(LEAF_NO_VZERO, HAS_SIDE_EFFECT, NO_LOCATIONS, "ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded", long.class, long.class, long.class); + // void no_keepalive_store_barrier_on_oop_field_without_healing(oop* p); + public static final HotSpotForeignCallDescriptor Z_REFERENCE_CLEAR_BARRIER = new HotSpotForeignCallDescriptor(LEAF_NO_VZERO, HAS_SIDE_EFFECT, NO_LOCATIONS, + "ZBarrierSetRuntime::no_keepalive_store_barrier_on_oop_field_without_healing", void.class, long.class); + // oopDesc* no_keepalive_load_barrier_on_weak_oop_field_preloaded(oopDesc* o, oop* p); public static final HotSpotForeignCallDescriptor Z_WEAK_REFERS_TO_BARRIER = new HotSpotForeignCallDescriptor(LEAF_NO_VZERO, HAS_SIDE_EFFECT, NO_LOCATIONS, "ZBarrierSetRuntime::no_keepalive_load_barrier_on_weak_oop_field_preloaded", long.class, long.class, long.class); @@ -579,6 +583,7 @@ public void initialize(HotSpotProviders providers, OptionValues options) { linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_STORE_BARRIER_WITH_HEALING, c.zBarrierSetRuntimeStoreBarrierOnOopFieldWithHealing, DONT_PREPEND_THREAD); linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_STORE_BARRIER_NATIVE, c.zBarrierSetRuntimeStoreBarrierOnNativeOopFieldWithoutHealing, DONT_PREPEND_THREAD); linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_REFERENCE_GET_BARRIER, c.zBarrierSetRuntimeLoadBarrierOnWeakOopFieldPreloaded, DONT_PREPEND_THREAD); + linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_REFERENCE_CLEAR_BARRIER, c.zBarrierSetRuntimeNoKeepaliveStoreBarrierOnOopFieldWithoutHealing, DONT_PREPEND_THREAD); linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_WEAK_REFERS_TO_BARRIER, c.zBarrierSetRuntimeNoKeepaliveLoadBarrierOnWeakOopFieldPreloaded, DONT_PREPEND_THREAD); linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_PHANTOM_REFERS_TO_BARRIER, c.zBarrierSetRuntimeNoKeepaliveLoadBarrierOnPhantomOopFieldPreloaded, DONT_PREPEND_THREAD); linkStackOnlyForeignCall(c.gc == Z, options, providers, Z_ARRAY_BARRIER, c.zBarrierSetRuntimeLoadBarrierOnOopArray, DONT_PREPEND_THREAD); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/CardTableBarrierSet.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/CardTableBarrierSet.java index 0cbaddf1b1b4..da4ee8b0728c 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/CardTableBarrierSet.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/CardTableBarrierSet.java @@ -204,6 +204,7 @@ public boolean needsWriteBarrier(FixedAccessNode node, ValueNode writtenValue) { case NONE: return false; case FIELD: + case AS_NO_KEEPALIVE_WRITE: case ARRAY: case UNKNOWN: return writeRequiresBarrier(node, writtenValue); @@ -234,7 +235,7 @@ private static boolean hasWriteBarrier(ArrayRangeWrite write) { private static void addSerialPostWriteBarrier(FixedAccessNode node, AddressNode address, StructuredGraph graph) { // Use a precise barrier for everything that might be an array write. Being too precise with // the barriers does not cause any correctness issues. - boolean precise = node.getBarrierType() != BarrierType.FIELD; + boolean precise = node.getBarrierType() != BarrierType.FIELD && node.getBarrierType() != BarrierType.AS_NO_KEEPALIVE_WRITE; graph.addAfterFixed(node, graph.add(new SerialWriteBarrierNode(address, precise))); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/G1BarrierSet.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/G1BarrierSet.java index dc6f7b1faf32..4baf43064443 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/G1BarrierSet.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/gc/G1BarrierSet.java @@ -168,12 +168,14 @@ private void addWriteBarriers(FixedAccessNode node, ValueNode writtenValue, Valu case FIELD: case ARRAY: case UNKNOWN: + case AS_NO_KEEPALIVE_WRITE: if (isObjectValue(writtenValue)) { StructuredGraph graph = node.graph(); boolean init = node.getLocationIdentity().isInit(); - if (!init) { + if (!init && barrierType != BarrierType.AS_NO_KEEPALIVE_WRITE) { // The pre barrier does nothing if the value being read is null, so it can // be explicitly skipped when this is an initializing store. + // No keep-alive means no need for the pre-barrier. addG1PreWriteBarrier(node, node.getAddress(), expectedValue, doLoad, graph); } if (writeRequiresPostBarrier(node, writtenValue)) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/memory/WriteNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/memory/WriteNode.java index 4c2a884d1146..a6ac8b4638a2 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/memory/WriteNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/memory/WriteNode.java @@ -72,7 +72,7 @@ protected WriteNode(NodeClass c, AddressNode address, Locat MemoryOrderMode memoryOrder) { super(c, address, location, value, barrierType); assert barrierType == BarrierType.NONE || barrierType == BarrierType.ARRAY || barrierType == BarrierType.FIELD || barrierType == BarrierType.UNKNOWN || - barrierType == BarrierType.POST_INIT_WRITE : barrierType; + barrierType == BarrierType.POST_INIT_WRITE || barrierType == BarrierType.AS_NO_KEEPALIVE_WRITE : barrierType; this.killedLocationIdentity = killedLocationIdentity; this.memoryOrder = memoryOrder; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_PhantomReference.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_PhantomReference.java index 51200247d4b3..6f046af09657 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_PhantomReference.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_PhantomReference.java @@ -29,6 +29,8 @@ import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; +import com.oracle.svm.core.annotate.TargetElement; +import com.oracle.svm.core.jdk.JDKLatest; @TargetClass(PhantomReference.class) public final class Target_java_lang_ref_PhantomReference { @@ -36,4 +38,11 @@ public final class Target_java_lang_ref_PhantomReference { boolean refersTo0(Object obj) { return ReferenceInternals.refersTo(SubstrateUtil.cast(this, PhantomReference.class), obj); } + + @Substitute + @TargetElement(onlyWith = JDKLatest.class) + private void clear0() { + ReferenceInternals.clear(SubstrateUtil.cast(this, PhantomReference.class)); + } + } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Reference.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Reference.java index 0c9d1d35d338..29e434368fc1 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Reference.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Target_java_lang_ref_Reference.java @@ -43,6 +43,8 @@ import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; +import com.oracle.svm.core.annotate.TargetElement; +import com.oracle.svm.core.jdk.JDKLatest; import com.oracle.svm.core.util.VMError; import com.oracle.svm.util.ReflectionUtil; @@ -123,16 +125,18 @@ public final class Target_java_lang_ref_Reference { @KeepOriginal native T get(); - @Substitute - public void clear() { - ReferenceInternals.clear(SubstrateUtil.cast(this, Reference.class)); - } + @KeepOriginal + native void clear(); @Substitute private void clear0() { - clear(); + ReferenceInternals.clear(SubstrateUtil.cast(this, Reference.class)); } + @TargetElement(onlyWith = JDKLatest.class) + @KeepOriginal + native void clearImpl(); + @KeepOriginal native boolean refersToImpl(T obj);