diff --git a/compiler/mx.compiler/suite.py b/compiler/mx.compiler/suite.py index d6609d69c8eb..d1a7b7789b90 100644 --- a/compiler/mx.compiler/suite.py +++ b/compiler/mx.compiler/suite.py @@ -269,6 +269,8 @@ "jdk.internal.misc", "jdk.internal.util", "jdk.internal.vm.annotation", + "sun.security.util.math", + "sun.security.util.math.intpoly", ], "java.instrument" : [ "sun.instrument", @@ -317,7 +319,7 @@ "workingSets" : "Graal,HotSpot", }, - "jdk.graal.compiler.hotspot.jdk21.test" : { + "jdk.graal.compiler.hotspot.preview.test" : { "testProject" : True, "subDir" : "src", "sourceDirs" : ["src"], @@ -340,32 +342,6 @@ "graalCompilerSourceEdition": "ignore", }, - "jdk.graal.compiler.hotspot.jdk23.test" : { - "testProject" : True, - "subDir" : "src", - "sourceDirs" : ["src"], - "dependencies" : [ - "jdk.graal.compiler.test", - ], - "requiresConcealed" : { - "java.base" : [ - "jdk.internal.util", - "sun.security.util.math", - "sun.security.util.math.intpoly", - ], - "jdk.internal.vm.ci" : [ - "jdk.vm.ci.code", - "jdk.vm.ci.meta", - ], - }, - "checkstyle": "jdk.graal.compiler", - "javaCompliance" : "23+", - # GR-51699 - "forceJavac": True, - "workingSets" : "Graal,HotSpot,Test", - "graalCompilerSourceEdition": "ignore", - }, - "jdk.graal.compiler.virtual.bench" : { "subDir" : "src", "sourceDirs" : ["src"], @@ -555,11 +531,10 @@ "maven": False, "graalCompilerSourceEdition": "ignore", }, - "GRAAL_TEST_PREVIEW_FEATURE" : { + "GRAAL_TEST_PREVIEW_FEATURES" : { "subDir" : "src", "dependencies" : [ - "jdk.graal.compiler.hotspot.jdk21.test", - "jdk.graal.compiler.hotspot.jdk23.test", + "jdk.graal.compiler.hotspot.preview.test", ], "distDependencies" : [ "GRAAL_TEST", diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/PreviewEnabledTest.java b/compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/PreviewEnabledTest.java similarity index 97% rename from compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/PreviewEnabledTest.java rename to compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/PreviewEnabledTest.java index da7e9b435c1c..9d36a6da308d 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/PreviewEnabledTest.java +++ b/compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/PreviewEnabledTest.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.graal.compiler.hotspot.jdk21.test; +package jdk.graal.compiler.hotspot.preview.test; import java.io.IOException; diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/ScopedValueCacheTest.java b/compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/ScopedValueCacheTest.java similarity index 97% rename from compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/ScopedValueCacheTest.java rename to compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/ScopedValueCacheTest.java index a4f6e406f358..1a18e1f22234 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk21.test/src/jdk/graal/compiler/hotspot/jdk21/test/ScopedValueCacheTest.java +++ b/compiler/src/jdk.graal.compiler.hotspot.preview.test/src/jdk/graal/compiler/hotspot/preview/test/ScopedValueCacheTest.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.graal.compiler.hotspot.jdk21.test; +package jdk.graal.compiler.hotspot.preview.test; import java.lang.reflect.Method; diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/BeforeJDK8346781.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/BeforeJDK8346781.java deleted file mode 100644 index 20a417c2431d..000000000000 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/BeforeJDK8346781.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.graal.compiler.libgraal; - -import java.util.function.BooleanSupplier; -import java.util.stream.Stream; - -import jdk.vm.ci.services.Services; - -/** - * Determines if the JDK runtime does not include JDK-8346781. - */ -public class BeforeJDK8346781 implements BooleanSupplier { - - static final boolean VALUE = Stream.of(Services.class.getFields()).anyMatch(f -> f.getName().equals("IS_BUILDING_NATIVE_IMAGE")); - - @Override - public boolean getAsBoolean() { - return VALUE; - } -} diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/JDKLatest.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/JDKLatest.java deleted file mode 100644 index cef8bbe6a07e..000000000000 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/JDKLatest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.graal.compiler.libgraal; - -import java.util.function.BooleanSupplier; - -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; - -/** - * Denotes the latest supported JDK version. It corresponds to the highest key in the - * {@code JVMCI_MIN_VERSIONS} map in {@link jdk.graal.compiler.hotspot.JVMCIVersionCheck}. - */ -public class JDKLatest implements BooleanSupplier { - @Override - public boolean getAsBoolean() { - return JavaVersionUtil.JAVA_SPEC > 21; - } -} diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalFeature.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalFeature.java index ade911301785..d35c3e86035a 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalFeature.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalFeature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,6 @@ import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; @@ -46,8 +45,6 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -import jdk.graal.compiler.core.common.NativeImageSupport; -import jdk.graal.compiler.hotspot.CompilerConfig; import org.graalvm.collections.EconomicMap; import org.graalvm.jniutils.NativeBridgeSupport; import org.graalvm.nativeimage.ImageInfo; @@ -62,10 +59,12 @@ import jdk.graal.compiler.core.common.Fields; import jdk.graal.compiler.core.common.LibGraalSupport.HostedOnly; +import jdk.graal.compiler.core.common.NativeImageSupport; import jdk.graal.compiler.core.common.spi.ForeignCallSignature; import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.graph.Edges; import jdk.graal.compiler.graph.NodeClass; +import jdk.graal.compiler.hotspot.CompilerConfig; import jdk.graal.compiler.hotspot.EncodedSnippets; import jdk.graal.compiler.hotspot.HotSpotForeignCallLinkage; import jdk.graal.compiler.hotspot.HotSpotReplacementsImpl; @@ -73,14 +72,10 @@ import jdk.graal.compiler.options.OptionDescriptor; import jdk.graal.compiler.options.OptionKey; import jdk.graal.compiler.options.OptionsParser; -import jdk.graal.compiler.serviceprovider.GraalServices; import jdk.graal.compiler.truffle.host.TruffleHostEnvironment; import jdk.graal.compiler.util.ObjectCopier; import jdk.internal.module.Modules; -import jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory; -import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.hotspot.HotSpotModifiers; -import jdk.vm.ci.services.JVMCIServiceLocator; /** * This feature builds the libgraal shared library (e.g., libjvmcicompiler.so on linux). @@ -360,8 +355,6 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { RuntimeReflection.registerAllDeclaredClasses(Long.class); RuntimeReflection.register(lookupField(lookupClass("java.lang.Long$LongCache"), "cache")); - doLegacyJVMCIInitialization(); - GetCompilerConfig.Result configResult = GetCompilerConfig.from(libgraalJavaHome); for (var e : configResult.opens().entrySet()) { Module module = ModuleLayer.boot().findModule(e.getKey()).orElseThrow(); @@ -394,45 +387,6 @@ private static void checkNodeClasses(EncodedSnippets encodedSnippets, String act GraalError.guarantee(actual.equals(expect), "%n%s%n !=%n%s", actual, expect); } - /** - * Initialization of JVMCI code that needs to be done for JDK versions that do not include - * JDK-8346781. - */ - private void doLegacyJVMCIInitialization() { - if (!BeforeJDK8346781.VALUE) { - return; - } - try { - String rawArch = GraalServices.getSavedProperty("os.arch"); - String arch = switch (rawArch) { - case "x86_64", "amd64" -> "AMD64"; - case "aarch64" -> "aarch64"; - case "riscv64" -> "riscv64"; - default -> throw new GraalError("Unknown or unsupported arch: %s", rawArch); - }; - - ClassLoader cl = (ClassLoader) libgraalLoader; - Field cachedHotSpotJVMCIBackendFactoriesField = ObjectCopier.getField(HotSpotJVMCIRuntime.class, "cachedHotSpotJVMCIBackendFactories"); - GraalError.guarantee(cachedHotSpotJVMCIBackendFactoriesField.get(null) == null, "Expect cachedHotSpotJVMCIBackendFactories to be null"); - ServiceLoader load = ServiceLoader.load(HotSpotJVMCIBackendFactory.class, cl); - List backendFactories = load.stream()// - .map(ServiceLoader.Provider::get)// - .filter(s -> s.getArchitecture().equals(arch))// - .toList(); - cachedHotSpotJVMCIBackendFactoriesField.set(null, backendFactories); - GraalError.guarantee(backendFactories.size() == 1, "%s", backendFactories); - - var jvmciServiceLocatorCachedLocatorsField = ObjectCopier.getField(JVMCIServiceLocator.class, "cachedLocators"); - GraalError.guarantee(jvmciServiceLocatorCachedLocatorsField.get(null) == null, "Expect cachedLocators to be null"); - Iterable serviceLocators = ServiceLoader.load(JVMCIServiceLocator.class, cl); - List cachedLocators = new ArrayList<>(); - serviceLocators.forEach(cachedLocators::add); - jvmciServiceLocatorCachedLocatorsField.set(null, cachedLocators); - } catch (Throwable e) { - throw new GraalError(e); - } - } - @Override public void afterAnalysis(AfterAnalysisAccess access) { optionCollector.afterAnalysis(access); diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSubstitutions.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSubstitutions.java index 6f6223353c0e..d2d831d18759 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSubstitutions.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSubstitutions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,22 +27,11 @@ import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.TargetClass; -import com.oracle.svm.core.annotate.TargetElement; class LibGraalSubstitutions { @TargetClass(className = "jdk.vm.ci.services.Services", onlyWith = LibGraalFeature.IsEnabled.class) static final class Target_jdk_vm_ci_services_Services { - /** - * Ensures field returns false if seen by the analysis. - */ - // Checkstyle: stop - @Alias // - @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias, isFinal = true)// - @TargetElement(onlyWith = BeforeJDK8346781.class)// - public static boolean IS_BUILDING_NATIVE_IMAGE = false; - // Checkstyle: resume - /* * Static final boolean field Services.IS_IN_NATIVE_IMAGE is used in many places in the * JVMCI codebase to switch between the different implementations needed for regular use (a diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSupportImpl.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSupportImpl.java index d29d836e7159..dcee56d7e250 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSupportImpl.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSupportImpl.java @@ -56,7 +56,6 @@ import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.libgraal.truffle.HSTruffleCompilerRuntime; import jdk.graal.compiler.options.OptionValues; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.Word; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.hotspot.HotSpotVMConfigAccess; @@ -256,11 +255,8 @@ private static MethodHandle findCompilerThreadCanCallJavaScopeConstructor() { try { return MethodHandles.lookup().findConstructor(Class.forName("jdk.vm.ci.hotspot.CompilerThreadCanCallJavaScope"), MethodType.methodType(void.class, boolean.class)); } catch (ReflectiveOperationException e) { - if (JavaVersionUtil.JAVA_SPEC != 21) { - throw new InternalError(e); - } + throw new InternalError(e); } - return null; } private final AutoCloseable impl; diff --git a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleHostEnvironment.java b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleHostEnvironment.java index 1adaebafda5a..1c6e7d2649a3 100644 --- a/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleHostEnvironment.java +++ b/compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleHostEnvironment.java @@ -24,13 +24,18 @@ */ package jdk.graal.compiler.libgraal.truffle; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.List; + import com.oracle.truffle.compiler.HostMethodInfo; import com.oracle.truffle.compiler.TruffleCompilable; import com.oracle.truffle.compiler.TruffleCompilerRuntime; + import jdk.graal.compiler.core.common.util.MethodKey; import jdk.graal.compiler.hotspot.CompilationContext; import jdk.graal.compiler.hotspot.HotSpotGraalServices; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.truffle.TruffleCompilerImpl; import jdk.graal.compiler.truffle.TruffleElementCache; import jdk.graal.compiler.truffle.host.TruffleHostEnvironment; @@ -40,11 +45,6 @@ import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.List; - final class LibGraalTruffleHostEnvironment extends TruffleHostEnvironment { private final HostMethodInfoCache hostCache = new HostMethodInfoCache(); @@ -132,11 +132,8 @@ private static MethodHandle findCompilerThreadCanCallJavaScopeConstructor() { try { return MethodHandles.lookup().findConstructor(Class.forName("jdk.vm.ci.hotspot.CompilerThreadCanCallJavaScope"), MethodType.methodType(void.class, boolean.class)); } catch (ReflectiveOperationException e) { - if (JavaVersionUtil.JAVA_SPEC != 21) { - throw new InternalError(e); - } + throw new InternalError(e); } - return null; } private final AutoCloseable impl; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/jfr/TestGetEventWriter.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/jfr/TestGetEventWriter.java index eaafe8cd4f87..3c2f2c19593c 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/jfr/TestGetEventWriter.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/jfr/TestGetEventWriter.java @@ -29,7 +29,6 @@ import java.lang.reflect.InvocationTargetException; import org.junit.Assert; -import org.junit.Assume; import org.junit.Test; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassWriter; @@ -38,7 +37,6 @@ import jdk.graal.compiler.core.common.PermanentBailoutException; import jdk.graal.compiler.core.test.SubprocessTest; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.test.AddExports; import jdk.jfr.Event; import jdk.jfr.Recording; @@ -82,7 +80,6 @@ static class InitializationEvent extends Event { @Test public void test() throws IOException, InterruptedException { - Assume.assumeTrue(JavaVersionUtil.JAVA_SPEC > 21); String[] args; if (isJFRAvailable()) { args = new String[0]; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/HotSpotCompressedKlassPointerTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/HotSpotCompressedKlassPointerTest.java index 7e5fece0ea24..99984d3c4c8a 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/HotSpotCompressedKlassPointerTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/HotSpotCompressedKlassPointerTest.java @@ -32,7 +32,6 @@ import jdk.graal.compiler.hotspot.GraalHotSpotVMConfig; import jdk.graal.compiler.nodes.ConstantNode; import jdk.graal.compiler.nodes.StructuredGraph; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant; import jdk.vm.ci.meta.ResolvedJavaType; @@ -41,7 +40,7 @@ public class HotSpotCompressedKlassPointerTest extends HotSpotGraalCompilerTest @Before public void setUp() { GraalHotSpotVMConfig config = runtime().getVMConfig(); - assumeTrue("compressed class pointers specific tests", JavaVersionUtil.JAVA_SPEC >= 24 && config.useCompressedClassPointers); + assumeTrue("compressed class pointers specific tests", config.useCompressedClassPointers); } // Non-abstract class diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/IntegerPolynomialTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/IntegerPolynomialTest.java similarity index 97% rename from compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/IntegerPolynomialTest.java rename to compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/IntegerPolynomialTest.java index e9871235e0cc..29025b5921c3 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/IntegerPolynomialTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/IntegerPolynomialTest.java @@ -23,7 +23,7 @@ * questions. */ -package jdk.graal.compiler.hotspot.jdk23.test; +package jdk.graal.compiler.hotspot.test; import java.math.BigInteger; import java.util.Arrays; @@ -32,7 +32,6 @@ import org.junit.Test; import jdk.graal.compiler.core.test.GraalCompilerTest; -import jdk.graal.compiler.hotspot.test.HotSpotGraalCompilerTest; import jdk.graal.compiler.test.AddExports; import jdk.vm.ci.code.InstalledCode; import sun.security.util.math.ImmutableIntegerModuloP; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/LightweightLockingTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/LightweightLockingTest.java index ae501959b87c..15289c1853b4 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/LightweightLockingTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/LightweightLockingTest.java @@ -26,12 +26,10 @@ import java.io.IOException; -import org.junit.Assume; import org.junit.Test; import jdk.graal.compiler.core.test.SubprocessTest; import jdk.graal.compiler.replacements.test.MonitorTest; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; public class LightweightLockingTest extends SubprocessTest { @@ -54,7 +52,6 @@ public void testMonitor() { @Test public void testInSubprocess() throws InterruptedException, IOException { - Assume.assumeTrue("LockingMode is supported after JDK22)", JavaVersionUtil.JAVA_SPEC >= 22); launchSubprocess(this::testMonitor, "-XX:LockingMode=2"); } diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/SharedExceptionHandlerLoopTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/SharedExceptionHandlerLoopTest.java similarity index 99% rename from compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/SharedExceptionHandlerLoopTest.java rename to compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/SharedExceptionHandlerLoopTest.java index a6327bf58186..b9d3d0255d2f 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/SharedExceptionHandlerLoopTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/SharedExceptionHandlerLoopTest.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.graal.compiler.hotspot.jdk23.test; +package jdk.graal.compiler.hotspot.test; import java.lang.classfile.ClassFile; import java.lang.classfile.Label; diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/UnsafeSetMemoryTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/UnsafeSetMemoryTest.java similarity index 98% rename from compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/UnsafeSetMemoryTest.java rename to compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/UnsafeSetMemoryTest.java index 663588402c3d..4ae6ab1e6790 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/UnsafeSetMemoryTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/UnsafeSetMemoryTest.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.graal.compiler.hotspot.jdk23.test; +package jdk.graal.compiler.hotspot.test; import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; diff --git a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/VectorizedHashCodeTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/VectorizedHashCodeTest.java similarity index 99% rename from compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/VectorizedHashCodeTest.java rename to compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/VectorizedHashCodeTest.java index 65ebce73b493..6028dcf34170 100644 --- a/compiler/src/jdk.graal.compiler.hotspot.jdk23.test/src/jdk/graal/compiler/hotspot/jdk23/test/VectorizedHashCodeTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/VectorizedHashCodeTest.java @@ -22,7 +22,7 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.graal.compiler.hotspot.jdk23.test; +package jdk.graal.compiler.hotspot.test; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/StringCompressInflateTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/StringCompressInflateTest.java index e0ea6d7a1cb5..214c2a81d387 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/StringCompressInflateTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/StringCompressInflateTest.java @@ -42,7 +42,6 @@ import jdk.graal.compiler.replacements.StringLatin1InflateNode; import jdk.graal.compiler.replacements.StringUTF16CompressNode; import jdk.graal.compiler.replacements.amd64.AMD64GraphBuilderPlugins; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.test.AddExports; import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.code.InvalidInstalledCodeException; @@ -300,26 +299,24 @@ public void testStringUTF16CompressCharByte() throws ClassNotFoundException { } } - if (JavaVersionUtil.JAVA_SPEC >= 22) { - // Exhaustively check compress returning the correct index of the non-latin1 char. - final int size = 48; - final byte fillByte = 'R'; - char[] chars = new char[size]; - final byte[] bytes = new byte[chars.length]; - Arrays.fill(bytes, fillByte); - for (int i = 0; i < size; i++) { // Every starting index - for (int j = i; j < size; j++) { // Every location of non-latin1 - Arrays.fill(chars, 'A'); - chars[j] = 0xFF21; - byte[] dst = Arrays.copyOf(bytes, bytes.length); - byte[] dst2 = Arrays.copyOf(bytes, bytes.length); - int result = (int) invokeSafe(caller, null, chars, i, dst, 0, chars.length - i); - int result2 = (int) executeVarargsSafe(code, chars, i, dst2, 0, chars.length - i); - Assert.assertEquals(result, result2); - Assert.assertArrayEquals(dst, dst2); - Assert.assertEquals("compress found wrong index", j - i, result); - Assert.assertEquals("extra character stored", fillByte, bytes[j]); - } + // Exhaustively check compress returning the correct index of the non-latin1 char. + final int size = 48; + final byte fillByte = 'R'; + char[] chars = new char[size]; + final byte[] bytes = new byte[chars.length]; + Arrays.fill(bytes, fillByte); + for (int i = 0; i < size; i++) { // Every starting index + for (int j = i; j < size; j++) { // Every location of non-latin1 + Arrays.fill(chars, 'A'); + chars[j] = 0xFF21; + byte[] dst = Arrays.copyOf(bytes, bytes.length); + byte[] dst2 = Arrays.copyOf(bytes, bytes.length); + int result = (int) invokeSafe(caller, null, chars, i, dst, 0, chars.length - i); + int result2 = (int) executeVarargsSafe(code, chars, i, dst2, 0, chars.length - i); + Assert.assertEquals(result, result2); + Assert.assertArrayEquals(dst, dst2); + Assert.assertEquals("compress found wrong index", j - i, result); + Assert.assertEquals("extra character stored", fillByte, bytes[j]); } } } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/JFRPartialEvaluationTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/JFRPartialEvaluationTest.java index d0f6888119db..e05863c9ebc2 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/JFRPartialEvaluationTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/JFRPartialEvaluationTest.java @@ -40,7 +40,6 @@ import jdk.graal.compiler.nodes.StructuredGraph; import jdk.graal.compiler.nodes.java.MethodCallTargetNode; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.truffle.test.nodes.AbstractTestNode; import jdk.graal.compiler.truffle.test.nodes.RootTestNode; import jdk.jfr.Event; @@ -69,19 +68,7 @@ public int execute(VirtualFrame frame) { } } }); - if (JavaVersionUtil.JAVA_SPEC == 21) { - Class throwableTracer = findThrowableTracerClass(); - ResolvedJavaMethod traceThrowable = getResolvedJavaMethod(throwableTracer, "traceThrowable"); - OptimizedCallTarget callTarget = (OptimizedCallTarget) root.getCallTarget(); - StructuredGraph graph = partialEval(callTarget, new Object[0]); - // The call from the exception constructor to the JFR tracing must not be inlined. - assertNotNull("The call to ThrowableTracer#traceThrowable was not inlined or is missing.", findInvoke(graph, traceThrowable)); - // Also make sure that the node count hasn't exploded. - assertTrue("The number of graal nodes for an exception instantiation exceeded 100.", graph.getNodeCount() < 100); - } else { - // On JDK-22+ JFR exception tracing is unconditionally disabled by PartialEvaluator - assertPartialEvalEquals(JFRPartialEvaluationTest::constant42, root); - } + assertPartialEvalEquals(JFRPartialEvaluationTest::constant42, root); } @SuppressWarnings("serial") @@ -93,14 +80,6 @@ private static final class TruffleExceptionImpl extends AbstractTruffleException } } - private static Class findThrowableTracerClass() { - try { - return Class.forName("jdk.jfr.internal.instrument.ThrowableTracer"); - } catch (ClassNotFoundException cnf) { - throw new RuntimeException("ThrowableTracer not found", cnf); - } - } - @Test public void testError() throws IOException, InterruptedException { runInSubprocessWithJFREnabled(this::performTestError); @@ -117,21 +96,8 @@ public int execute(VirtualFrame frame) { } } }); - if (JavaVersionUtil.JAVA_SPEC == 21) { - Class throwableTracer = findThrowableTracerClass(); - ResolvedJavaMethod traceThrowable = getResolvedJavaMethod(throwableTracer, "traceThrowable"); - ResolvedJavaMethod traceError = getResolvedJavaMethod(throwableTracer, "traceError"); - OptimizedCallTarget callTarget = (OptimizedCallTarget) root.getCallTarget(); - StructuredGraph graph = partialEval(callTarget, new Object[0]); - // The call from the exception constructor to the JFR tracing must not be inlined. - assertNotNull("The call to ThrowableTracer#traceThrowable was not inlined or is missing.", findInvoke(graph, traceThrowable)); - assertNotNull("The call to ThrowableTracer#traceError was not inlined or is missing.", findInvoke(graph, traceError)); - // Also make sure that the node count hasn't exploded. - assertTrue("The number of graal nodes for an exception instantiation exceeded 100.", graph.getNodeCount() < 100); - } else { - // On JDK-22+ JFR exception tracing is unconditionally disabled by PartialEvaluator - assertPartialEvalEquals(JFRPartialEvaluationTest::constant42, root); - } + // On JDK-22+ JFR exception tracing is unconditionally disabled by PartialEvaluator + assertPartialEvalEquals(JFRPartialEvaluationTest::constant42, root); } @SuppressWarnings("serial") 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 945e3a4d6b2c..d0353ca8b3d6 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 @@ -142,8 +142,8 @@ private HotSpotGraalRuntime.HotSpotGC getSelectedGC() throws GraalError { // of the mark word. public final int lockingMode = getFlag("LockingMode", Integer.class); - public final int lockingModeStack = getConstant("LockingMode::LM_LEGACY", Integer.class, 1, JDK >= 22); - public final int lockingModeLightweight = getConstant("LockingMode::LM_LIGHTWEIGHT", Integer.class, 2, JDK >= 22); + public final int lockingModeStack = getConstant("LockingMode::LM_LEGACY", Integer.class); + public final int lockingModeLightweight = getConstant("LockingMode::LM_LIGHTWEIGHT", Integer.class); public final boolean foldStableValues = getFlag("FoldStableValues", Boolean.class); public final int maxVectorSize = getFlag("MaxVectorSize", Integer.class); @@ -209,7 +209,7 @@ public long gcTotalCollectionsAddress() { // word. This runtime optimization is guarded by the flag UseCompactObjectHeaders. It depends // on compressed class pointers, meaning that if useCompactObjectHeaders is true, // useCompressedClassPointers is certainly true. - public final boolean useCompactObjectHeaders = getFlag("UseCompactObjectHeaders", Boolean.class, false, JDK >= 24); + public final boolean useCompactObjectHeaders = getFlag("UseCompactObjectHeaders", Boolean.class); public final long narrowOopBase = getFieldValue("CompilerToVM::Data::Universe_narrow_oop_base", Long.class, "address"); public final int narrowOopShift = getFieldValue("CompilerToVM::Data::Universe_narrow_oop_shift", Integer.class, "int"); @@ -219,7 +219,6 @@ public final int logMinObjAlignment() { return (int) (Math.log(objectAlignment) / Math.log(2)); } - public final int narrowKlassSize = getFieldValue("CompilerToVM::Data::sizeof_narrowKlass", Integer.class, "int"); public final long narrowKlassBase = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_base", Long.class, "address"); public final int narrowKlassShift = getFieldValue("CompilerToVM::Data::Universe_narrow_klass_shift", Integer.class, "int"); @@ -231,22 +230,21 @@ public final int logMinObjAlignment() { public final int markOffset = getFieldOffset("oopDesc::_mark", Integer.class, markWord); public final int hubOffset = getFieldOffset("oopDesc::_metadata._klass", Integer.class, "Klass*"); - public final boolean useSecondarySupersCache = getFlag("UseSecondarySupersCache", Boolean.class, true, JDK >= 23); - public final boolean useSecondarySupersTable = getFlag("UseSecondarySupersTable", Boolean.class, true, JDK >= 23); + public final boolean useSecondarySupersCache = getFlag("UseSecondarySupersCache", Boolean.class); + public final boolean useSecondarySupersTable = getFlag("UseSecondarySupersTable", Boolean.class); public final int superCheckOffsetOffset = getFieldOffset("Klass::_super_check_offset", Integer.class, "juint"); public final int secondarySuperCacheOffset = getFieldOffset("Klass::_secondary_super_cache", Integer.class, "Klass*"); public final int secondarySupersOffset = getFieldOffset("Klass::_secondary_supers", Integer.class, "Array*"); - public final int klassHashSlotOffset = getFieldOffset("Klass::_hash_slot", Integer.class, "uint8_t", 0, JDK >= 23); - public final int klassBitmapOffset = getFieldOffset("Klass::_secondary_supers_bitmap", Integer.class, "uintx", 0, JDK >= 24); + public final int klassHashSlotOffset = getFieldOffset("Klass::_hash_slot", Integer.class, "uint8_t"); + public final int klassBitmapOffset = getFieldOffset("Klass::_secondary_supers_bitmap", Integer.class, "uintx"); // JDK-8186777 public final int classMirrorOffset = getFieldOffset("Klass::_java_mirror", Integer.class, "OopHandle"); public final int klassSuperKlassOffset = getFieldOffset("Klass::_super", Integer.class, "Klass*"); - public final int klassModifierFlagsOffset = getFieldOffset("Klass::_modifier_flags", Integer.class, "jint", -1, JDK == 21); public final int klassAccessFlagsOffset = getFieldOffset("Klass::_access_flags", Integer.class, "AccessFlags"); - public final int klassMiscFlagsOffset = getFieldOffset("Klass::_misc_flags._flags", Integer.class, "u1", 0, JDK >= 24); + public final int klassMiscFlagsOffset = getFieldOffset("Klass::_misc_flags._flags", Integer.class, "u1"); public final int klassLayoutHelperOffset = getFieldOffset("Klass::_layout_helper", Integer.class, "jint"); public final int klassLayoutHelperNeutralValue = getConstant("Klass::_lh_neutral_value", Integer.class); @@ -261,31 +259,16 @@ public final int logMinObjAlignment() { public final int instanceKlassStateBeingInitialized = getConstant("InstanceKlass::being_initialized", Integer.class); public final int instanceKlassStateFullyInitialized = getConstant("InstanceKlass::fully_initialized", Integer.class); - public final int arrayOopDescSize = getFieldValue("CompilerToVM::Data::sizeof_arrayOopDesc", Integer.class, "int"); - - public final int arrayLengthOffsetInBytes = getFieldValue("CompilerToVM::Data::arrayOopDesc_length_offset_in_bytes", Integer.class, "int", -1, JDK >= 24); - - /** - * The offset of the array length word in an array object's header. - *

- * See {@code arrayOopDesc::length_offset_in_bytes()}. - */ - public final int arrayOopDescLengthOffset() { - if (JDK >= 24) { - return arrayLengthOffsetInBytes; - } - return useCompressedClassPointers ? hubOffset + narrowKlassSize : arrayOopDescSize; - } + public final int arrayLengthOffsetInBytes = getFieldValue("CompilerToVM::Data::arrayOopDesc_length_offset_in_bytes", Integer.class, "int"); public final int metaspaceArrayLengthOffset = getFieldOffset("Array::_length", Integer.class, "int"); public final int metaspaceArrayBaseOffset = getFieldOffset("Array::_data[0]", Integer.class, "Klass*"); public final int arrayClassElementOffset = getFieldOffset("ObjArrayKlass::_element_klass", Integer.class, "Klass*"); - public final int jvmAccWrittenFlags = getConstant("JVM_ACC_WRITTEN_FLAGS", Integer.class, -1, JDK == 21); - public final int jvmAccIsHiddenClass = JDK >= 24 ? getConstant("KlassFlags::_misc_is_hidden_class", Integer.class) : getConstant("JVM_ACC_IS_HIDDEN_CLASS", Integer.class); - public final int jvmAccIsValueBasedClass = JDK >= 24 ? getConstant("KlassFlags::_misc_is_value_based_class", Integer.class) : getConstant("JVM_ACC_IS_VALUE_BASED_CLASS", Integer.class); - public final int jvmAccHasFinalizer = JDK >= 24 ? getConstant("KlassFlags::_misc_has_finalizer", Integer.class) : getConstant("JVM_ACC_HAS_FINALIZER", Integer.class); + public final int jvmAccIsHiddenClass = getConstant("KlassFlags::_misc_is_hidden_class", Integer.class); + public final int jvmAccIsValueBasedClass = getConstant("KlassFlags::_misc_is_value_based_class", Integer.class); + public final int jvmAccHasFinalizer = getConstant("KlassFlags::_misc_has_finalizer", Integer.class); public final int jvmciCompileStateCanPostOnExceptionsOffset = getFieldOffset("JVMCICompileState::_jvmti_can_post_on_exceptions", Integer.class, "jbyte"); public final int jvmciCompileStateCanPopFrameOffset = getFieldOffset("JVMCICompileState::_jvmti_can_pop_frame", Integer.class, "jbyte"); @@ -307,11 +290,10 @@ public final int arrayOopDescLengthOffset() { public final int javaThreadThreadObjOffset = getFieldOffset("JavaThread::_threadObj", Integer.class, "OopHandle"); public final int javaThreadScopedValueCacheOffset = getFieldOffset("JavaThread::_scopedValueCache", Integer.class, "OopHandle"); - public final int javaThreadMonitorOwnerIDOffset = getFieldOffset("JavaThread::_monitor_owner_id", Integer.class, "int64_t", -1, JDK > 21); + public final int javaThreadMonitorOwnerIDOffset = getFieldOffset("JavaThread::_monitor_owner_id", Integer.class, "int64_t"); public final int javaThreadIsInVTMSTransitionOffset = getFieldOffset("JavaThread::_is_in_VTMS_transition", Integer.class, "bool"); - public final int javaThreadIsInTmpVTMSTransitionOffset = getFieldOffset("JavaThread::_is_in_tmp_VTMS_transition", Integer.class, "bool", -1, JDK == 21); - public final int javaThreadIsDisableSuspendOffset = getFieldOffset("JavaThread::_is_disable_suspend", Integer.class, "bool", -1, JDK >= 22); + public final int javaThreadIsDisableSuspendOffset = getFieldOffset("JavaThread::_is_disable_suspend", Integer.class, "bool"); public final int javaLangThreadJFREpochOffset = getFieldValue("java_lang_Thread::_jfr_epoch_offset", Integer.class, "int"); public final int javaLangThreadTIDOffset = getFieldValue("java_lang_Thread::_tid_offset", Integer.class, "int"); @@ -326,7 +308,7 @@ public final int arrayOopDescLengthOffset() { public final int jfrThreadLocalVthreadExcludedOffset = getFieldOffset("JfrThreadLocal::_vthread_excluded", Integer.class, "bool"); public final int jfrThreadLocalVthreadOffset = getFieldOffset("JfrThreadLocal::_vthread", Integer.class, "bool"); - public final int threadObjectResultOffset = getFieldOffset(JDK == 21 ? "JavaThread::_vm_result" : "JavaThread::_vm_result_oop", Integer.class, "oop"); + public final int threadObjectResultOffset = getFieldOffset("JavaThread::_vm_result_oop", Integer.class, "oop"); public final int jvmciCountersThreadOffset = getFieldOffset("JavaThread::_jvmci_counters", Integer.class, "jlong*"); public final int jvmciReserved0Offset = getFieldOffset("JavaThread::_jvmci_reserved0", Integer.class, "jlong"); @@ -387,25 +369,24 @@ public int threadLastJavaFpOffset() { // Mark word right shift to get identity hash code. public final int markWordHashCodeShift = getConstant("markWord::hash_shift", Integer.class); // Mark word right shift to get compressed klass pointer - public final int markWordKlassShift = getConstant("markWord::klass_shift", Integer.class, 0, JDK >= 24); + public final int markWordKlassShift = getConstant("markWord::klass_shift", Integer.class); // The following three constants are declared as 64 bits uintptr_t, but known to be 32 bits public final int unlockedValue = getConstant("markWord::unlocked_value", Integer.class); public final int monitorValue = getConstant("markWord::monitor_value", Integer.class); public final int ageMaskInPlace = getConstant("markWord::age_mask_in_place", Integer.class); - public final int unusedMark = getConstant("markWord::marked_value", Integer.class, 3, JDK > 21); + public final int unusedMark = getConstant("markWord::marked_value", Integer.class); // Identity hash code value when uninitialized. public final int uninitializedIdentityHashCodeValue = getConstant("markWord::no_hash", Integer.class); // This field has no type in vmStructs.cpp - public final int objectMonitorOwner = getFieldOffset("ObjectMonitor::_owner", Integer.class, JDK > 21 ? "int64_t" : null); + public final int objectMonitorOwner = getFieldOffset("ObjectMonitor::_owner", Integer.class, "int64_t"); public final int objectMonitorRecursions = getFieldOffset("ObjectMonitor::_recursions", Integer.class, "intptr_t"); - public final int objectMonitorCxq = getFieldOffset("ObjectMonitor::_cxq", Integer.class, "ObjectWaiter*", -1, JDK == 21); - public final int objectMonitorEntryList = getFieldOffset(JDK == 21 ? "ObjectMonitor::_EntryList" : "ObjectMonitor::_entry_list", Integer.class, "ObjectWaiter*"); - public final int objectMonitorSucc = getFieldOffset("ObjectMonitor::_succ", Integer.class, JDK > 21 ? "int64_t" : "JavaThread*"); + public final int objectMonitorEntryList = getFieldOffset("ObjectMonitor::_entry_list", Integer.class, "ObjectWaiter*"); + public final int objectMonitorSucc = getFieldOffset("ObjectMonitor::_succ", Integer.class, "int64_t"); - public final int contEntryOffset = getFieldOffset("JavaThread::_cont_entry", Integer.class, "ContinuationEntry*", -1, JDK >= 24); - public final int pinCountOffset = getFieldOffset("ContinuationEntry::_pin_count", Integer.class, "uint32_t", -1, JDK >= 24); + public final int contEntryOffset = getFieldOffset("JavaThread::_cont_entry", Integer.class, "ContinuationEntry*"); + public final int pinCountOffset = getFieldOffset("ContinuationEntry::_pin_count", Integer.class, "uint32_t"); public final int methodCompiledEntryOffset = getFieldOffset("Method::_from_compiled_entry", Integer.class, "address"); @@ -423,7 +404,7 @@ public int threadLastJavaFpOffset() { public final long verifyOopMask = getFieldValue("CompilerToVM::Data::Universe_verify_oop_mask", Long.class, "uintptr_t"); public final long verifyOopBits = getFieldValue("CompilerToVM::Data::Universe_verify_oop_bits", Long.class, "uintptr_t"); - public final int logOfHRGrainBytes = getFieldValue(JDK >= 23 ? "G1HeapRegion::LogOfHRGrainBytes" : "HeapRegion::LogOfHRGrainBytes", Integer.class, JDK >= 22 ? "uint" : "int"); + public final int logOfHRGrainBytes = getFieldValue("G1HeapRegion::LogOfHRGrainBytes", Integer.class, "uint"); public final int cardtableShift = getFieldValue("CompilerToVM::Data::cardtable_shift", Integer.class, "int"); public final long cardtableStartAddress = getFieldValue("CompilerToVM::Data::cardtable_start_address", Long.class, "CardTable::CardValue*"); @@ -439,7 +420,7 @@ public int threadLastJavaFpOffset() { * for {@code Unsafe.allocateInstance} to deopt when * {@code *shouldNotifyObjectAllocAddress != 0}. */ - public final long shouldNotifyObjectAllocAddress = getFieldValue("CompilerToVM::Data::_should_notify_object_alloc", Long.class, "int*", 0L, JDK >= 23); + public final long shouldNotifyObjectAllocAddress = getFieldValue("CompilerToVM::Data::_should_notify_object_alloc", Long.class, "int*"); // Check whether low-latency G1 post write barriers implemented in JDK-8340827 are available public final boolean g1LowLatencyPostWriteBarrierSupport = getStore().getConstants().containsKey("G1ThreadLocalData::card_table_base_offset"); @@ -459,13 +440,12 @@ public int threadLastJavaFpOffset() { public final int arrayKlassOffset = getFieldValue("java_lang_Class::_array_klass_offset", Integer.class, "int"); public final int basicLockSize = getFieldValue("CompilerToVM::Data::sizeof_BasicLock", Integer.class, "int"); - public final int basicLockMetadataOffset = JDK >= 24 ? getFieldOffset("BasicLock::_metadata", Integer.class, "uintptr_t") : getFieldOffset("BasicLock::_displaced_header", Integer.class, markWord); + public final int basicLockMetadataOffset = getFieldOffset("BasicLock::_metadata", Integer.class, "uintptr_t"); - public final boolean useObjectMonitorTable = getFlag("UseObjectMonitorTable", Boolean.class, false, JDK >= 24); + public final boolean useObjectMonitorTable = getFlag("UseObjectMonitorTable", Boolean.class); // JDK-8253180 & JDK-8265932 - 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 threadPollDataOffset = getFieldOffset("Thread::_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"); @@ -518,11 +498,10 @@ public int threadTlabTopOffset() { public final long poly1305ProcessBlocks = getFieldValue("StubRoutines::_poly1305_processBlocks", Long.class, "address"); public final long chacha20Block = getFieldValue("StubRoutines::_chacha20Block", Long.class, "address"); - public final long intpolyMontgomeryMultP256 = getFieldValue("StubRoutines::_intpoly_montgomeryMult_P256", Long.class, "address", 0L, JDK >= 25); - public final long intpolyAssign = getFieldValue("StubRoutines::_intpoly_assign", Long.class, "address", 0L, JDK >= 23); + public final long intpolyMontgomeryMultP256 = getFieldValue("StubRoutines::_intpoly_montgomeryMult_P256", Long.class, "address"); + public final long intpolyAssign = getFieldValue("StubRoutines::_intpoly_assign", Long.class, "address"); - public final long throwDelayedStackOverflowErrorEntry = getFieldValue(JDK >= 24 ? "CompilerToVM::Data::SharedRuntime_throw_delayed_StackOverflowError_entry" - : "StubRoutines::_throw_delayed_StackOverflowError_entry", Long.class, "address"); + public final long throwDelayedStackOverflowErrorEntry = getFieldValue("CompilerToVM::Data::SharedRuntime_throw_delayed_StackOverflowError_entry", Long.class, "address"); public final long jbyteArraycopy = getFieldValue("StubRoutines::_jbyte_arraycopy", Long.class, "address"); public final long jshortArraycopy = getFieldValue("StubRoutines::_jshort_arraycopy", Long.class, "address"); @@ -552,14 +531,14 @@ public int threadTlabTopOffset() { public final long checkcastArraycopyUninit = getFieldValue("StubRoutines::_checkcast_arraycopy_uninit", Long.class, "address"); public final long unsafeArraycopy = getFieldValue("StubRoutines::_unsafe_arraycopy", Long.class, "address"); public final long genericArraycopy = getFieldValue("StubRoutines::_generic_arraycopy", Long.class, "address"); - public final long unsafeSetMemory = getFieldValue("StubRoutines::_unsafe_setmemory", Long.class, "address", 0L, JDK >= 23); + public final long unsafeSetMemory = getFieldValue("StubRoutines::_unsafe_setmemory", Long.class, "address"); - public final long stubDoubleKeccak = getFieldValue("StubRoutines::_double_keccak", Long.class, "address", 0L, JDK >= 25); - public final long stubDilithiumAlmostNtt = getFieldValue("StubRoutines::_dilithiumAlmostNtt", Long.class, "address", 0L, JDK >= 25); - public final long stubDilithiumAlmostInverseNtt = getFieldValue("StubRoutines::_dilithiumAlmostInverseNtt", Long.class, "address", 0L, JDK >= 25); - public final long stubDilithiumNttMult = getFieldValue("StubRoutines::_dilithiumNttMult", Long.class, "address", 0L, JDK >= 25); - public final long stubDilithiumMontMulByConstant = getFieldValue("StubRoutines::_dilithiumMontMulByConstant", Long.class, "address", 0L, JDK >= 25); - public final long stubDilithiumDecomposePoly = getFieldValue("StubRoutines::_dilithiumDecomposePoly", Long.class, "address", 0L, JDK >= 25); + public final long stubDoubleKeccak = getFieldValue("StubRoutines::_double_keccak", Long.class, "address"); + public final long stubDilithiumAlmostNtt = getFieldValue("StubRoutines::_dilithiumAlmostNtt", Long.class, "address"); + public final long stubDilithiumAlmostInverseNtt = getFieldValue("StubRoutines::_dilithiumAlmostInverseNtt", Long.class, "address"); + public final long stubDilithiumNttMult = getFieldValue("StubRoutines::_dilithiumNttMult", Long.class, "address"); + public final long stubDilithiumMontMulByConstant = getFieldValue("StubRoutines::_dilithiumMontMulByConstant", Long.class, "address"); + public final long stubDilithiumDecomposePoly = getFieldValue("StubRoutines::_dilithiumDecomposePoly", Long.class, "address"); // Allocation stubs that return null when allocation fails public final long newInstanceOrNullAddress = getAddress("JVMCIRuntime::new_instance_or_null"); @@ -654,14 +633,14 @@ private long getZGCAddressField(String name) { // Tracking of the number of monitors held by the current thread. This is used by loom but in // JDK 20 was enabled by default to ensure it was correctly implemented. - public final int threadHeldMonitorCountOffset = getFieldOffset("JavaThread::_held_monitor_count", Integer.class, JDK >= 22 ? "intx" : "int64_t"); - public final int threadLockStackOffset = getFieldOffset("JavaThread::_lock_stack", Integer.class, "LockStack", -1, JDK >= 22); - public final int lockStackTopOffset = getFieldOffset("LockStack::_top", Integer.class, "uint32_t", -1, JDK >= 22); - public final int lockStackEndOffset = getConstant("LockStack::_end_offset", Integer.class, -1, JDK >= 22); - public final int threadOmCacheOffset = getFieldOffset("JavaThread::_om_cache", Integer.class, "OMCache", -1, JDK >= 24); - public final int threadUnlockedInflatedMonitorOffset = getFieldOffset("JavaThread::_unlocked_inflated_monitor", Integer.class, "ObjectMonitor*", -1, JDK >= 24); - public final int omCacheOopToOopDifference = getConstant("OMCache::oop_to_oop_difference", Integer.class, -1, JDK >= 24); - public final int omCacheOopToMonitorDifference = getConstant("OMCache::oop_to_monitor_difference", Integer.class, -1, JDK >= 24); + public final int threadHeldMonitorCountOffset = getFieldOffset("JavaThread::_held_monitor_count", Integer.class, "intx"); + public final int threadLockStackOffset = getFieldOffset("JavaThread::_lock_stack", Integer.class, "LockStack"); + public final int lockStackTopOffset = getFieldOffset("LockStack::_top", Integer.class, "uint32_t"); + public final int lockStackEndOffset = getConstant("LockStack::_end_offset", Integer.class); + public final int threadOmCacheOffset = getFieldOffset("JavaThread::_om_cache", Integer.class, "OMCache"); + public final int threadUnlockedInflatedMonitorOffset = getFieldOffset("JavaThread::_unlocked_inflated_monitor", Integer.class, "ObjectMonitor*"); + public final int omCacheOopToOopDifference = getConstant("OMCache::oop_to_oop_difference", Integer.class); + public final int omCacheOopToMonitorDifference = getConstant("OMCache::oop_to_monitor_difference", Integer.class); public final long throwAndPostJvmtiExceptionAddress = getAddress("JVMCIRuntime::throw_and_post_jvmti_exception"); public final long throwKlassExternalNameExceptionAddress = getAddress("JVMCIRuntime::throw_klass_external_name_exception"); @@ -687,7 +666,7 @@ private long getZGCAddressField(String name) { public final long arithmeticSinAddress = getFieldValue("CompilerToVM::Data::dsin", Long.class, "address"); public final long arithmeticCosAddress = getFieldValue("CompilerToVM::Data::dcos", Long.class, "address"); public final long arithmeticTanAddress = getFieldValue("CompilerToVM::Data::dtan", Long.class, "address"); - public final long arithmeticTanhAddress = getFieldValue("CompilerToVM::Data::dtanh", Long.class, "address", 0L, JDK >= 24); + public final long arithmeticTanhAddress = getFieldValue("CompilerToVM::Data::dtanh", Long.class, "address"); public final long arithmeticExpAddress = getFieldValue("CompilerToVM::Data::dexp", Long.class, "address"); public final long arithmeticLogAddress = getFieldValue("CompilerToVM::Data::dlog", Long.class, "address"); public final long arithmeticLog10Address = getFieldValue("CompilerToVM::Data::dlog10", Long.class, "address"); @@ -706,7 +685,7 @@ public boolean supportJVMTIVThreadNotification() { } // JDK-8322630 - public final int icSpeculatedKlassOffset = getFieldOffset("CompiledICData::_speculated_klass", Integer.class, "uintptr_t", Integer.MAX_VALUE, JDK >= 23); + public final int icSpeculatedKlassOffset = getFieldOffset("CompiledICData::_speculated_klass", Integer.class, "uintptr_t"); public final int jvmciCountersSize = getFlag("JVMCICounterSize", Integer.class); @@ -714,7 +693,7 @@ public boolean supportJVMTIVThreadNotification() { public final boolean deoptimizationSupportLargeAccessByteArrayVirtualization = // getConstant("Deoptimization::_support_large_access_byte_array_virtualization", Boolean.class); - public final int l1LineSize = getFieldValue("CompilerToVM::Data::L1_line_size", Integer.class, "int", 0, JDK >= 24 && "amd64".equals(osArch)); + public final int l1LineSize = getFieldValue("CompilerToVM::Data::L1_line_size", Integer.class, "int", 0, "amd64".equals(osArch)); // Checkstyle: stop public final int VMINTRINSIC_FIRST_MH_SIG_POLY = getConstant("vmIntrinsics::FIRST_MH_SIG_POLY", Integer.class); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfigAccess.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfigAccess.java index e7ee7156d090..8f256db68c8a 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfigAccess.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/GraalHotSpotVMConfigAccess.java @@ -112,7 +112,6 @@ public static boolean jvmciGE(JVMCIVersionCheck.Version v) { return JVMCI && !JVMCI_VERSION.isLessThan(v); } - public static final int JDK = JavaVersionUtil.JAVA_SPEC; public static final JVMCIVersionCheck.Version JVMCI_VERSION; public static final boolean JVMCI; public static final boolean JDK_PRERELEASE; @@ -183,7 +182,7 @@ protected void reportErrors() { if (!missing.isEmpty() || !unexpected.isEmpty()) { String jvmci = JVMCI_VERSION == null ? "" : " jvmci-" + JVMCI_VERSION; String runtime = String.format("JDK %d%s %s-%s (java.home=%s, java.vm.name=%s, java.vm.version=%s)", - JDK, jvmci, osName, osArch, + JavaVersionUtil.JAVA_SPEC, jvmci, osName, osArch, getSavedProperty("java.home"), getSavedProperty("java.vm.name"), getSavedProperty("java.vm.version")); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalRuntime.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalRuntime.java index fdfc96aa7eda..faa5833f73e8 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalRuntime.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalRuntime.java @@ -35,7 +35,6 @@ import java.util.Map; import java.util.function.Predicate; -import jdk.graal.compiler.core.common.LibGraalSupport; import org.graalvm.collections.EconomicMap; import org.graalvm.collections.Equivalence; @@ -47,6 +46,7 @@ import jdk.graal.compiler.core.common.CompilationListenerProfiler; import jdk.graal.compiler.core.common.CompilerProfiler; import jdk.graal.compiler.core.common.GraalOptions; +import jdk.graal.compiler.core.common.LibGraalSupport; import jdk.graal.compiler.core.common.spi.ForeignCallsProvider; import jdk.graal.compiler.core.target.Backend; import jdk.graal.compiler.debug.DebugContext; @@ -66,7 +66,6 @@ import jdk.graal.compiler.replacements.SnippetCounter.Group; import jdk.graal.compiler.runtime.RuntimeProvider; import jdk.graal.compiler.serviceprovider.GraalServices; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.code.stack.StackIntrospection; import jdk.vm.ci.common.InitTimer; @@ -208,7 +207,7 @@ public enum HotSpotGC { Serial("UseSerialGC"), Parallel("UseParallelGC"), G1("UseG1GC"), - Z(JavaVersionUtil.JAVA_SPEC > 21, true, flagIsSet("UseZGC")), + Z(true, true, flagIsSet("UseZGC")), Epsilon(true, true, flagIsSet("UseEpsilonGC")), // Unsupported GCs diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java index 528a12d9b47f..6f6ac9175d1f 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java @@ -497,7 +497,7 @@ public void emitSpinWait() { @Override public int getArrayLengthOffset() { - return config.arrayOopDescLengthOffset(); + return config.arrayLengthOffsetInBytes; } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java index 04414791e04b..46e9d0e624c6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java @@ -625,7 +625,7 @@ protected StrategySwitchOp createStrategySwitchOp(SwitchStrategy strategy, Label @Override public int getArrayLengthOffset() { - return config.arrayOopDescLengthOffset(); + return config.arrayLengthOffsetInBytes; } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java index a6d536447fe7..a5684a66d38e 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/DefaultHotSpotLoweringProvider.java @@ -1195,7 +1195,7 @@ public int fieldOffset(ResolvedJavaField f) { @Override public int arrayLengthOffset() { - return runtime.getVMConfig().arrayOopDescLengthOffset(); + return runtime.getVMConfig().arrayLengthOffsetInBytes; } @Override 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 28f37fcd9b87..46bd3c7b8dfe 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 @@ -67,7 +67,6 @@ import java.lang.ref.Reference; import java.lang.reflect.Array; import java.lang.reflect.Modifier; -import java.lang.reflect.Type; import java.math.BigInteger; import java.util.zip.CRC32; @@ -191,7 +190,6 @@ import jdk.graal.compiler.replacements.nodes.VectorizedHashCodeNode; import jdk.graal.compiler.replacements.nodes.VectorizedMismatchNode; import jdk.graal.compiler.serviceprovider.GraalServices; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.serviceprovider.SpeculationReasonGroup; import jdk.graal.compiler.word.WordTypes; import jdk.vm.ci.aarch64.AArch64; @@ -378,47 +376,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec private static void registerClassPlugins(Plugins plugins, GraalHotSpotVMConfig config, Replacements replacements) { Registration r = new Registration(plugins.getInvocationPlugins(), Class.class, replacements); - if (JavaVersionUtil.JAVA_SPEC == 21) { - r.register(new InvocationPlugin("getModifiers", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - ValueNode klass = helper.readKlassFromClass(receiver.get(true)); - // Primitive Class case - ValueNode nonNullKlass = helper.emitNullReturnGuard(klass, ConstantNode.forInt(Modifier.ABSTRACT | Modifier.FINAL | Modifier.PUBLIC), GraalDirectives.UNLIKELY_PROBABILITY); - // other return Klass::_modifier_flags - helper.emitFinalReturn(JavaKind.Int, helper.readKlassModifierFlags(nonNullKlass)); - } - return true; - } - }); - r.register(new InvocationPlugin("isInterface", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - ValueNode klass = helper.readKlassFromClass(receiver.get(true)); - // Primitive Class case returns false - ValueNode klassNonNull = helper.emitNullReturnGuard(klass, ConstantNode.forBoolean(false), GraalDirectives.UNLIKELY_PROBABILITY); - ValueNode accessFlags = helper.readKlassAccessFlags(klassNonNull); - // return (Klass::_access_flags & Modifier.INTERFACE) == 0 ? false : true - LogicNode test = IntegerTestNode.create(accessFlags, ConstantNode.forInt(Modifier.INTERFACE), NodeView.DEFAULT); - helper.emitFinalReturn(JavaKind.Boolean, ConditionalNode.create(test, ConstantNode.forBoolean(false), ConstantNode.forBoolean(true), NodeView.DEFAULT)); - } - return true; - } - }); - r.register(new InvocationPlugin("isPrimitive", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - ValueNode klass = helper.readKlassFromClass(receiver.get(true)); - LogicNode isNull = b.add(IsNullNode.create(klass)); - b.addPush(JavaKind.Boolean, ConditionalNode.create(isNull, b.add(forBoolean(true)), b.add(forBoolean(false)), NodeView.DEFAULT)); - } - return true; - } - }); - } r.register(new InvocationPlugin("getSuperclass", Receiver.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { @@ -461,8 +418,7 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec // Primitive Class case returns false ValueNode nonNullKlass = helper.emitNullReturnGuard(klass, ConstantNode.forBoolean(false), GraalDirectives.UNLIKELY_PROBABILITY); // return (Klass::_misc_flags & jvmAccIsHiddenClass) != 0 - // or return (Klass::_access_flags & jvmAccIsHiddenClass) != 0 on JDK 21 - ValueNode flags = JavaVersionUtil.JAVA_SPEC >= 24 ? helper.readKlassMiscFlags(nonNullKlass) : helper.readKlassAccessFlags(nonNullKlass); + ValueNode flags = helper.readKlassMiscFlags(nonNullKlass); LogicNode test = IntegerTestNode.create(flags, ConstantNode.forInt(config.jvmAccIsHiddenClass), NodeView.DEFAULT); helper.emitFinalReturn(JavaKind.Boolean, ConditionalNode.create(test, ConstantNode.forBoolean(false), ConstantNode.forBoolean(true), NodeView.DEFAULT)); } @@ -508,11 +464,7 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec ValueNode klassNonNull = helper.emitNullReturnGuard(klass, ConstantNode.forInt(Modifier.ABSTRACT | Modifier.FINAL | Modifier.PUBLIC), GraalDirectives.UNLIKELY_PROBABILITY); // Return (Klass::_access_flags & jvmAccWrittenFlags) ValueNode accessFlags = helper.readKlassAccessFlags(klassNonNull); - if (JavaVersionUtil.JAVA_SPEC == 21) { - helper.emitFinalReturn(JavaKind.Int, new AndNode(accessFlags, ConstantNode.forInt(config.jvmAccWrittenFlags))); - } else { - helper.emitFinalReturn(JavaKind.Int, accessFlags); - } + helper.emitFinalReturn(JavaKind.Int, accessFlags); } return true; } @@ -744,13 +696,11 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec b.add(new WriteNode(handleAddress, HOTSPOT_CURRENT_THREAD_OOP_HANDLE_LOCATION, thread, barrierSet.writeBarrierType(HOTSPOT_CURRENT_THREAD_OOP_HANDLE_LOCATION), MemoryOrderMode.PLAIN)); - if (JavaVersionUtil.JAVA_SPEC > 21) { - GraalError.guarantee(config.javaThreadMonitorOwnerIDOffset != -1, "JavaThread::_lock_id should have been exported"); - // Change the lock_id of the JavaThread - ValueNode monitorOwnerID = helper.loadField(thread, helper.getField(b.getMetaAccess().lookupJavaType(Thread.class), "tid")); - OffsetAddressNode address = b.add(new OffsetAddressNode(javaThread, helper.asWord(config.javaThreadMonitorOwnerIDOffset))); - b.add(new JavaWriteNode(JavaKind.Long, address, JAVA_THREAD_MONITOR_OWNER_ID_LOCATION, monitorOwnerID, BarrierType.NONE, false)); - } + GraalError.guarantee(config.javaThreadMonitorOwnerIDOffset != -1, "JavaThread::_lock_id should have been exported"); + // Change the lock_id of the JavaThread + ValueNode monitorOwnerID = helper.loadField(thread, helper.getField(b.getMetaAccess().lookupJavaType(Thread.class), "tid")); + OffsetAddressNode address = b.add(new OffsetAddressNode(javaThread, helper.asWord(config.javaThreadMonitorOwnerIDOffset))); + b.add(new JavaWriteNode(JavaKind.Long, address, JAVA_THREAD_MONITOR_OWNER_ID_LOCATION, monitorOwnerID, BarrierType.NONE, false)); if (HotSpotReplacementsUtil.supportsVirtualThreadUpdateJFR(config)) { b.add(new VirtualThreadUpdateJFRNode(thread)); } @@ -882,10 +832,8 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec private static void registerContinuationPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, Replacements replacements) { Registration r = new Registration(plugins, "jdk.internal.vm.Continuation", replacements); - if (JavaVersionUtil.JAVA_SPEC >= 24) { - r.register(new ContinuationPinningPlugin(config, true)); - r.register(new ContinuationPinningPlugin(config, false)); - } + r.register(new ContinuationPinningPlugin(config, true)); + r.register(new ContinuationPinningPlugin(config, false)); } private static void registerVirtualThreadPlugins(InvocationPlugins plugins, GraalHotSpotVMConfig config, Replacements replacements) { @@ -932,48 +880,22 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec } }); } - if (JavaVersionUtil.JAVA_SPEC == 21) { - r.register(new InvocationPlugin("notifyJvmtiHideFrames", Receiver.class, boolean.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode hide) { - if (config.doJVMTIVirtualThreadTransitions) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - receiver.get(true); - // unconditionally update the temporary VTMS transition bit in current - // JavaThread - GraalError.guarantee(config.javaThreadIsInTmpVTMSTransitionOffset != -1, "JavaThread::_is_in_tmp_VTMS_transition is not exported"); - CurrentJavaThreadNode javaThread = b.add(new CurrentJavaThreadNode(helper.getWordKind())); - OffsetAddressNode address = b.add(new OffsetAddressNode(javaThread, helper.asWord(config.javaThreadIsInTmpVTMSTransitionOffset))); - b.add(new JavaWriteNode(JavaKind.Boolean, address, HotSpotReplacementsUtil.HOTSPOT_JAVA_THREAD_IS_IN_TMP_VTMS_TRANSITION, hide, BarrierType.NONE, false)); - } - } - return true; - } - }); - } - - if (JavaVersionUtil.JAVA_SPEC >= 22) { - Type[] notifyJvmtiDisableSuspendArgTypes = JavaVersionUtil.JAVA_SPEC >= 23 ? new Type[]{boolean.class} : new Type[]{Receiver.class, boolean.class}; - r.register(new InvocationPlugin("notifyJvmtiDisableSuspend", notifyJvmtiDisableSuspendArgTypes) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode enter) { - if (config.doJVMTIVirtualThreadTransitions) { - try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { - if (JavaVersionUtil.JAVA_SPEC < 23) { - receiver.get(true); - } - // unconditionally update the is_disable_suspend bit in current - // JavaThread - GraalError.guarantee(config.javaThreadIsDisableSuspendOffset != -1, "JavaThread::_is_disable_suspend is not exported"); - CurrentJavaThreadNode javaThread = b.add(new CurrentJavaThreadNode(helper.getWordKind())); - OffsetAddressNode address = b.add(new OffsetAddressNode(javaThread, helper.asWord(config.javaThreadIsDisableSuspendOffset))); - b.add(new JavaWriteNode(JavaKind.Boolean, address, HotSpotReplacementsUtil.HOTSPOT_JAVA_THREAD_IS_DISABLE_SUSPEND, enter, BarrierType.NONE, false)); - } + r.register(new InvocationPlugin("notifyJvmtiDisableSuspend", boolean.class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode enter) { + if (config.doJVMTIVirtualThreadTransitions) { + try (HotSpotInvocationPluginHelper helper = new HotSpotInvocationPluginHelper(b, targetMethod, config)) { + // unconditionally update the is_disable_suspend bit in current + // JavaThread + GraalError.guarantee(config.javaThreadIsDisableSuspendOffset != -1, "JavaThread::_is_disable_suspend is not exported"); + CurrentJavaThreadNode javaThread = b.add(new CurrentJavaThreadNode(helper.getWordKind())); + OffsetAddressNode address = b.add(new OffsetAddressNode(javaThread, helper.asWord(config.javaThreadIsDisableSuspendOffset))); + b.add(new JavaWriteNode(JavaKind.Boolean, address, HotSpotReplacementsUtil.HOTSPOT_JAVA_THREAD_IS_DISABLE_SUSPEND, enter, BarrierType.NONE, false)); } - return true; } - }); - } + return true; + } + }); } private static ResolvedJavaType resolveTypeAESCrypt(ResolvedJavaType context) { @@ -1551,23 +1473,21 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); - if (JavaVersionUtil.JAVA_SPEC >= 24) { - 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.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 @@ -1581,23 +1501,21 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); - if (JavaVersionUtil.JAVA_SPEC >= 24) { - 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; - } + 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/UnimplementedGraalIntrinsics.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/UnimplementedGraalIntrinsics.java index 37413379729a..c8c17193fd63 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 @@ -32,7 +32,6 @@ import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.aarch64.AArch64; import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.code.Architecture; @@ -86,59 +85,42 @@ private static void add(Collection c, String... elements) { } public UnimplementedGraalIntrinsics(Architecture arch) { - int jdk = JavaVersionUtil.JAVA_SPEC; - - add(toBeInvestigated, // @formatter:off + add(toBeInvestigated, + // JDK-8349721: Add aarch64 intrinsics for ML-KEM + // JDK-8351412: Add AVX-512 intrinsics for ML-KEM + "com/sun/crypto/provider/ML_KEM.implKyber12To16([BI[SI)I", + "com/sun/crypto/provider/ML_KEM.implKyberAddPoly([S[S[S)I", + "com/sun/crypto/provider/ML_KEM.implKyberAddPoly([S[S[S[S)I", + "com/sun/crypto/provider/ML_KEM.implKyberBarrettReduce([S)I", + "com/sun/crypto/provider/ML_KEM.implKyberInverseNtt([S[S)I", + "com/sun/crypto/provider/ML_KEM.implKyberNtt([S[S)I", + "com/sun/crypto/provider/ML_KEM.implKyberNttMult([S[S[S[S)I", + // JDK-8307513: C2: intrinsify Math.max(long,long) and + // Math.min(long,long) + "java/lang/Math.max(JJ)J", + "java/lang/Math.min(JJ)J", // JDK-8309130: x86_64 AVX512 intrinsics for Arrays.sort methods (GR-48679) "java/util/DualPivotQuicksort.partition(Ljava/lang/Class;Ljava/lang/Object;JIIIILjava/util/DualPivotQuicksort$PartitionOperation;)[I", - "java/util/DualPivotQuicksort.sort(Ljava/lang/Class;Ljava/lang/Object;JIILjava/util/DualPivotQuicksort$SortOperation;)V", - // JDK-8223347: Integration of Vector API + "java/util/DualPivotQuicksort.sort(Ljava/lang/Class;Ljava/lang/Object;JIILjava/util/DualPivotQuicksort$SortOperation;)V"); + + add(toBeInvestigated, // @formatter:off + // JDK-8342103: C2 compiler support for Float16 type and associated + // scalar operations + "jdk/internal/vm/vector/Float16Math.fma(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljdk/internal/vm/vector/Float16Math$TernaryOperator;)Ljava/lang/Object;", + "jdk/internal/vm/vector/Float16Math.sqrt(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;", "jdk/internal/vm/vector/VectorSupport.compressExpandOp(ILjava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$CompressExpandOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", "jdk/internal/vm/vector/VectorSupport.indexVector(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;ILjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$IndexOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;", + // JDK-8353786: Migrate Vector API math library support to FFM API + "jdk/internal/vm/vector/VectorSupport.libraryBinaryOp(JLjava/lang/Class;Ljava/lang/Class;ILjava/lang/String;Ljdk/internal/vm/vector/VectorSupport$VectorPayload;Ljdk/internal/vm/vector/VectorSupport$VectorPayload;Ljdk/internal/vm/vector/VectorSupport$BinaryOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", + "jdk/internal/vm/vector/VectorSupport.libraryUnaryOp(JLjava/lang/Class;Ljava/lang/Class;ILjava/lang/String;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$UnaryOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.loadWithMap(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/lang/Object;I[IILjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadVectorOperationWithMap;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.maybeRebox(Ljdk/internal/vm/vector/VectorSupport$VectorPayload;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", + "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;", "jdk/internal/vm/vector/VectorSupport.storeWithMap(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/lang/Object;I[IILjdk/internal/vm/vector/VectorSupport$StoreVectorOperationWithMap;)V" // @formatter:on ); - 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.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 - ); - } - - if (jdk >= 25) { - add(toBeInvestigated, - // JDK-8307513: C2: intrinsify Math.max(long,long) and - // Math.min(long,long) - "java/lang/Math.max(JJ)J", - "java/lang/Math.min(JJ)J", - // JDK-8342103: C2 compiler support for Float16 type and associated - // scalar operations - "jdk/internal/vm/vector/Float16Math.fma(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljdk/internal/vm/vector/Float16Math$TernaryOperator;)Ljava/lang/Object;", - "jdk/internal/vm/vector/Float16Math.sqrt(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;"); - - add(toBeInvestigated, - // JDK-8349721: Add aarch64 intrinsics for ML-KEM - // JDK-8351412: Add AVX-512 intrinsics for ML-KEM - "com/sun/crypto/provider/ML_KEM.implKyber12To16([BI[SI)I", - "com/sun/crypto/provider/ML_KEM.implKyberAddPoly([S[S[S)I", - "com/sun/crypto/provider/ML_KEM.implKyberAddPoly([S[S[S[S)I", - "com/sun/crypto/provider/ML_KEM.implKyberBarrettReduce([S)I", - "com/sun/crypto/provider/ML_KEM.implKyberInverseNtt([S[S)I", - "com/sun/crypto/provider/ML_KEM.implKyberNtt([S[S)I", - "com/sun/crypto/provider/ML_KEM.implKyberNttMult([S[S[S[S)I"); - - add(toBeInvestigated, // @formatter:off - // JDK-8353786: Migrate Vector API math library support to FFM API - "jdk/internal/vm/vector/VectorSupport.libraryBinaryOp(JLjava/lang/Class;Ljava/lang/Class;ILjava/lang/String;Ljdk/internal/vm/vector/VectorSupport$VectorPayload;Ljdk/internal/vm/vector/VectorSupport$VectorPayload;Ljdk/internal/vm/vector/VectorSupport$BinaryOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", - "jdk/internal/vm/vector/VectorSupport.libraryUnaryOp(JLjava/lang/Class;Ljava/lang/Class;ILjava/lang/String;Ljdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$UnaryOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;" - // @formatter:on - ); - } - add(ignore, // These are dead "java/lang/Math.atan2(DD)D", @@ -177,21 +159,10 @@ public UnimplementedGraalIntrinsics(Architecture arch) { add(ignore, "sun/security/provider/SHA2.implCompress0([BI)V"); } - } - - if (jdk == 21) { - // @formatter:off - // JDK-8325169 - // handled by an intrinsic for StringUTF16.indexOfCharUnsafe - add(ignore, "java/lang/StringUTF16.indexOfChar([BIII)I"); - // @formatter:on - } - if (jdk >= 24) { + } else if (arch instanceof AArch64) { // Newly added by JDK-8338694. HotSpot runtime does not implement // C2Compiler::is_intrinsic_supported for this intrinsic properly - if (arch instanceof AArch64) { - add(ignore, "java/lang/Math.tanh(D)D"); - } + add(ignore, "java/lang/Math.tanh(D)D"); } // These are known to be implemented down stream @@ -219,35 +190,22 @@ public UnimplementedGraalIntrinsics(Architecture arch) { "jdk/internal/vm/vector/VectorSupport.broadcastInt(ILjava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;ILjdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorBroadcastIntOp;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.compare(ILjava/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$VectorCompareOp;)Ljdk/internal/vm/vector/VectorSupport$VectorMask;", "jdk/internal/vm/vector/VectorSupport.convert(ILjava/lang/Class;Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$VectorPayload;Ljdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$VectorConvertOp;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", - jdk == 21 ? "jdk/internal/vm/vector/VectorSupport.extract(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;ILjdk/internal/vm/vector/VectorSupport$VecExtractOp;)J": - "jdk/internal/vm/vector/VectorSupport.extract(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$VectorPayload;ILjdk/internal/vm/vector/VectorSupport$VecExtractOp;)J", + "jdk/internal/vm/vector/VectorSupport.extract(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$VectorPayload;ILjdk/internal/vm/vector/VectorSupport$VecExtractOp;)J", "jdk/internal/vm/vector/VectorSupport.fromBitsCoerced(Ljava/lang/Class;Ljava/lang/Class;IJILjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$FromBitsCoercedOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", "jdk/internal/vm/vector/VectorSupport.indexPartiallyInUpperRange(Ljava/lang/Class;Ljava/lang/Class;IJJLjdk/internal/vm/vector/VectorSupport$IndexPartiallyInUpperRangeOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorMask;", "jdk/internal/vm/vector/VectorSupport.insert(Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;IJLjdk/internal/vm/vector/VectorSupport$VecInsertOp;)Ljdk/internal/vm/vector/VectorSupport$Vector;", - jdk == 21 ? "jdk/internal/vm/vector/VectorSupport.load(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JLjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;": - "jdk/internal/vm/vector/VectorSupport.load(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", - jdk == 21 ? "jdk/internal/vm/vector/VectorSupport.loadMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorMask;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadVectorMaskedOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;": - "jdk/internal/vm/vector/VectorSupport.loadMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$VectorMask;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadVectorMaskedOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;", + "jdk/internal/vm/vector/VectorSupport.load(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorPayload;", + "jdk/internal/vm/vector/VectorSupport.loadMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$VectorMask;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorSpecies;Ljdk/internal/vm/vector/VectorSupport$LoadVectorMaskedOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.maskReductionCoerced(ILjava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorMaskOp;)J", "jdk/internal/vm/vector/VectorSupport.rearrangeOp(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorShuffle;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorRearrangeOp;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.reductionCoerced(ILjava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$ReductionOperation;)J", - jdk == 21 ? "jdk/internal/vm/vector/VectorSupport.store(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$VectorPayload;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorOperation;)V": - "jdk/internal/vm/vector/VectorSupport.store(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$VectorPayload;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorOperation;)V", - jdk == 21 ? "jdk/internal/vm/vector/VectorSupport.storeMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorMaskedOperation;)V": - "jdk/internal/vm/vector/VectorSupport.storeMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorMaskedOperation;)V", + "jdk/internal/vm/vector/VectorSupport.store(Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$VectorPayload;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorOperation;)V", + "jdk/internal/vm/vector/VectorSupport.storeMasked(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjava/lang/Object;JZLjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/lang/Object;JLjdk/internal/vm/vector/VectorSupport$StoreVectorMaskedOperation;)V", "jdk/internal/vm/vector/VectorSupport.ternaryOp(ILjava/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$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$TernaryOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;", "jdk/internal/vm/vector/VectorSupport.test(ILjava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljava/util/function/BiFunction;)Z", "jdk/internal/vm/vector/VectorSupport.unaryOp(ILjava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;ILjdk/internal/vm/vector/VectorSupport$Vector;Ljdk/internal/vm/vector/VectorSupport$VectorMask;Ljdk/internal/vm/vector/VectorSupport$UnaryOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;" // @formatter:on ); - - if (jdk == 21) { - add(enterprise, // @formatter:off - "jdk/internal/vm/vector/VectorSupport.shuffleIota(Ljava/lang/Class;Ljava/lang/Class;Ljdk/internal/vm/vector/VectorSupport$VectorSpecies;IIIILjdk/internal/vm/vector/VectorSupport$ShuffleIotaOperation;)Ljdk/internal/vm/vector/VectorSupport$VectorShuffle;", - "jdk/internal/vm/vector/VectorSupport.shuffleToVector(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;Ljdk/internal/vm/vector/VectorSupport$VectorShuffle;ILjdk/internal/vm/vector/VectorSupport$ShuffleToVectorOperation;)Ljdk/internal/vm/vector/VectorSupport$Vector;" - // @formatter:on - ); - } } /** diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotCompressionNode.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotCompressionNode.java index 0da0867c6932..5cf32565dbff 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotCompressionNode.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotCompressionNode.java @@ -38,7 +38,6 @@ import jdk.graal.compiler.nodes.NodeView; import jdk.graal.compiler.nodes.StructuredGraph; import jdk.graal.compiler.nodes.ValueNode; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant; import jdk.vm.ci.hotspot.HotSpotConstant; import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant; @@ -74,7 +73,7 @@ private static CompressionNode uncompress(ValueNode input, CompressEncoding enco @Override public boolean isCompressible(Constant constant) { - if (JavaVersionUtil.JAVA_SPEC >= 24 && constant instanceof HotSpotMetaspaceConstant mc) { + if (constant instanceof HotSpotMetaspaceConstant mc) { ResolvedJavaType type = mc.asResolvedJavaType(); // As of JDK-8338526, interface and abstract types are not compressible. return type.isArray() || (!type.isAbstract() && !type.isInterface()); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotG1WriteBarrierSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotG1WriteBarrierSnippets.java index 31892b2d7df2..63c014e0732c 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotG1WriteBarrierSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotG1WriteBarrierSnippets.java @@ -58,7 +58,6 @@ import jdk.graal.compiler.replacements.SnippetTemplate.AbstractTemplates; import jdk.graal.compiler.replacements.SnippetTemplate.SnippetInfo; import jdk.graal.compiler.replacements.gc.G1WriteBarrierSnippets; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.Word; import jdk.vm.ci.code.Register; import jdk.vm.ci.meta.JavaKind; @@ -233,7 +232,7 @@ public Templates(OptionValues options, Group.Factory factory, HotSpotProviders p SATB_QUEUE_INDEX_LOCATION, SATB_QUEUE_BUFFER_LOCATION); - if (JavaVersionUtil.JAVA_SPEC > 21 && Assertions.assertionsEnabled() && config.verifyBeforeGC) { + if (Assertions.assertionsEnabled() && config.verifyBeforeGC) { g1PostWriteBarrier = snippet(providers, G1WriteBarrierSnippets.class, "g1PostWriteBarrier", diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotInvocationPluginHelper.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotInvocationPluginHelper.java index cf8ce02bb4ad..865c2e2a2a87 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotInvocationPluginHelper.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotInvocationPluginHelper.java @@ -24,7 +24,6 @@ */ package jdk.graal.compiler.hotspot.replacements; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.ARRAY_KLASS_COMPONENT_MIRROR; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.CLASS_ARRAY_KLASS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.HOTSPOT_CONTINUATION_ENTRY_PIN_COUNT_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.HOTSPOT_JAVA_THREAD_CONT_ENTRY_LOCATION; @@ -33,7 +32,6 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_SCOPED_VALUE_CACHE_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_ACCESS_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MISC_FLAGS_LOCATION; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MODIFIER_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_SUPER_KLASS_LOCATION; import java.util.function.Function; @@ -44,7 +42,6 @@ import jdk.graal.compiler.core.common.type.AbstractPointerStamp; import jdk.graal.compiler.core.common.type.Stamp; import jdk.graal.compiler.core.common.type.StampFactory; -import jdk.graal.compiler.core.common.type.TypeReference; import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.hotspot.GraalHotSpotVMConfig; import jdk.graal.compiler.hotspot.nodes.CurrentJavaThreadNode; @@ -61,10 +58,8 @@ import jdk.graal.compiler.nodes.memory.address.AddressNode; import jdk.graal.compiler.nodes.type.StampTool; import jdk.graal.compiler.replacements.InvocationPluginHelper; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaMethod; -import jdk.vm.ci.meta.ResolvedJavaType; /** * A helper class for HotSpot specific invocation plugins. In particular it adds helpers for @@ -81,11 +76,6 @@ public HotSpotInvocationPluginHelper(GraphBuilderContext b, ResolvedJavaMethod t this.barrierSet = b.getPlatformConfigurationProvider().getBarrierSet(); } - private Stamp getClassStamp(boolean nonNull) { - ResolvedJavaType toType = b.getMetaAccess().lookupJavaType(Class.class); - return StampFactory.object(TypeReference.createExactTrusted(toType), nonNull); - } - public ValueNode readKlassFromClass(ValueNode clazz) { return b.add(ClassGetHubNode.create(clazz, b.getMetaAccess(), b.getConstantReflection())); } @@ -115,10 +105,6 @@ private ValueNode readLocation(ValueNode base, int offset, LocationIdentity loca * HotSpot field to ensure they are used consistently in plugins. */ public enum HotSpotVMConfigField { - KLASS_MODIFIER_FLAGS( - config -> config.klassModifierFlagsOffset, - KLASS_MODIFIER_FLAGS_LOCATION, - JavaVersionUtil.JAVA_SPEC == 21 ? StampFactory.forKind(JavaKind.Int) : StampFactory.forUnsignedInteger(JavaKind.Char.getBitCount())), KLASS_SUPER_KLASS(config -> config.klassSuperKlassOffset, KLASS_SUPER_KLASS_LOCATION, KlassPointerStamp.klass()), CLASS_ARRAY_KLASS(config -> config.arrayKlassOffset, CLASS_ARRAY_KLASS_LOCATION, KlassPointerStamp.klassNonNull()), /** JavaThread::_vthread. */ @@ -129,11 +115,11 @@ public enum HotSpotVMConfigField { KLASS_ACCESS_FLAGS( config -> config.klassAccessFlagsOffset, KLASS_ACCESS_FLAGS_LOCATION, - JavaVersionUtil.JAVA_SPEC == 21 ? StampFactory.forKind(JavaKind.Int) : StampFactory.forUnsignedInteger(JavaKind.Char.getBitCount())), + StampFactory.forUnsignedInteger(JavaKind.Char.getBitCount())), KLASS_MISC_FLAGS( config -> config.klassMiscFlagsOffset, KLASS_MISC_FLAGS_LOCATION, - JavaVersionUtil.JAVA_SPEC == 21 ? StampFactory.forKind(JavaKind.Int) : StampFactory.forUnsignedInteger(JavaKind.Byte.getBitCount())), + StampFactory.forUnsignedInteger(JavaKind.Byte.getBitCount())), HOTSPOT_JAVA_THREAD_CONT_ENTRY(config -> config.contEntryOffset, HOTSPOT_JAVA_THREAD_CONT_ENTRY_LOCATION), HOTSPOT_CONTINUATION_ENTRY_PIN_COUNT(config -> config.pinCountOffset, HOTSPOT_CONTINUATION_ENTRY_PIN_COUNT_LOCATION, StampFactory.forKind(JavaKind.Int)); @@ -181,13 +167,6 @@ public Stamp getStamp(JavaKind wordKind) { } - /** - * Read {@code Klass::_modifier_flags} as int. - */ - public ValueNode readKlassModifierFlags(ValueNode klass) { - return ZeroExtendNode.create(readLocation(klass, HotSpotVMConfigField.KLASS_MODIFIER_FLAGS), JavaKind.Int.getBitCount(), NodeView.DEFAULT); - } - /** * Read {@code Klass::_access_flags} as int. */ @@ -209,15 +188,6 @@ public ValueNode klassLayoutHelper(ValueNode klass) { return b.add(KlassLayoutHelperNode.create(config, klass, b.getConstantReflection())); } - /** - * Read {@code ArrayKlass::_component_mirror}. - */ - public ValueNode readArrayKlassComponentMirror(ValueNode klass, GuardingNode guard) { - int offset = config.getFieldOffset("ArrayKlass::_component_mirror", Integer.class, "oop"); - Stamp stamp = getClassStamp(true); - return readLocation(klass, offset, ARRAY_KLASS_COMPONENT_MIRROR, stamp, guard); - } - /** * Read {@code Klass::_super}. */ diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotReplacementsUtil.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotReplacementsUtil.java index 3557f992fae2..7c90aceacccf 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotReplacementsUtil.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotReplacementsUtil.java @@ -25,7 +25,6 @@ package jdk.graal.compiler.hotspot.replacements; import static jdk.graal.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; -import static jdk.graal.compiler.hotspot.GraalHotSpotVMConfigAccess.JDK; import static jdk.graal.compiler.hotspot.meta.HotSpotForeignCallsProviderImpl.VERIFY_OOP; import static jdk.graal.compiler.nodes.CompressionNode.CompressionOp.Compress; @@ -374,21 +373,11 @@ public static int pageSize(@InjectedParameter GraalHotSpotVMConfig config) { public static final LocationIdentity KLASS_ACCESS_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_access_flags"); public static final LocationIdentity KLASS_MISC_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_misc_flags"); - @Fold - public static boolean shouldUseKlassMiscFlags() { - return JDK >= 24; - } - @Fold public static int klassMiscFlagsOffset(@InjectedParameter GraalHotSpotVMConfig config) { return config.klassMiscFlagsOffset; } - @Fold - public static int klassAccessFlagsOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.klassAccessFlagsOffset; - } - @Fold public static int jvmAccHasFinalizer(@InjectedParameter GraalHotSpotVMConfig config) { return config.jvmAccHasFinalizer; @@ -586,11 +575,6 @@ public static int objectMonitorRecursionsOffset(@InjectedParameter GraalHotSpotV return config.objectMonitorRecursions; } - @Fold - public static int objectMonitorCxqOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.objectMonitorCxq; - } - @Fold public static int objectMonitorEntryListOffset(@InjectedParameter GraalHotSpotVMConfig config) { return config.objectMonitorEntryList; @@ -623,7 +607,7 @@ public static int metaspaceArrayBaseOffset(@InjectedParameter GraalHotSpotVMConf @Fold public static int arrayLengthOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.arrayOopDescLengthOffset(); + return config.arrayLengthOffsetInBytes; } @Fold diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotSerialWriteBarrierSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotSerialWriteBarrierSnippets.java index 94a3fe6f4357..063e476b9968 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotSerialWriteBarrierSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotSerialWriteBarrierSnippets.java @@ -37,7 +37,6 @@ import jdk.graal.compiler.replacements.SnippetTemplate.AbstractTemplates; import jdk.graal.compiler.replacements.SnippetTemplate.SnippetInfo; import jdk.graal.compiler.replacements.gc.SerialWriteBarrierSnippets; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.Word; public class HotSpotSerialWriteBarrierSnippets extends SerialWriteBarrierSnippets { @@ -79,7 +78,7 @@ public Templates(OptionValues options, Group.Factory factory, HotSpotProviders p HotSpotSerialWriteBarrierSnippets receiver = new HotSpotSerialWriteBarrierSnippets(); - if (JavaVersionUtil.JAVA_SPEC > 21 && Assertions.assertionsEnabled()) { + if (Assertions.assertionsEnabled()) { serialImpreciseWriteBarrier = snippet(providers, SerialWriteBarrierSnippets.class, "serialImpreciseWriteBarrier", diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/MonitorSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/MonitorSnippets.java index 2cef6627ee52..929c6f50db69 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/MonitorSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/MonitorSnippets.java @@ -39,7 +39,6 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_MONITOR_OWNER_ID_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_OM_CACHE_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.JAVA_THREAD_UNLOCKED_INFLATED_MONITOR_LOCATION; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_ACCESS_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MISC_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.MARK_WORD_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJECT_MONITOR_CXQ_LOCATION; @@ -57,14 +56,12 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.javaThreadOomCacheOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.javaThreadUnlockedInflatedMonitorOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.jvmAccIsValueBasedClass; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassAccessFlagsOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassMiscFlagsOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.loadWordFromObject; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.lockMetadataOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.markOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.markWordLockMaskInPlace; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.monitorValue; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.objectMonitorCxqOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.objectMonitorEntryListOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.objectMonitorOwnerOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.objectMonitorRecursionsOffset; @@ -73,7 +70,6 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.omCacheOopToOopDifference; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.pageSize; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.shouldUseKlassMiscFlags; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.unlockedValue; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.unusedMark; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useLightweightLocking; @@ -159,7 +155,6 @@ import jdk.graal.compiler.replacements.SnippetTemplate.SnippetInfo; import jdk.graal.compiler.replacements.Snippets; import jdk.graal.compiler.replacements.nodes.CStringConstant; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.Word; import jdk.vm.ci.code.BytecodeFrame; import jdk.vm.ci.code.Register; @@ -216,16 +211,6 @@ // @formatter:on public class MonitorSnippets implements Snippets { - /** - * This helper method is for bypassing the mandatory branch probabilities for snippets. - * - * See also {@code jdk.graal.compiler.core.test.VerifySnippetProbabilities} - */ - @Fold - public static boolean isJDK21() { - return JavaVersionUtil.JAVA_SPEC == 21; - } - @Snippet public static void checkMonitorenter(@ConstantParameter int lockCount, @ConstantParameter Register threadRegister, @ConstantParameter SpeculationLog.Speculation speculation) { /* @@ -269,8 +254,7 @@ public static void monitorenter(Object object, KlassPointer hub, @ConstantParame incCounter(); if (!synthetic && diagnoseSyncOnValueBasedClasses(INJECTED_VMCONFIG)) { - int flags = shouldUseKlassMiscFlags() ? hub.readByte(klassMiscFlagsOffset(INJECTED_VMCONFIG), KLASS_MISC_FLAGS_LOCATION) - : hub.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); + int flags = hub.readByte(klassMiscFlagsOffset(INJECTED_VMCONFIG), KLASS_MISC_FLAGS_LOCATION); if (probability(SLOW_PATH_PROBABILITY, (flags & jvmAccIsValueBasedClass(INJECTED_VMCONFIG)) != 0)) { monitorenterStubC(MONITORENTER, object, lock); return; @@ -354,7 +338,7 @@ private static boolean tryEnterInflated(Object object, Word lock, Word mark, Wor int ownerOffset = objectMonitorOwnerOffset(INJECTED_VMCONFIG); Word owner = monitor.readWord(ownerOffset, OBJECT_MONITOR_OWNER_LOCATION); - Word newOwner = isJDK21() ? thread : thread.readWord(javaThreadMonitorOwnerIDOffset(INJECTED_VMCONFIG), JAVA_THREAD_MONITOR_OWNER_ID_LOCATION); + Word newOwner = thread.readWord(javaThreadMonitorOwnerIDOffset(INJECTED_VMCONFIG), JAVA_THREAD_MONITOR_OWNER_ID_LOCATION); // The following owner null check is essential. In the case where the null check fails, it // avoids the subsequent bound-to-fail CAS operation, which would have caused the @@ -653,70 +637,29 @@ private static boolean tryExitInflated(Object object, Word mark, Word thread, Wo int recursionsOffset = objectMonitorRecursionsOffset(INJECTED_VMCONFIG); Word recursions = monitor.readWord(recursionsOffset, OBJECT_MONITOR_RECURSION_LOCATION); if (probability(FAST_PATH_PROBABILITY, recursions.equal(0))) { - if (isJDK21()) { - // recursions == 0 - Word entryList = monitor.readWord(objectMonitorEntryListOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_ENTRY_LIST_LOCATION); - Word cxq = monitor.readWord(objectMonitorCxqOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_CXQ_LOCATION); - if (probability(FREQUENT_PROBABILITY, entryList.or(cxq).equal(0))) { - // entryList == 0 && cxq == 0 - // Nobody is waiting, success - // release_store - memoryBarrier(MembarNode.FenceKind.STORE_RELEASE); - monitor.writeWord(ownerOffset, nullPointer(), OBJECT_MONITOR_OWNER_LOCATION); - traceObject(trace, "-lock{heavyweight:simple}", object, false); - counters.unlockHeavySimple.inc(); - return true; - } else { - int succOffset = objectMonitorSuccOffset(INJECTED_VMCONFIG); - Word succ = monitor.readWord(succOffset, OBJECT_MONITOR_SUCC_LOCATION); - if (probability(FREQUENT_PROBABILITY, succ.isNonNull())) { - // There may be a thread spinning on this monitor. Temporarily setting - // the monitor owner to null, and hope that the other thread will grab it. - monitor.writeWordVolatile(ownerOffset, nullPointer()); - succ = monitor.readWordVolatile(succOffset, OBJECT_MONITOR_SUCC_LOCATION); - if (probability(NOT_FREQUENT_PROBABILITY, succ.isNonNull())) { - // We manage to release the monitor before the other running thread even - // notices. - traceObject(trace, "-lock{heavyweight:transfer}", object, false); - counters.unlockHeavyTransfer.inc(); - return true; - } else { - // Either the monitor is grabbed by a spinning thread, or the spinning - // thread parks. Now we attempt to reset the owner of the monitor. - if (probability(FREQUENT_PROBABILITY, !monitor.logicCompareAndSwapWord(ownerOffset, zero(), thread, OBJECT_MONITOR_OWNER_LOCATION))) { - // The monitor is stolen. - traceObject(trace, "-lock{heavyweight:transfer}", object, false); - counters.unlockHeavyTransfer.inc(); - return true; - } - } - } - } + // Set owner to null. + memoryBarrier(MembarNode.FenceKind.STORE_RELEASE); + monitor.writeWord(ownerOffset, zero()); + memoryBarrier(MembarNode.FenceKind.STORE_LOAD); + // Note that we read the entry list after dropping the lock, so the values need not + // form a stable snapshot. + Word entryList = monitor.readWord(objectMonitorEntryListOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_ENTRY_LIST_LOCATION); + // Check if the entry list is empty. + if (probability(FREQUENT_PROBABILITY, entryList.isNull())) { + traceObject(trace, "-lock{heavyweight:simple}", object, false); + counters.unlockHeavySimple.inc(); + return true; + } + // Check if there is a successor. + Word succ = monitor.readWord(objectMonitorSuccOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_SUCC_LOCATION); + if (probability(FREQUENT_PROBABILITY, succ.isNonNull())) { + // We manage to release the monitor before the other running thread even + // notices. + traceObject(trace, "-lock{heavyweight:transfer}", object, false); + counters.unlockHeavyTransfer.inc(); + return true; } else { - // Set owner to null. - memoryBarrier(MembarNode.FenceKind.STORE_RELEASE); - monitor.writeWord(ownerOffset, zero()); - memoryBarrier(MembarNode.FenceKind.STORE_LOAD); - // Note that we read the entry list after dropping the lock, so the values need not - // form a stable snapshot. - Word entryList = monitor.readWord(objectMonitorEntryListOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_ENTRY_LIST_LOCATION); - // Check if the entry list is empty. - if (probability(FREQUENT_PROBABILITY, entryList.isNull())) { - traceObject(trace, "-lock{heavyweight:simple}", object, false); - counters.unlockHeavySimple.inc(); - return true; - } - // Check if there is a successor. - Word succ = monitor.readWord(objectMonitorSuccOffset(INJECTED_VMCONFIG), OBJECT_MONITOR_SUCC_LOCATION); - if (probability(FREQUENT_PROBABILITY, succ.isNonNull())) { - // We manage to release the monitor before the other running thread even - // notices. - traceObject(trace, "-lock{heavyweight:transfer}", object, false); - counters.unlockHeavyTransfer.inc(); - return true; - } else { - thread.writeWord(javaThreadUnlockedInflatedMonitorOffset(INJECTED_VMCONFIG), monitor, JAVA_THREAD_UNLOCKED_INFLATED_MONITOR_LOCATION); - } + thread.writeWord(javaThreadUnlockedInflatedMonitorOffset(INJECTED_VMCONFIG), monitor, JAVA_THREAD_UNLOCKED_INFLATED_MONITOR_LOCATION); } } else { // Recursive inflated unlock @@ -730,12 +673,8 @@ private static boolean tryExitInflated(Object object, Word mark, Word thread, Wo return false; } - private static boolean shouldUpdateHeldMonitorCount(GraalHotSpotVMConfig config) { - return isJDK21() || useStackLocking(config); - } - private static void maybeUpdateHeldMonitorCount(Word thread, int increment) { - if (shouldUpdateHeldMonitorCount(INJECTED_VMCONFIG)) { + if (useStackLocking(INJECTED_VMCONFIG)) { Word heldMonitorCount = thread.readWord(heldMonitorCountOffset(INJECTED_VMCONFIG), JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION); thread.writeWord(heldMonitorCountOffset(INJECTED_VMCONFIG), heldMonitorCount.add(increment), JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/RegisterFinalizerSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/RegisterFinalizerSnippets.java index bed8e8ec950d..c2ada6736ac4 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/RegisterFinalizerSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/RegisterFinalizerSnippets.java @@ -25,12 +25,9 @@ package jdk.graal.compiler.hotspot.replacements; import static jdk.graal.compiler.hotspot.GraalHotSpotVMConfig.INJECTED_VMCONFIG; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_ACCESS_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.KLASS_MISC_FLAGS_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.jvmAccHasFinalizer; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassAccessFlagsOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.klassMiscFlagsOffset; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.shouldUseKlassMiscFlags; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.SLOW_PATH_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability; @@ -61,8 +58,7 @@ public class RegisterFinalizerSnippets implements Snippets { public static void registerFinalizerSnippet(final Object thisObj) { KlassPointer klass = HotSpotReplacementsUtil.loadHub(thisObj); - int flags = shouldUseKlassMiscFlags() ? klass.readByte(klassMiscFlagsOffset(INJECTED_VMCONFIG), KLASS_MISC_FLAGS_LOCATION) - : klass.readInt(klassAccessFlagsOffset(INJECTED_VMCONFIG), KLASS_ACCESS_FLAGS_LOCATION); + int flags = klass.readByte(klassMiscFlagsOffset(INJECTED_VMCONFIG), KLASS_MISC_FLAGS_LOCATION); if (probability(SLOW_PATH_PROBABILITY, (flags & jvmAccHasFinalizer(INJECTED_VMCONFIG)) != 0)) { LoweredRegisterFinalizerNode.registerFinalizer(thisObj); } @@ -76,8 +72,7 @@ public static class Templates extends AbstractTemplates { public Templates(OptionValues options, HotSpotProviders providers) { super(options, providers); - this.registerFinalizerSnippet = snippet(providers, RegisterFinalizerSnippets.class, "registerFinalizerSnippet", - shouldUseKlassMiscFlags() ? KLASS_MISC_FLAGS_LOCATION : KLASS_ACCESS_FLAGS_LOCATION); + this.registerFinalizerSnippet = snippet(providers, RegisterFinalizerSnippets.class, "registerFinalizerSnippet", KLASS_MISC_FLAGS_LOCATION); } public void lower(RegisterFinalizerNode node, LoweringTool tool) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/TypeCheckSnippetUtils.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/TypeCheckSnippetUtils.java index 0706e3d3a9b0..ed4812587758 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/TypeCheckSnippetUtils.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/TypeCheckSnippetUtils.java @@ -59,7 +59,6 @@ import jdk.graal.compiler.nodes.TypeCheckHints; import jdk.graal.compiler.replacements.SnippetCounter; import jdk.graal.compiler.replacements.SnippetCounter.Group; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.word.Word; import jdk.vm.ci.hotspot.HotSpotResolvedObjectType; import jdk.vm.ci.meta.MetaAccessProvider; @@ -96,7 +95,7 @@ static boolean checkUnknownSubType(KlassPointer t, KlassPointer sNonNull, Counte // @formatter:on static boolean checkSecondarySubType(KlassPointer t, KlassPointer s, boolean isTAlwaysAbstract, Counters counters) { // if (S.cache == T) return true - if ((JavaVersionUtil.JAVA_SPEC == 21 || (JavaVersionUtil.JAVA_SPEC >= 23 && useSecondarySupersCache(INJECTED_VMCONFIG))) && + if (useSecondarySupersCache(INJECTED_VMCONFIG) && probability(FREQUENT_PROBABILITY, s.readKlassPointer(secondarySuperCacheOffset(INJECTED_VMCONFIG), SECONDARY_SUPER_CACHE_LOCATION).equal(t))) { counters.cacheHit.inc(); return true; @@ -108,7 +107,7 @@ static boolean checkSecondarySubType(KlassPointer t, KlassPointer s, boolean isT return true; } - if (JavaVersionUtil.JAVA_SPEC == 21 || (JavaVersionUtil.JAVA_SPEC >= 23 && !useSecondarySupersTable(INJECTED_VMCONFIG))) { + if (!useSecondarySupersTable(INJECTED_VMCONFIG)) { Word secondarySupers = s.readWord(secondarySupersOffset(INJECTED_VMCONFIG), SECONDARY_SUPERS_LOCATION); int length = secondarySupers.readInt(metaspaceArrayLengthOffset(INJECTED_VMCONFIG), METASPACE_ARRAY_LENGTH_LOCATION); for (int i = 0; i < length; i++) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/aarch64/AArch64StringUTF16CompressOp.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/aarch64/AArch64StringUTF16CompressOp.java index b61ae115bd50..4a91c19b67fc 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/aarch64/AArch64StringUTF16CompressOp.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/aarch64/AArch64StringUTF16CompressOp.java @@ -26,10 +26,8 @@ package jdk.graal.compiler.lir.aarch64; import static jdk.graal.compiler.lir.LIRInstruction.OperandFlag.REG; -import static jdk.vm.ci.aarch64.AArch64.zr; import static jdk.vm.ci.code.ValueUtil.asRegister; -import jdk.graal.compiler.asm.aarch64.AArch64Assembler; import jdk.graal.compiler.asm.aarch64.AArch64MacroAssembler; import jdk.graal.compiler.debug.GraalError; import jdk.graal.compiler.lir.LIRInstructionClass; @@ -37,7 +35,6 @@ import jdk.graal.compiler.lir.SyncPort; import jdk.graal.compiler.lir.asm.CompilationResultBuilder; import jdk.graal.compiler.lir.gen.LIRGeneratorTool; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.aarch64.AArch64Kind; import jdk.vm.ci.code.Register; import jdk.vm.ci.meta.AllocatableValue; @@ -85,10 +82,5 @@ public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { masm.mov(32, len, asRegister(lenValue)); AArch64EncodeArrayOp.emitEncodeArrayOp(masm, res, src, dst, len, vectorTemp, LIRGeneratorTool.CharsetName.ISO_8859_1); - if (JavaVersionUtil.JAVA_SPEC < 22) { - // legacy behavior: if (result != length) { result = 0; } - masm.cmp(32, res, asRegister(lenValue)); - masm.csel(32, res, res, zr, AArch64Assembler.ConditionFlag.EQ); - } } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/amd64/AMD64StringUTF16CompressOp.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/amd64/AMD64StringUTF16CompressOp.java index cb4504739702..c93929d79186 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/amd64/AMD64StringUTF16CompressOp.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/amd64/AMD64StringUTF16CompressOp.java @@ -30,7 +30,6 @@ import static jdk.vm.ci.amd64.AMD64.rdi; import static jdk.vm.ci.amd64.AMD64.rdx; import static jdk.vm.ci.amd64.AMD64.rsi; -import static jdk.vm.ci.amd64.AMD64.rsp; import static jdk.vm.ci.code.ValueUtil.asRegister; import java.util.EnumSet; @@ -49,7 +48,6 @@ import jdk.graal.compiler.lir.SyncPort; import jdk.graal.compiler.lir.asm.CompilationResultBuilder; import jdk.graal.compiler.lir.gen.LIRGeneratorTool; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.amd64.AMD64.CPUFeature; import jdk.vm.ci.amd64.AMD64Kind; @@ -133,11 +131,7 @@ public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { Register tmp4 = asRegister(vtmp4); Register tmp5 = asRegister(rtmp5); - if (JavaVersionUtil.JAVA_SPEC >= 22) { - charArrayCompress(masm, src, dst, len, tmp1, tmp2, tmp3, tmp4, tmp5, res); - } else { - charArrayCompressLegacy(masm, src, dst, len, tmp1, tmp2, tmp3, tmp4, tmp5, res); - } + charArrayCompress(masm, src, dst, len, tmp1, tmp2, tmp3, tmp4, tmp5, res); } private boolean canUseAVX512Variant() { @@ -365,225 +359,4 @@ private void charArrayCompress(AMD64MacroAssembler masm, Register src, Register masm.bind(labelDone); } - - /** - * Compress a UTF16 string which de facto is a Latin1 string into a byte array representation - * (buffer). - * - * @param masm the assembler - * @param src (rsi) the start address of source char[] to be compressed - * @param dst (rdi) the start address of destination byte[] vector - * @param len (rdx) the length - * @param tmp1Reg (xmm) temporary xmm register - * @param tmp2Reg (xmm) temporary xmm register - * @param tmp3Reg (xmm) temporary xmm register - * @param tmp4Reg (xmm) temporary xmm register - * @param tmp5 (gpr) temporary gpr register - * @param result (rax) the result code (length on success, zero otherwise) - */ - private void charArrayCompressLegacy(AMD64MacroAssembler masm, Register src, Register dst, Register len, Register tmp1Reg, - Register tmp2Reg, Register tmp3Reg, Register tmp4Reg, Register tmp5, Register result) { - assert tmp1Reg.getRegisterCategory().equals(AMD64.XMM); - assert tmp2Reg.getRegisterCategory().equals(AMD64.XMM); - assert tmp3Reg.getRegisterCategory().equals(AMD64.XMM); - assert tmp4Reg.getRegisterCategory().equals(AMD64.XMM); - - Label labelCopyCharsLoop = new Label(); - Label labelReturnLength = new Label(); - Label labelReturnZero = new Label(); - Label labelDone = new Label(); - - assert len.number != result.number : Assertions.errorMessageContext("len", len, "result", result); - - // Save length for return. - masm.push(len); - - if (canUseAVX512Variant()) { - Label labelCopy32Loop = new Label(); - Label labelCopyLoopTail = new Label(); - Label labelBelowThreshold = new Label(); - Label labelPostAlignment = new Label(); - - // If the length of the string is less than 32, we chose not to use the - // AVX512 instructions. - masm.testlAndJcc(len, -32, ConditionFlag.Zero, labelBelowThreshold, false); - - // First check whether a character is compressible (<= 0xff). - // Create mask to test for Unicode chars inside (zmm) vector. - masm.movl(result, 0x00ff); - masm.evpbroadcastw(tmp2Reg, result); - - masm.testlAndJcc(len, -64, ConditionFlag.Zero, labelPostAlignment, false); - - masm.movl(tmp5, dst); - masm.andl(tmp5, (32 - 1)); - masm.negl(tmp5); - masm.andl(tmp5, (32 - 1)); - - // bail out when there is nothing to be done - masm.testlAndJcc(tmp5, tmp5, ConditionFlag.Zero, labelPostAlignment, false); - - // Compute (1 << N) - 1 = ~(~0 << N), where N is the remaining number - // of characters to process. - masm.movl(result, 0xFFFFFFFF); - masm.shlxl(result, result, tmp5); - masm.notl(result); - masm.kmovd(k3, result); - - masm.evmovdqu16(tmp1Reg, k3, new AMD64Address(src)); - masm.evpcmpuw(k2, k3, tmp1Reg, tmp2Reg, EVEXComparisonPredicate.LE); - masm.ktestd(k2, k3); - masm.jcc(ConditionFlag.CarryClear, labelReturnZero); - - masm.evpmovwb(new AMD64Address(dst), k3, tmp1Reg); - - masm.addq(src, tmp5); - masm.addq(src, tmp5); - masm.addq(dst, tmp5); - masm.subl(len, tmp5); - - masm.bind(labelPostAlignment); - // end of alignment - - masm.movl(tmp5, len); - masm.andl(tmp5, 32 - 1); // The tail count (in chars). - // The vector count (in chars). - masm.andlAndJcc(len, ~(32 - 1), ConditionFlag.Zero, labelCopyLoopTail, false); - - masm.leaq(src, new AMD64Address(src, len, Stride.S2)); - masm.leaq(dst, new AMD64Address(dst, len, Stride.S1)); - masm.negq(len); - - // Test and compress 32 chars per iteration, reading 512-bit vectors and - // writing 256-bit compressed ditto. - masm.bind(labelCopy32Loop); - masm.evmovdqu16(tmp1Reg, new AMD64Address(src, len, Stride.S2)); - masm.evpcmpuw(k2, tmp1Reg, tmp2Reg, EVEXComparisonPredicate.LE); - masm.kortestd(k2, k2); - masm.jcc(ConditionFlag.CarryClear, labelReturnZero); - - // All 32 chars in the current vector (chunk) are valid for compression, - // write truncated byte elements to memory. - masm.evpmovwb(new AMD64Address(dst, len, Stride.S1), tmp1Reg); - masm.addqAndJcc(len, 32, ConditionFlag.NotZero, labelCopy32Loop, false); - - masm.bind(labelCopyLoopTail); - // All done if the tail count is zero. - masm.testlAndJcc(tmp5, tmp5, ConditionFlag.Zero, labelReturnLength, false); - - masm.movl(len, tmp5); - - // Compute (1 << N) - 1 = ~(~0 << N), where N is the remaining number - // of characters to process. - masm.movl(result, -1); - masm.shlxl(result, result, len); - masm.notl(result); - - masm.kmovd(k3, result); - - masm.evmovdqu16(tmp1Reg, k3, new AMD64Address(src)); - masm.evpcmpuw(k2, k3, tmp1Reg, tmp2Reg, EVEXComparisonPredicate.LE); - masm.ktestd(k2, k3); - masm.jcc(ConditionFlag.CarryClear, labelReturnZero); - - masm.evpmovwb(new AMD64Address(dst), k3, tmp1Reg); - masm.jmp(labelReturnLength); - - masm.bind(labelBelowThreshold); - } - - if (masm.supports(CPUFeature.SSE4_2)) { - Label labelCopy32Loop = new Label(); - Label labelCopy16 = new Label(); - Label labelCopyTail = new Label(); - - masm.movl(result, len); - - masm.movl(tmp5, 0xff00ff00); // Create mask to test for Unicode chars in vectors. - - // vectored compression - masm.andl(len, 0xfffffff0); // vector count (in chars) - masm.andl(result, 0x0000000f); // tail count (in chars) - masm.testlAndJcc(len, len, ConditionFlag.Zero, labelCopy16, false); - - // Compress 16 chars per iteration. - masm.movdl(tmp1Reg, tmp5); - masm.pshufd(tmp1Reg, tmp1Reg, 0); // Store Unicode mask in 'vtmp1'. - masm.pxor(tmp4Reg, tmp4Reg); - - masm.leaq(src, new AMD64Address(src, len, Stride.S2)); - masm.leaq(dst, new AMD64Address(dst, len, Stride.S1)); - masm.negq(len); - - // Test and compress 16 chars per iteration, reading 128-bit vectors and - // writing 64-bit compressed ditto. - masm.bind(labelCopy32Loop); - // load 1st 8 characters - masm.movdqu(tmp2Reg, new AMD64Address(src, len, Stride.S2)); - masm.por(tmp4Reg, tmp2Reg); - // load next 8 characters - masm.movdqu(tmp3Reg, new AMD64Address(src, len, Stride.S2, 16)); - masm.por(tmp4Reg, tmp3Reg); - masm.ptest(tmp4Reg, tmp1Reg); // Check for Unicode chars in vector. - masm.jcc(ConditionFlag.NotZero, labelReturnZero); - masm.packuswb(tmp2Reg, tmp3Reg); // Only ASCII chars; compress each to a byte. - masm.movdqu(new AMD64Address(dst, len, Stride.S1), tmp2Reg); - masm.addqAndJcc(len, 16, ConditionFlag.NotZero, labelCopy32Loop, false); - - // Test and compress another 8 chars before final tail copy. - masm.bind(labelCopy16); - masm.movl(len, result); - masm.andl(len, 0xfffffff8); // vector count (in chars) - masm.andl(result, 0x00000007); // tail count (in chars) - masm.testlAndJcc(len, len, ConditionFlag.Zero, labelCopyTail, true); - - masm.movdl(tmp1Reg, tmp5); - masm.pshufd(tmp1Reg, tmp1Reg, 0); // Store Unicode mask in 'vtmp1'. - masm.pxor(tmp3Reg, tmp3Reg); - - masm.movdqu(tmp2Reg, new AMD64Address(src)); - masm.ptest(tmp2Reg, tmp1Reg); // Check for Unicode chars in vector. - masm.jccb(ConditionFlag.NotZero, labelReturnZero); - masm.packuswb(tmp2Reg, tmp3Reg); // Only ASCII chars; compress each to a byte. - masm.movq(new AMD64Address(dst), tmp2Reg); - masm.addq(src, 16); - masm.addq(dst, 8); - - masm.bind(labelCopyTail); - masm.movl(len, result); - } - - // Compress any remaining characters using a vanilla implementation. - masm.testlAndJcc(len, len, ConditionFlag.Zero, labelReturnLength, true); - masm.leaq(src, new AMD64Address(src, len, Stride.S2)); - masm.leaq(dst, new AMD64Address(dst, len, Stride.S1)); - masm.negq(len); - - // Compress a single character per iteration. - masm.bind(labelCopyCharsLoop); - masm.movzwl(result, new AMD64Address(src, len, Stride.S2)); - // Check if Unicode character. - masm.testlAndJcc(result, 0xff00, ConditionFlag.NotZero, labelReturnZero, true); - // An ASCII character; compress to a byte. - masm.movb(new AMD64Address(dst, len, Stride.S1), result); - masm.incqAndJcc(len, ConditionFlag.NotZero, labelCopyCharsLoop, false); - - // If compression succeeded, return the length. - masm.bind(labelReturnLength); - masm.pop(result); - masm.jmpb(labelDone); - - // If compression failed, return 0. - masm.bind(labelReturnZero); - masm.xorl(result, result); - masm.addq(rsp, 8 /* wordSize */); - - masm.bind(labelDone); - } - - @Override - public boolean modifiesStackPointer() { - // Only charArrayCompressLegacy modifies rsp. - return JavaVersionUtil.JAVA_SPEC < 22; - } } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java index c97cc0b65155..210b42002539 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/StandardGraphBuilderPlugins.java @@ -88,8 +88,8 @@ import jdk.graal.compiler.nodes.NamedLocationIdentity; import jdk.graal.compiler.nodes.NodeView; import jdk.graal.compiler.nodes.PiNode; -import jdk.graal.compiler.nodes.SafepointNode; import jdk.graal.compiler.nodes.ProfileData.BranchProbabilityData; +import jdk.graal.compiler.nodes.SafepointNode; import jdk.graal.compiler.nodes.SpinWaitNode; import jdk.graal.compiler.nodes.StateSplit; import jdk.graal.compiler.nodes.StructuredGraph; @@ -133,7 +133,6 @@ import jdk.graal.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; import jdk.graal.compiler.nodes.extended.CacheWritebackNode; import jdk.graal.compiler.nodes.extended.CacheWritebackSyncNode; -import jdk.graal.compiler.nodes.extended.ClassIsArrayNode; import jdk.graal.compiler.nodes.extended.GetClassNode; import jdk.graal.compiler.nodes.extended.GuardingNode; import jdk.graal.compiler.nodes.extended.JavaReadNode; @@ -229,9 +228,7 @@ import jdk.graal.compiler.replacements.nodes.arithmetic.IntegerSubExactOverflowNode; import jdk.graal.compiler.replacements.nodes.arithmetic.IntegerSubExactSplitNode; import jdk.graal.compiler.replacements.nodes.arithmetic.UnsignedMulHighNode; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.serviceprovider.SpeculationReasonGroup; -import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.code.BytecodePosition; import jdk.vm.ci.code.CodeUtil; @@ -615,23 +612,11 @@ private static Class getJavaClass(JavaKind kind) { return kind == JavaKind.Object ? Object.class : kind.toJavaClass(); } - private static String[] getKindNames(boolean isSunMiscUnsafe, JavaKind kind) { - if (kind == JavaKind.Object && !isSunMiscUnsafe) { - /* - * JDK 17 renamed all Object-type-related methods in jdk.internal.misc.Unsafe from - * "Object" to "Reference", but kept the "Object" version as deprecated. We want to - * intrinsify both variants, to avoid problems with Uninterruptible methods in Native - * Image. - * - * As of JDK-8327729 (resolved in JDK 23), the "Object" versions have been removed. - */ - if (JavaVersionUtil.JAVA_SPEC >= 23) { - return new String[]{"Reference"}; - } - return new String[]{"Object", "Reference"}; - } else { - return new String[]{kind.name()}; + private static String getKindName(JavaKind kind) { + if (kind == JavaKind.Object) { + return "Reference"; } + return kind.name(); } public static class AllocateUninitializedArrayPlugin extends InvocationPlugin { @@ -697,45 +682,35 @@ private static String memoryOrderModeToMethodSuffix(MemoryOrderMode memoryOrder) private static void registerUnsafePlugins(InvocationPlugins plugins, Replacements replacements, boolean explicitUnsafeNullChecks) { JavaKind[] supportedJavaKinds = {JavaKind.Int, JavaKind.Long, JavaKind.Object}; - if (JavaVersionUtil.JAVA_SPEC == 21) { - Registration sunMiscUnsafe = new Registration(plugins, "sun.misc.Unsafe"); - registerUnsafePlugins0(sunMiscUnsafe, true, explicitUnsafeNullChecks); - registerUnsafeGetAndOpPlugins(sunMiscUnsafe, true, explicitUnsafeNullChecks, supportedJavaKinds); - registerUnsafeAtomicsPlugins(sunMiscUnsafe, true, explicitUnsafeNullChecks, "compareAndSwap", supportedJavaKinds, VOLATILE); - } - Registration jdkInternalMiscUnsafe = new Registration(plugins, "jdk.internal.misc.Unsafe", replacements); - registerUnsafePlugins0(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks); + registerUnsafePlugins0(jdkInternalMiscUnsafe, explicitUnsafeNullChecks); registerUnsafeUnalignedPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks); supportedJavaKinds = new JavaKind[]{JavaKind.Boolean, JavaKind.Byte, JavaKind.Char, JavaKind.Short, JavaKind.Int, JavaKind.Long, JavaKind.Object}; - registerUnsafeGetAndOpPlugins(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks, supportedJavaKinds); - registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks, "weakCompareAndSet", supportedJavaKinds, VOLATILE, ACQUIRE, RELEASE, PLAIN); - registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks, "compareAndExchange", supportedJavaKinds, ACQUIRE, RELEASE); + registerUnsafeGetAndOpPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks, supportedJavaKinds); + registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks, "weakCompareAndSet", supportedJavaKinds, VOLATILE, ACQUIRE, RELEASE, PLAIN); + registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks, "compareAndExchange", supportedJavaKinds, ACQUIRE, RELEASE); supportedJavaKinds = new JavaKind[]{JavaKind.Boolean, JavaKind.Byte, JavaKind.Char, JavaKind.Short, JavaKind.Int, JavaKind.Long, JavaKind.Float, JavaKind.Double, JavaKind.Object}; - registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks, "compareAndSet", supportedJavaKinds, VOLATILE); - registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, false, explicitUnsafeNullChecks, "compareAndExchange", supportedJavaKinds, VOLATILE); + registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks, "compareAndSet", supportedJavaKinds, VOLATILE); + registerUnsafeAtomicsPlugins(jdkInternalMiscUnsafe, explicitUnsafeNullChecks, "compareAndExchange", supportedJavaKinds, VOLATILE); jdkInternalMiscUnsafe.register(new AllocateUninitializedArrayPlugin("allocateUninitializedArray0", false)); } - private static void registerUnsafeAtomicsPlugins(Registration r, boolean isSunMiscUnsafe, boolean explicitUnsafeNullChecks, String casPrefix, - JavaKind[] supportedJavaKinds, + private static void registerUnsafeAtomicsPlugins(Registration r, boolean explicitUnsafeNullChecks, String casPrefix, JavaKind[] supportedJavaKinds, MemoryOrderMode... memoryOrders) { for (JavaKind kind : supportedJavaKinds) { Class javaClass = getJavaClass(kind); - for (String kindName : getKindNames(isSunMiscUnsafe, kind)) { - boolean isLogic = true; - if (casPrefix.startsWith("compareAndExchange")) { - isLogic = false; - } - for (MemoryOrderMode memoryOrder : memoryOrders) { - String name = casPrefix + kindName + memoryOrderModeToMethodSuffix(memoryOrder); - r.register(new UnsafeCompareAndSwapPlugin(kind, memoryOrder, isLogic, explicitUnsafeNullChecks, - name, Receiver.class, Object.class, long.class, javaClass, javaClass)); - } + boolean isLogic = true; + if (casPrefix.startsWith("compareAndExchange")) { + isLogic = false; + } + for (MemoryOrderMode memoryOrder : memoryOrders) { + String name = casPrefix + getKindName(kind) + memoryOrderModeToMethodSuffix(memoryOrder); + r.register(new UnsafeCompareAndSwapPlugin(kind, memoryOrder, isLogic, explicitUnsafeNullChecks, + name, Receiver.class, Object.class, long.class, javaClass, javaClass)); } } } @@ -748,70 +723,59 @@ private static void registerUnsafeUnalignedPlugins(Registration r, boolean expli } } - private static void registerUnsafeGetAndOpPlugins(Registration r, boolean isSunMiscUnsafe, boolean explicitUnsafeNullChecks, JavaKind[] unsafeJavaKinds) { + private static void registerUnsafeGetAndOpPlugins(Registration r, boolean explicitUnsafeNullChecks, JavaKind[] unsafeJavaKinds) { for (JavaKind kind : unsafeJavaKinds) { Class javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); - for (String kindName : getKindNames(isSunMiscUnsafe, kind)) { - r.register(new UnsafeAccessPlugin(kind, kind, explicitUnsafeNullChecks, "getAndSet" + kindName, Receiver.class, Object.class, long.class, javaClass) { + r.register(new UnsafeAccessPlugin(kind, kind, explicitUnsafeNullChecks, "getAndSet" + getKindName(kind), Receiver.class, Object.class, long.class, javaClass) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) { + // Emits a null-check for the otherwise unused receiver + unsafe.get(true); + createUnsafeAccess(object, b, (obj, loc) -> new AtomicReadAndWriteNode(obj, offset, value, kind, loc), AtomicReadAndWriteNode.class); + return true; + } + }); + + if (kind != JavaKind.Boolean && kind.isNumericInteger()) { + r.register(new UnsafeAccessPlugin(kind, kind, explicitUnsafeNullChecks, "getAndAdd" + getKindName(kind), Receiver.class, Object.class, long.class, javaClass) { @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode value) { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) { // Emits a null-check for the otherwise unused receiver unsafe.get(true); - createUnsafeAccess(object, b, (obj, loc) -> new AtomicReadAndWriteNode(obj, offset, value, kind, loc), AtomicReadAndWriteNode.class); + createUnsafeAccess(object, b, (obj, loc) -> new AtomicReadAndAddNode(obj, offset, delta, kind, loc), AtomicReadAndAddNode.class); return true; } }); - - if (kind != JavaKind.Boolean && kind.isNumericInteger()) { - r.register(new UnsafeAccessPlugin(kind, kind, explicitUnsafeNullChecks, "getAndAdd" + kindName, Receiver.class, Object.class, long.class, javaClass) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver unsafe, ValueNode object, ValueNode offset, ValueNode delta) { - // Emits a null-check for the otherwise unused receiver - unsafe.get(true); - createUnsafeAccess(object, b, (obj, loc) -> new AtomicReadAndAddNode(obj, offset, delta, kind, loc), AtomicReadAndAddNode.class); - return true; - } - }); - } } } } - private static void registerUnsafePlugins0(Registration r, boolean sunMiscUnsafe, boolean explicitUnsafeNullChecks) { + private static void registerUnsafePlugins0(Registration r, boolean explicitUnsafeNullChecks) { for (JavaKind kind : JavaKind.values()) { if ((kind.isPrimitive() && kind != JavaKind.Void) || kind == JavaKind.Object) { Class javaClass = kind == JavaKind.Object ? Object.class : kind.toJavaClass(); - for (String kindName : getKindNames(sunMiscUnsafe, kind)) { - String getName = "get" + kindName; - String putName = "put" + kindName; - // Object-based accesses - r.register(new UnsafeGetPlugin(kind, explicitUnsafeNullChecks, getName, Receiver.class, Object.class, long.class)); - r.register(new UnsafePutPlugin(kind, explicitUnsafeNullChecks, putName, Receiver.class, Object.class, long.class, javaClass)); - // Volatile object-based accesses - r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.VOLATILE, explicitUnsafeNullChecks, getName + "Volatile", Receiver.class, Object.class, long.class)); - r.register(new UnsafePutPlugin(kind, MemoryOrderMode.VOLATILE, explicitUnsafeNullChecks, putName + "Volatile", Receiver.class, Object.class, long.class, - javaClass)); - // Ordered object-based accesses - if (sunMiscUnsafe) { - if (kind == JavaKind.Int || kind == JavaKind.Long || kind == JavaKind.Object) { - r.register(new UnsafePutPlugin(kind, MemoryOrderMode.RELEASE, explicitUnsafeNullChecks, - "putOrdered" + kindName, Receiver.class, Object.class, long.class, javaClass)); - } - } else { - r.register(new UnsafePutPlugin(kind, MemoryOrderMode.RELEASE, explicitUnsafeNullChecks, - "put" + kindName + "Release", Receiver.class, Object.class, long.class, javaClass)); - r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.ACQUIRE, explicitUnsafeNullChecks, - "get" + kindName + "Acquire", Receiver.class, Object.class, long.class)); - r.register(new UnsafePutPlugin(kind, MemoryOrderMode.OPAQUE, explicitUnsafeNullChecks, - "put" + kindName + "Opaque", Receiver.class, Object.class, long.class, javaClass)); - r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.OPAQUE, explicitUnsafeNullChecks, - "get" + kindName + "Opaque", Receiver.class, Object.class, long.class)); - } - if (kind != JavaKind.Boolean && kind != JavaKind.Object) { - // Raw accesses to memory addresses - r.register(new UnsafeGetPlugin(kind, explicitUnsafeNullChecks, getName, Receiver.class, long.class)); - r.register(new UnsafePutPlugin(kind, explicitUnsafeNullChecks, putName, Receiver.class, long.class, kind.toJavaClass())); - } + String kindName = getKindName(kind); + String getName = "get" + kindName; + String putName = "put" + kindName; + // Object-based accesses + r.register(new UnsafeGetPlugin(kind, explicitUnsafeNullChecks, getName, Receiver.class, Object.class, long.class)); + r.register(new UnsafePutPlugin(kind, explicitUnsafeNullChecks, putName, Receiver.class, Object.class, long.class, javaClass)); + // Volatile object-based accesses + r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.VOLATILE, explicitUnsafeNullChecks, getName + "Volatile", Receiver.class, Object.class, long.class)); + r.register(new UnsafePutPlugin(kind, MemoryOrderMode.VOLATILE, explicitUnsafeNullChecks, putName + "Volatile", Receiver.class, Object.class, long.class, javaClass)); + // Ordered object-based accesses + r.register(new UnsafePutPlugin(kind, MemoryOrderMode.RELEASE, explicitUnsafeNullChecks, + "put" + kindName + "Release", Receiver.class, Object.class, long.class, javaClass)); + r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.ACQUIRE, explicitUnsafeNullChecks, + "get" + kindName + "Acquire", Receiver.class, Object.class, long.class)); + r.register(new UnsafePutPlugin(kind, MemoryOrderMode.OPAQUE, explicitUnsafeNullChecks, + "put" + kindName + "Opaque", Receiver.class, Object.class, long.class, javaClass)); + r.register(new UnsafeGetPlugin(kind, MemoryOrderMode.OPAQUE, explicitUnsafeNullChecks, + "get" + kindName + "Opaque", Receiver.class, Object.class, long.class)); + if (kind != JavaKind.Boolean && kind != JavaKind.Object) { + // Raw accesses to memory addresses + r.register(new UnsafeGetPlugin(kind, explicitUnsafeNullChecks, getName, Receiver.class, long.class)); + r.register(new UnsafePutPlugin(kind, explicitUnsafeNullChecks, putName, Receiver.class, long.class, kind.toJavaClass())); } } } @@ -824,14 +788,12 @@ private static void registerUnsafePlugins0(Registration r, boolean sunMiscUnsafe r.register(new UnsafeFencePlugin(MembarNode.FenceKind.STORE_RELEASE, "storeFence")); r.register(new UnsafeFencePlugin(MembarNode.FenceKind.FULL, "fullFence")); - if (!sunMiscUnsafe) { - // These methods are only called if UnsafeConstants.DATA_CACHE_LINE_FLUSH_SIZE != 0 - // which implies that the current processor and OS supports writeback to memory. - r.register(new CacheWritebackPlugin(false, "writeback0", Receiver.class, long.class)); - r.register(new CacheWritebackPlugin(true, "writebackPreSync0", Receiver.class)); - r.register(new CacheWritebackPlugin(false, "writebackPostSync0", Receiver.class)); - r.register(new UnsafeFencePlugin(MembarNode.FenceKind.STORE_STORE, "storeStoreFence")); - } + // These methods are only called if UnsafeConstants.DATA_CACHE_LINE_FLUSH_SIZE != 0 + // which implies that the current processor and OS supports writeback to memory. + r.register(new CacheWritebackPlugin(false, "writeback0", Receiver.class, long.class)); + r.register(new CacheWritebackPlugin(true, "writebackPreSync0", Receiver.class)); + r.register(new CacheWritebackPlugin(false, "writebackPostSync0", Receiver.class)); + r.register(new UnsafeFencePlugin(MembarNode.FenceKind.STORE_STORE, "storeStoreFence")); r.register(new InvocationPlugin("arrayBaseOffset", Receiver.class, Class.class) { @Override @@ -855,11 +817,7 @@ private static boolean handleArrayBaseOffsetOrIndexScale(GraphBuilderContext b, unsafe.get(true); var elementKind = b.getMetaAccessExtensionProvider().getStorageKind(arrayType.getComponentType()); if (arrayBaseOffset) { - if (JavaVersionUtil.JAVA_SPEC > 21) { - b.addPush(JavaKind.Long, ConstantNode.forLong(b.getMetaAccess().getArrayBaseOffset(elementKind))); - } else { - b.addPush(JavaKind.Int, ConstantNode.forInt(b.getMetaAccess().getArrayBaseOffset(elementKind))); - } + b.addPush(JavaKind.Long, ConstantNode.forLong(b.getMetaAccess().getArrayBaseOffset(elementKind))); } else { b.addPush(JavaKind.Int, ConstantNode.forInt(b.getMetaAccess().getArrayIndexScale(elementKind))); } @@ -1177,7 +1135,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec } } r.register(new InvocationPlugin("multiplyHigh", long.class, long.class) { - @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x, ValueNode y) { b.push(JavaKind.Long, b.append(new IntegerMulHighNode(x, y))); @@ -1394,16 +1351,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); - if (JavaVersionUtil.JAVA_SPEC == 21) { - r.register(new InvocationPlugin("isArray", Receiver.class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) { - LogicNode isArray = b.add(ClassIsArrayNode.create(b.getConstantReflection(), receiver.get(true))); - b.addPush(JavaKind.Boolean, ConditionalNode.create(isArray, NodeView.DEFAULT)); - return true; - } - }); - } r.register(new InvocationPlugin("cast", Receiver.class, Object.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { @@ -2557,29 +2504,19 @@ private static void registerGHASHPlugin(InvocationPlugins plugins, Replacements private static void registerBigIntegerPlugins(InvocationPlugins plugins, Replacements replacements) { Registration r = new Registration(plugins, BigInteger.class, replacements); - if (JavaVersionUtil.JAVA_SPEC == 21) { - r.register(new SnippetSubstitutionInvocationPlugin<>(BigIntegerSnippets.Templates.class, - "implMultiplyToLen", int[].class, int.class, int[].class, int.class, int[].class) { - @Override - public SnippetTemplate.SnippetInfo getSnippet(BigIntegerSnippets.Templates templates) { - return templates.implMultiplyToLen; - } - }); - } else { - r.register(new InvocationPlugin("implMultiplyToLen", int[].class, int.class, int[].class, int.class, int[].class) { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x, ValueNode xlen, ValueNode y, ValueNode ylen, ValueNode z) { - try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) { - ValueNode zlen = b.add(AddNode.create(xlen, ylen, NodeView.DEFAULT)); - BigIntegerMultiplyToLenNode multiplyToLen = b.append(new BigIntegerMultiplyToLenNode(helper.arrayStart(x, JavaKind.Int), xlen, - helper.arrayStart(y, JavaKind.Int), ylen, helper.arrayStart(z, JavaKind.Int), zlen)); - b.addPush(JavaKind.Object, z); - b.setStateAfter(multiplyToLen); - return true; - } + r.register(new InvocationPlugin("implMultiplyToLen", int[].class, int.class, int[].class, int.class, int[].class) { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode x, ValueNode xlen, ValueNode y, ValueNode ylen, ValueNode z) { + try (InvocationPluginHelper helper = new InvocationPluginHelper(b, targetMethod)) { + ValueNode zlen = b.add(AddNode.create(xlen, ylen, NodeView.DEFAULT)); + BigIntegerMultiplyToLenNode multiplyToLen = b.append(new BigIntegerMultiplyToLenNode(helper.arrayStart(x, JavaKind.Int), xlen, + helper.arrayStart(y, JavaKind.Int), ylen, helper.arrayStart(z, JavaKind.Int), zlen)); + b.addPush(JavaKind.Object, z); + b.setStateAfter(multiplyToLen); + return true; } - }); - } + } + }); r.register(new InvocationPlugin("implMulAdd", int[].class, int[].class, int.class, int.class, int.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode out, ValueNode in, ValueNode offset, ValueNode len, ValueNode k) { @@ -2711,11 +2648,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } } - - @Override - public boolean isGraalOnly() { - return JavaVersionUtil.JAVA_SPEC == 21 && arch instanceof AMD64; - } }); } diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java index 2b3cd06230f0..a4664899dfe2 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/aarch64/AArch64GraphBuilderPlugins.java @@ -68,7 +68,6 @@ import jdk.graal.compiler.replacements.nodes.FloatToHalfFloatNode; import jdk.graal.compiler.replacements.nodes.HalfFloatToFloatNode; import jdk.graal.compiler.replacements.nodes.UnaryMathIntrinsicNode; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.code.Architecture; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -423,7 +422,7 @@ public SnippetTemplate.SnippetInfo getSnippet(StringUTF16Snippets.Templates temp return templates.indexOfUnsafe; } }); - r.register(new InvocationPlugin(JavaVersionUtil.JAVA_SPEC == 21 ? "indexOfCharUnsafe" : "indexOfChar", byte[].class, int.class, int.class, int.class) { + r.register(new InvocationPlugin("indexOfChar", byte[].class, int.class, int.class, int.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value, ValueNode ch, ValueNode fromIndex, ValueNode max) { ZeroExtendNode toChar = b.add(new ZeroExtendNode(b.add(new NarrowNode(ch, JavaKind.Char.getBitCount())), JavaKind.Int.getBitCount())); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java index 46ab4cde6701..c61c69ec0139 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/amd64/AMD64GraphBuilderPlugins.java @@ -82,7 +82,6 @@ import jdk.graal.compiler.replacements.nodes.HalfFloatToFloatNode; import jdk.graal.compiler.replacements.nodes.UnaryMathIntrinsicNode; import jdk.graal.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.amd64.AMD64; import jdk.vm.ci.amd64.AMD64.CPUFeature; import jdk.vm.ci.code.Architecture; @@ -189,9 +188,7 @@ private static void registerMathPlugins(InvocationPlugins plugins, AMD64 arch, R registerUnaryMath(r, "sin", SIN); registerUnaryMath(r, "cos", COS); registerUnaryMath(r, "tan", TAN); - if (JavaVersionUtil.JAVA_SPEC >= 24) { - registerUnaryMath(r, "tanh", TANH); - } + registerUnaryMath(r, "tanh", TANH); registerFMA(r, arch); registerMinMax(r, arch); @@ -503,7 +500,7 @@ public SnippetTemplate.SnippetInfo getSnippet(StringUTF16Snippets.Templates temp } }); - r.register(new InvocationPlugin(JavaVersionUtil.JAVA_SPEC == 21 ? "indexOfCharUnsafe" : "indexOfChar", byte[].class, int.class, int.class, int.class) { + r.register(new InvocationPlugin("indexOfChar", byte[].class, int.class, int.class, int.class) { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value, ValueNode ch, ValueNode fromIndex, ValueNode max) { ZeroExtendNode toChar = b.add(new ZeroExtendNode(b.add(new NarrowNode(ch, JavaKind.Char.getBitCount())), JavaKind.Int.getBitCount())); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java index 280ba66ea823..26b6c3923e86 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/KnownTruffleTypes.java @@ -39,7 +39,6 @@ import com.oracle.truffle.compiler.TruffleCompilerRuntime; import jdk.graal.compiler.debug.GraalError; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; @@ -218,23 +217,16 @@ public KnownTruffleTypes(TruffleCompilerRuntime runtime, MetaAccessProvider meta Throwable_jfrTracing = getThrowableJFRTracingField(metaAccess); } - private static boolean throwableUsesJFRTracing() { - return JavaVersionUtil.JAVA_SPEC >= 22; - } - private static ResolvedJavaField getThrowableJFRTracingField(MetaAccessProvider metaAccess) { - if (throwableUsesJFRTracing()) { - ResolvedJavaType throwableType = metaAccess.lookupJavaType(Throwable.class); - for (ResolvedJavaField staticField : throwableType.getStaticFields()) { - if (staticField.getName().equals("jfrTracing") && - staticField.getType().equals(metaAccess.lookupJavaType(boolean.class)) && staticField.isVolatile()) { - return staticField; - } + ResolvedJavaType throwableType = metaAccess.lookupJavaType(Throwable.class); + for (ResolvedJavaField staticField : throwableType.getStaticFields()) { + if (staticField.getName().equals("jfrTracing") && + staticField.getType().equals(metaAccess.lookupJavaType(boolean.class)) && staticField.isVolatile()) { + return staticField; } - throw GraalError.shouldNotReachHere("Field Throwable.jfrTracing not found. This field was added in JDK-22+24 and must be present. " + - "This either means this field was removed in which case this code needs to be adapted or the meta access lookup above failed which should never happen."); } - return null; + throw GraalError.shouldNotReachHere("Field Throwable.jfrTracing not found. This field was added in JDK-22+24 and must be present. " + + "This either means this field was removed in which case this code needs to be adapted or the meta access lookup above failed which should never happen."); } private ResolvedJavaType[] createSkippedExceptionTypes() { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/PartialEvaluator.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/PartialEvaluator.java index 4ad4b4557378..b316286f23d6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/PartialEvaluator.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/PartialEvaluator.java @@ -25,7 +25,6 @@ package jdk.graal.compiler.truffle; import java.net.URI; -import java.nio.Buffer; import java.util.function.Supplier; import org.graalvm.collections.EconomicMap; @@ -46,17 +45,14 @@ import jdk.graal.compiler.graph.SourceLanguagePositionProvider; import jdk.graal.compiler.java.GraphBuilderPhase; import jdk.graal.compiler.nodes.ConstantNode; -import jdk.graal.compiler.nodes.DeoptimizeNode; import jdk.graal.compiler.nodes.EncodedGraph; import jdk.graal.compiler.nodes.StructuredGraph; -import jdk.graal.compiler.nodes.ValueNode; import jdk.graal.compiler.nodes.calc.FloatingNode; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderContext; import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderTool; import jdk.graal.compiler.nodes.graphbuilderconf.InlineInvokePlugin; -import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin; import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugins; import jdk.graal.compiler.nodes.graphbuilderconf.LoopExplosionPlugin; import jdk.graal.compiler.nodes.graphbuilderconf.NodePlugin; @@ -71,14 +67,11 @@ import jdk.graal.compiler.replacements.PEGraphDecoder; import jdk.graal.compiler.replacements.ReplacementsImpl; import jdk.graal.compiler.serviceprovider.GraalServices; -import jdk.graal.compiler.serviceprovider.JavaVersionUtil; import jdk.graal.compiler.serviceprovider.SpeculationReasonGroup; import jdk.graal.compiler.truffle.phases.DeoptimizeOnExceptionPhase; import jdk.graal.compiler.truffle.phases.InstrumentPhase; import jdk.graal.compiler.truffle.substitutions.GraphBuilderInvocationPluginProvider; import jdk.graal.compiler.truffle.substitutions.TruffleGraphBuilderPlugins; -import jdk.vm.ci.meta.DeoptimizationAction; -import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaField; @@ -466,40 +459,11 @@ private GraphBuilderConfiguration createGraphBuilderConfig(GraphBuilderConfigura } protected void appendParsingNodePlugins(Plugins plugins) { - if (JavaVersionUtil.JAVA_SPEC < 19) { - ResolvedJavaType memorySegmentProxyType = config.types().MemorySegmentProxy; - for (ResolvedJavaMethod m : memorySegmentProxyType.getDeclaredMethods(false)) { - if (m.getName().equals("scope")) { - appendMemorySegmentScopePlugin(plugins, m); - } - } - } if (types.Throwable_jfrTracing != null) { appendJFRTracingPlugin(plugins); } } - /** - * The calls to MemorySegmentProxy.scope() (JDK 17) or Scoped.sessionImpl() (JDK 19) from - * {@link Buffer} are problematic for Truffle because they would remain as non-inlineable - * invokes after PE. Because these are virtual calls, we can also not use a - * {@link InvocationPlugin} during PE to intrinsify the invoke to a deoptimization. Therefore, - * we already do the intrinsification during bytecode parsing using a {@link NodePlugin}, - * because that is also invoked for virtual calls. - */ - private static void appendMemorySegmentScopePlugin(Plugins plugins, ResolvedJavaMethod scopeMethod) { - plugins.appendNodePlugin(new NodePlugin() { - @Override - public boolean handleInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) { - if (scopeMethod.equals(method) && !b.needsExplicitException()) { - b.add(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint)); - return true; - } - return false; - } - }); - } - /** * For details see {@link KnownTruffleTypes#Throwable_jfrTracing}. */