diff --git a/common.json b/common.json index 0475424446f6..f3437927e826 100644 --- a/common.json +++ b/common.json @@ -8,7 +8,7 @@ "COMMENT.jdks": "When adding or removing JDKs keep in sync with JDKs in ci/common.jsonnet", "jdks": { - "galahad-jdk": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-26+4-323", "platformspecific": true, "extrabundles": ["static-libs"]}, + "galahad-jdk": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-26+5-361", "platformspecific": true, "extrabundles": ["static-libs"]}, "oraclejdk17": {"name": "jpg-jdk", "version": "17.0.7", "build_id": "jdk-17.0.7+8", "platformspecific": true, "extrabundles": ["static-libs"]}, "labsjdk-ce-17": {"name": "labsjdk", "version": "ce-17.0.7+4-jvmci-23.1-b02", "platformspecific": true }, @@ -53,13 +53,13 @@ "labsjdk-ee-25Debug": {"name": "labsjdk", "version": "ee-25+26-jvmci-b01-debug", "platformspecific": true }, "labsjdk-ee-25-llvm": {"name": "labsjdk", "version": "ee-25+26-jvmci-b01-sulong", "platformspecific": true }, - "oraclejdk-latest": {"name": "jpg-jdk", "version": "26", "build_id": "jdk-26+4", "platformspecific": true, "extrabundles": ["static-libs"]}, - "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-26+4-jvmci-b01", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-26+4-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-26+4-jvmci-b01-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-26+4-jvmci-b01", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-26+4-jvmci-b01-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-26+4-jvmci-b01-sulong", "platformspecific": true } + "oraclejdk-latest": {"name": "jpg-jdk", "version": "26", "build_id": "jdk-26+5", "platformspecific": true, "extrabundles": ["static-libs"]}, + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-26+5-jvmci-b01", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-26+5-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-26+5-jvmci-b01-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-26+5-jvmci-b01", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-26+5-jvmci-b01-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-26+5-jvmci-b01-sulong", "platformspecific": true } }, "eclipse": { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CountedLoopOverflowTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CountedLoopOverflowTest.java index c081bc71b660..8265db6daa34 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CountedLoopOverflowTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/CountedLoopOverflowTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -24,18 +24,18 @@ */ package jdk.graal.compiler.core.test; -import java.util.Collections; import java.util.EnumMap; import java.util.EnumSet; import java.util.Formatter; import java.util.Map; +import java.util.Set; + +import org.junit.Test; import jdk.graal.compiler.api.directives.GraalDirectives; import jdk.graal.compiler.core.common.GraalOptions; import jdk.graal.compiler.options.OptionValues; import jdk.graal.compiler.phases.OptimisticOptimizations; -import org.junit.Test; - import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.ProfilingInfo; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -121,7 +121,7 @@ public void testDownOverflow() { // first should deopt with a failed speculation, second not Map deoptCountsBefore = getDeoptCounts(method); try { - executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, Collections.emptySet(), null); + executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, true, Set.of(), null); deoptCountsBefore = getDeoptCounts(method); executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, EnumSet.allOf(DeoptimizationReason.class), null); } catch (Throwable t) { @@ -142,7 +142,7 @@ public void testDownOverflowUnsigned() { // first should deopt with a failed speculation, second not Map deoptCountsBefore = getDeoptCounts(method); try { - executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, Collections.emptySet(), null); + executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, true, Set.of(), null); deoptCountsBefore = getDeoptCounts(method); executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, EnumSet.allOf(DeoptimizationReason.class), null); } catch (Throwable t) { @@ -163,7 +163,7 @@ public void testUpOverflow() { // first should deopt with a failed speculation, second not Map deoptCountsBefore = getDeoptCounts(method); try { - executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, Collections.emptySet(), null); + executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, true, Set.of(), null); deoptCountsBefore = getDeoptCounts(method); executeActualCheckDeopt(new OptionValues(getInitialOptions(), GraalOptions.LoopPeeling, false, GraalOptions.FullUnroll, false), method, EnumSet.allOf(DeoptimizationReason.class), null); } catch (Throwable t) { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java index 05819dce1947..f47d15e8bcda 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/GraalCompilerTest.java @@ -902,17 +902,25 @@ protected Result executeActual(ResolvedJavaMethod method, Object receiver, Objec } protected Result executeActual(OptionValues options, ResolvedJavaMethod method, Object receiver, Object... args) { + return executeActual(options, method, false, receiver, args); + } + + protected Result executeActual(OptionValues options, ResolvedJavaMethod method, boolean installAsDefault, Object receiver, Object... args) { before(method); Object[] executeArgs = argsWithReceiver(receiver, args); checkArgs(method, executeArgs); - InstalledCode compiledMethod = getCode(method, options); + InstalledCode compiledMethod = getCode(method, null, false, installAsDefault, options); try { return new Result(compiledMethod.executeVarargs(executeArgs), null); } catch (Throwable e) { return new Result(null, e); } finally { + // Prevent a subsequent `executeExpected' call from entering the compiled method + if (installAsDefault) { + compiledMethod.invalidate(); + } after(); } } @@ -1006,9 +1014,13 @@ protected Result test(ResolvedJavaMethod method, Object receiver, Object... args } protected Result test(OptionValues options, ResolvedJavaMethod method, Object receiver, Object... args) { + return test(options, method, false, receiver, args); + } + + protected final Result test(OptionValues options, ResolvedJavaMethod method, boolean installAsDefault, Object receiver, Object... args) { Result expect = executeExpected(method, receiver, args); if (getCodeCache() != null) { - testAgainstExpected(options, method, expect, receiver, args); + testAgainstExpected(options, method, installAsDefault, expect, Set.of(), receiver, args); } return expect; } @@ -1031,29 +1043,36 @@ protected Object[] applyArgSuppliers(Object... args) { } protected final void testAgainstExpected(ResolvedJavaMethod method, Result expect, Object receiver, Object... args) { - testAgainstExpected(getInitialOptions(), method, expect, Collections. emptySet(), receiver, args); - } - - protected void testAgainstExpected(ResolvedJavaMethod method, Result expect, Set shouldNotDeopt, Object receiver, Object... args) { - testAgainstExpected(getInitialOptions(), method, expect, shouldNotDeopt, receiver, args); + testAgainstExpected(getInitialOptions(), method, false, expect, Set.of(), receiver, args); } protected final void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Object receiver, Object... args) { - testAgainstExpected(options, method, expect, Collections. emptySet(), receiver, args); + testAgainstExpected(options, method, false, expect, Set.of(), receiver, args); } protected void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Set shouldNotDeopt, Object receiver, Object... args) { - Result actual = executeActualCheckDeopt(options, method, shouldNotDeopt, receiver, args); + testAgainstExpected(options, method, true, expect, shouldNotDeopt, receiver, args); + } + + private void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, boolean installAsDefault, Result expect, Set shouldNotDeopt, Object receiver, + Object... args) { + Result actual = executeActualCheckDeopt(options, method, installAsDefault, shouldNotDeopt, receiver, args); assertEquals(expect, actual); } - protected Result executeActualCheckDeopt(OptionValues options, ResolvedJavaMethod method, Set shouldNotDeopt, Object receiver, Object... args) { + protected final Result executeActualCheckDeopt(OptionValues options, ResolvedJavaMethod method, Set shouldNotDeopt, Object receiver, + Object... args) { + return executeActualCheckDeopt(options, method, !shouldNotDeopt.isEmpty(), shouldNotDeopt, receiver, args); + } + + protected final Result executeActualCheckDeopt(OptionValues options, ResolvedJavaMethod method, boolean installAsDefault, Set shouldNotDeopt, Object receiver, + Object... args) { Map deoptCounts = new EnumMap<>(DeoptimizationReason.class); ProfilingInfo profile = method.getProfilingInfo(); for (DeoptimizationReason reason : shouldNotDeopt) { deoptCounts.put(reason, profile.getDeoptimizationCount(reason)); } - Result actual = executeActual(options, method, receiver, args); + Result actual = executeActual(options, method, installAsDefault, receiver, args); profile = method.getProfilingInfo(); // profile can change after execution for (DeoptimizationReason reason : shouldNotDeopt) { Assert.assertEquals("wrong number of deopt counts for " + reason, (int) deoptCounts.get(reason), profile.getDeoptimizationCount(reason)); @@ -1186,8 +1205,7 @@ protected InstalledCode getCode(final ResolvedJavaMethod installedCodeOwner, Str } catch (Throwable e) { throw debug.handle(e); } - - if (useCache) { + if (useCache && !installAsDefault) { cache.get().put(installedCodeOwner, Pair.create(options, installedCode)); } return installedCode; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest.java index c2866623c904..98e57026c802 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest.java @@ -33,7 +33,6 @@ import java.lang.constant.ClassDesc; import java.lang.constant.MethodTypeDesc; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.junit.Test; @@ -78,7 +77,7 @@ public void testSubWordInput() throws ClassNotFoundException { getCode(getResolvedJavaMethod(testClass, GET), null, false, true, getInitialOptions()); assertEquals(executeExpected(wrapper, null, value), expected); // test with inlining - testAgainstExpected(wrapper, expected, Collections.emptySet(), null, value); + testAgainstExpected(wrapper, expected, null, new Object[]{value}); } @Override diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest2.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest2.java index 5256b17ef227..2aa030f3ded3 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest2.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/core/test/SubWordInputTest2.java @@ -33,7 +33,6 @@ import java.lang.constant.ClassDesc; import java.lang.constant.MethodTypeDesc; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.junit.Test; @@ -76,7 +75,7 @@ public void testSubWordInput() throws ClassNotFoundException { getCode(getResolvedJavaMethod(testClass, GET), null, false, true, getInitialOptions()); assertEquals(executeExpected(wrapper, null, value), expected); // test with inlining - testAgainstExpected(wrapper, expected, Collections.emptySet(), null, value); + testAgainstExpected(wrapper, expected, null, new Object[]{value}); } @Override diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java index 4499e640862b..f760b1200473 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/lir/test/BenchmarkCounterOverflowTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -35,22 +35,20 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; + import jdk.graal.compiler.api.directives.GraalDirectives; -import jdk.graal.compiler.core.test.GraalCompilerTest; -import jdk.graal.compiler.jtt.JTTTest; -import jdk.graal.compiler.lir.jtt.LIRTest; -import jdk.graal.compiler.lir.jtt.LIRTestSpecification; import jdk.graal.compiler.core.common.LIRKind; import jdk.graal.compiler.hotspot.HotSpotBackend; import jdk.graal.compiler.hotspot.debug.BenchmarkCounters; import jdk.graal.compiler.lir.ConstantValue; import jdk.graal.compiler.lir.gen.LIRGeneratorTool; +import jdk.graal.compiler.lir.jtt.LIRTest; +import jdk.graal.compiler.lir.jtt.LIRTestSpecification; import jdk.graal.compiler.test.SubprocessUtil; -import org.junit.Assert; -import org.junit.Assume; -import org.junit.Before; -import org.junit.Test; - import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -97,7 +95,7 @@ public void incrementCounter() { Object[] args = new Object[]{Integer.MAX_VALUE * 4L}; ResolvedJavaMethod method = getResolvedJavaMethod("test"); - executeActualCheckDeopt(GraalCompilerTest.getInitialOptions(), method, JTTTest.EMPTY, null, args); + executeActual(method, null, args); } @Test diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/DeoptimizeReasonAccountingTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/DeoptimizeReasonAccountingTest.java index 7839506a4d40..79ffca9ad5d6 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/DeoptimizeReasonAccountingTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/DeoptimizeReasonAccountingTest.java @@ -124,7 +124,7 @@ public void testDeoptimize() { for (boolean osr : new boolean[]{false}) { this.reason = r; this.isOSR = osr; - test("deoptimizeSnippet"); + test(getInitialOptions(), getResolvedJavaMethod("deoptimizeSnippet"), true, null, new Object[0]); ProfilingInfo info = lastCompiledGraph.method().getProfilingInfo(!isOSR, isOSR); int count = info.getDeoptimizationCount(reason); Assert.assertEquals(String.format("reason:%s, osr:%s", r, osr), 1, count); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/MonitorPEATest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/MonitorPEATest.java index 1be953c283b4..767b155605dd 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/MonitorPEATest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/MonitorPEATest.java @@ -28,23 +28,15 @@ import static jdk.graal.compiler.api.directives.GraalDirectives.deoptimize; import static jdk.graal.compiler.api.directives.GraalDirectives.injectBranchProbability; -import org.junit.Assume; -import org.junit.Before; import org.junit.Test; import jdk.graal.compiler.api.directives.GraalDirectives; -import jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil; /** * Tests that PEA preserves the monitorenter order. This is essential for lightweight locking. */ public final class MonitorPEATest extends HotSpotGraalCompilerTest { - @Before - public void checkUseLightweightLocking() { - Assume.assumeTrue(HotSpotReplacementsUtil.useLightweightLocking(runtime().getVMConfig())); - } - static int staticInt = 0; static Object staticObj; static Object staticObj1; diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/RangeCheckPredicatesTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/RangeCheckPredicatesTest.java index de8a31c1d3e9..c90bd5e022ef 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/RangeCheckPredicatesTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/RangeCheckPredicatesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -102,7 +102,7 @@ private void runOutOfBound(String methodName, int size, boolean loopLimitCheck, Object[] args = new Object[testParameters.length + 1]; args[0] = array; System.arraycopy(testParameters, 0, args, 1, testParameters.length); - Result result = executeActual(getOptionsMainPath(), method, null, args); + Result result = executeActual(getOptionsMainPath(), method, true, null, args); Assert.assertNotNull(result.exception); Assert.assertTrue(result.exception instanceof ArrayIndexOutOfBoundsException); profile = method.getProfilingInfo(); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/JTTTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/JTTTest.java index c139b6339dae..a1ccd710e6ee 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/JTTTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/JTTTest.java @@ -30,12 +30,14 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; -import java.util.Collections; import java.util.Formatter; import java.util.ListIterator; import java.util.Optional; import java.util.Set; +import org.junit.Assert; +import org.junit.AssumptionViolatedException; + import jdk.graal.compiler.api.test.Graal; import jdk.graal.compiler.core.phases.fuzzing.AbstractCompilationPlan; import jdk.graal.compiler.core.phases.fuzzing.FullFuzzedCompilationPlan; @@ -56,9 +58,6 @@ import jdk.graal.compiler.phases.tiers.MidTierContext; import jdk.graal.compiler.phases.tiers.Suites; import jdk.graal.compiler.runtime.RuntimeProvider; -import org.junit.Assert; -import org.junit.AssumptionViolatedException; - import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -80,7 +79,6 @@ public class JTTTest extends GraalCompilerTest { public static final class DummyTestClass { } - protected static final Set EMPTY = Collections. emptySet(); /** * The arguments which, if non-null, will replace the Locals in the test method's graph. */ @@ -134,7 +132,7 @@ protected void runTest(String name, Object... args) { } protected void runTest(OptionValues options, String name, Object... args) { - runTest(options, EMPTY, name, args); + runTest(options, Set.of(), name, args); } protected void runTest(Set shouldNotDeopt, String name, Object... args) { @@ -191,7 +189,7 @@ protected void runTest(OptionValues options, Set shouldNot * to the usual compilation using {@link GraalCompilerTest#testAgainstExpected}. */ @Override - protected void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Set shouldNotDeopt, Object receiver, Object... args) { + protected final void testAgainstExpected(OptionValues options, ResolvedJavaMethod method, Result expect, Set shouldNotDeopt, Object receiver, Object... args) { if (Boolean.getBoolean(COMPILATION_PLAN_FUZZING_SYSTEM_PROPERTY)) { testAgainstExpectedWithFuzzedCompilationPlan(options, method, expect, shouldNotDeopt, receiver, args); } else { diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/except/BC_getfield1.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/except/BC_getfield1.java index 148c772bf71d..86b966d16509 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/except/BC_getfield1.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/except/BC_getfield1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -55,7 +55,7 @@ public void run0() throws Throwable { @Test public void run1() throws Throwable { // tests that the null check isn't removed along with the read - runTest(EMPTY, "test", (Object) null); + runTest("test", (Object) null); } @Test diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java index 9e23d4233090..e81dc3a45a95 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/jdk/Unsafe_compareAndSwapNullCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -57,6 +57,6 @@ public static void test(Unsafe_compareAndSwapNullCheck u, long expected, long ne @Test public void run0() throws Throwable { - runTest(EMPTY, "test", null, 1L, 2L); + runTest("test", null, 1L, 2L); } } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/LambdaEagerTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/LambdaEagerTest.java index 8fda9b6f40c5..139ff653bce5 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/LambdaEagerTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/LambdaEagerTest.java @@ -29,11 +29,11 @@ import java.util.EnumSet; import java.util.function.IntBinaryOperator; +import org.junit.Test; + import jdk.graal.compiler.core.test.GraalCompilerTest; import jdk.graal.compiler.nodes.StructuredGraph; import jdk.graal.compiler.options.OptionValues; -import org.junit.Test; - import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -65,19 +65,19 @@ public static int capturing(int x, int y, int z) { @Test public void testEagerResolveNonCapturing01() { Result expected = new Result(3, null); - testAgainstExpected(getResolvedJavaMethod("nonCapturing"), expected, UNRESOLVED_UNREACHED, 1, 2); + testAgainstExpected(getInitialOptions(), getResolvedJavaMethod("nonCapturing"), expected, UNRESOLVED_UNREACHED, 1, 2); } @Test public void testEagerResolveNonCapturing02() { Result expected = new Result(3, null); - testAgainstExpected(getResolvedJavaMethod("nonCapturing2"), expected, UNRESOLVED_UNREACHED, 1, 2); + testAgainstExpected(getInitialOptions(), getResolvedJavaMethod("nonCapturing2"), expected, UNRESOLVED_UNREACHED, 1, 2); } @Test public void testEagerResolveCapturing() { Result expected = new Result(0, null); - testAgainstExpected(getResolvedJavaMethod("capturing"), expected, UNRESOLVED_UNREACHED, 1, 2, 3); + testAgainstExpected(getInitialOptions(), getResolvedJavaMethod("capturing"), expected, UNRESOLVED_UNREACHED, 1, 2, 3); } @Override diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/Math_pow.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/Math_pow.java index 3cc1f05c1d1d..2c65f078588e 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/Math_pow.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/Math_pow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -137,7 +137,7 @@ public void run12() { private void testOne(OptionValues options, ResolvedJavaMethod method, Object receiver, long testIteration, long l, double x, double y) throws AssertionError { Result expect = executeExpected(method, receiver, x, y); try { - testAgainstExpected(options, method, expect, EMPTY, receiver, x, y); + testAgainstExpected(options, method, expect, receiver, x, y); } catch (AssertionError e) { throw new AssertionError(String.format("%d: While testing %g [long: %d, hex: %x]", testIteration, x, l, l), e); } diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/UnaryMath.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/UnaryMath.java index 5fc61533c61a..f249091ddb5f 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/UnaryMath.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/jtt/lang/UnaryMath.java @@ -60,7 +60,7 @@ void testManyValues(OptionValues options, ResolvedJavaMethod method) throws Asse double d = Double.longBitsToDouble(l); Result expect = executeExpected(method, receiver, d); try { - testAgainstExpected(options, method, expect, EMPTY, receiver, d); + testAgainstExpected(options, method, expect, receiver, d); testIteration++; } catch (AssertionError e) { throw new AssertionError(String.format("%d: While testing %g [long: %d, hex: %x]", testIteration, d, l, l), e); diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/ArrayCopyExceptionSeenTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/ArrayCopyExceptionSeenTest.java index e0424a60061d..bbdbd6f4681d 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/ArrayCopyExceptionSeenTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/ArrayCopyExceptionSeenTest.java @@ -88,7 +88,7 @@ public void testCopy() { public void testFailingCopy() throws InvalidInstalledCodeException { var method = getResolvedJavaMethod("copyWithHandler"); Assert.assertEquals("No recorded deopt expected before first invocation.", 0, method.getProfilingInfo().getDeoptimizationCount(DeoptimizationReason.BoundsCheckException)); - test(method, null, new Object[3], -1, new Object[3], 0, 1); + test(getInitialOptions(), method, true, null, new Object[]{new Object[3], -1, new Object[3], 0, 1}); Assert.assertEquals("Single deopt expected after first invocation.", 1, method.getProfilingInfo().getDeoptimizationCount(DeoptimizationReason.BoundsCheckException)); /* * Force a recompile which should create an explicit exception edge for the System.arraycopy diff --git a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/CountPositivesTest.java b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/CountPositivesTest.java index 985f71df7a09..44f2529ef412 100644 --- a/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/CountPositivesTest.java +++ b/compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/replacements/test/CountPositivesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 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 @@ -24,15 +24,13 @@ */ package jdk.graal.compiler.replacements.test; -import java.util.Collections; +import org.junit.Test; import jdk.graal.compiler.core.common.CompilationIdentifier; import jdk.graal.compiler.hotspot.test.HotSpotGraalCompilerTest; import jdk.graal.compiler.nodes.StructuredGraph; import jdk.graal.compiler.options.OptionValues; import jdk.graal.compiler.test.AddExports; -import org.junit.Test; - import jdk.vm.ci.meta.ResolvedJavaMethod; @AddExports("java.base/java.lang") @@ -70,7 +68,7 @@ public void testStringCoding() throws ClassNotFoundException { for (int off : new int[]{0, 2, -2}) { for (int len : new int[]{bytes.length, 2, 0, -2}) { Result expect = executeExpected(method, null, bytes, off, len); - Result actual = executeActualCheckDeopt(getInitialOptions(), method, Collections.emptySet(), null, bytes, off, len); + Result actual = executeActual(method, null, bytes, off, len); if (expect.returnValue == null) { assertEquals(expect, actual); 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 836c36967382..852e7047b872 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 @@ -135,16 +135,6 @@ private HotSpotGraalRuntime.HotSpotGC getSelectedGC() throws GraalError { public final boolean printInlining = getFlag("PrintInlining", Boolean.class); public final boolean inline = getFlag("Inline", Boolean.class); - // There are 3 available locking modes: - // LM_MONITOR uses only heavy monitors for locking; - // LM_LEGACY uses stack-locking, with monitors as 2nd tier; - // LM_LIGHTWEIGHT uses thread-local space for storing locked objects. This avoids the overload - // of the mark word. - public final int lockingMode = getFlag("LockingMode", Integer.class); - - 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); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java index 3946d1428f94..804aaa5094c3 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java @@ -55,8 +55,8 @@ public final class JVMCIVersionCheck { */ private static final Map> JVMCI_MIN_VERSIONS = Map.of( "26", Map.of( - "Oracle Corporation", createLabsJDKVersion("26+4", 1), - DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("26+4", 1))); + "Oracle Corporation", createLabsJDKVersion("26+5", 1), + DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("26+5", 1))); private static final int NA = 0; /** * Minimum Java release supported by Graal. 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 d7630c38cf40..b3cbc773dfdf 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 @@ -35,7 +35,6 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.HUB_WRITE_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.MARK_WORD_LOCATION; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useLightweightLocking; import static org.graalvm.word.LocationIdentity.any; import java.util.Arrays; @@ -330,7 +329,7 @@ public void initialize(OptionValues options, Iterable fact assert target == providers.getCodeCache().getTarget() : Assertions.errorMessage(target, providers.getCodeCache().getTarget()); instanceofSnippets = new InstanceOfSnippets.Templates(options, runtime, providers); allocationSnippets = allocationSnippetTemplates; - monitorSnippets = new MonitorSnippets.Templates(options, runtime, providers, config); + monitorSnippets = new MonitorSnippets.Templates(options, runtime, providers); g1WriteBarrierSnippets = new HotSpotG1WriteBarrierSnippets.Templates(options, runtime, providers, config); serialWriteBarrierSnippets = new HotSpotSerialWriteBarrierSnippets.Templates(options, runtime, providers); exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(options, providers); @@ -397,14 +396,11 @@ public MonitorSnippets.Templates getMonitorSnippets() { @Override protected FixedWithNextNode maybeEmitLockingCheck(List locks, FixedWithNextNode insertionPoint, FrameState stateBefore) { if (!locks.isEmpty()) { - if (useLightweightLocking(getVMConfig())) { - StructuredGraph graph = insertionPoint.graph(); - CheckFastPathMonitorEnterNode check = graph.add(new CheckFastPathMonitorEnterNode(locks)); - graph.addAfterFixed(insertionPoint, check); - check.setStateBefore(stateBefore.duplicate()); - return check; - } - // The stack lock and heavyweight monitors cases don't need any checks. + StructuredGraph graph = insertionPoint.graph(); + CheckFastPathMonitorEnterNode check = graph.add(new CheckFastPathMonitorEnterNode(locks)); + graph.addAfterFixed(insertionPoint, check); + check.setStateBefore(stateBefore.duplicate()); + return check; } return insertionPoint; } @@ -530,7 +526,7 @@ private boolean lowerWithoutDelegation(Node n, LoweringTool tool) { } } else if (n instanceof CheckFastPathMonitorEnterNode) { if (graph.getGuardsStage().areFrameStatesAtDeopts()) { - monitorSnippets.lower((CheckFastPathMonitorEnterNode) n, registers, runtime.getVMConfig(), tool); + monitorSnippets.lower((CheckFastPathMonitorEnterNode) n, registers, tool); } } else if (n instanceof MonitorExitNode) { if (graph.getGuardsStage().areFrameStatesAtDeopts()) { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java index f5ac6a18aca2..8c33ff12857d 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotPlatformConfigurationProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 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 @@ -25,7 +25,6 @@ package jdk.graal.compiler.hotspot.meta; import jdk.graal.compiler.hotspot.GraalHotSpotVMConfig; -import jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil; import jdk.graal.compiler.nodes.gc.BarrierSet; import jdk.graal.compiler.nodes.spi.PlatformConfigurationProvider; @@ -34,12 +33,9 @@ public class HotSpotPlatformConfigurationProvider implements PlatformConfigurati private final boolean canVirtualizeLargeByteArrayAccess; - private final boolean useLightweightLocking; - public HotSpotPlatformConfigurationProvider(GraalHotSpotVMConfig config, BarrierSet barrierSet) { this.barrierSet = barrierSet; this.canVirtualizeLargeByteArrayAccess = config.deoptimizationSupportLargeAccessByteArrayVirtualization; - this.useLightweightLocking = HotSpotReplacementsUtil.useLightweightLocking(config); } @Override @@ -49,7 +45,7 @@ public boolean canVirtualizeLargeByteArrayAccess() { @Override public boolean requiresStrictLockOrder() { - return useLightweightLocking; + return true; } @Override diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotHashCodeSnippets.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotHashCodeSnippets.java index 33cf473097ee..978abb0dc413 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotHashCodeSnippets.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/HotSpotHashCodeSnippets.java @@ -34,8 +34,6 @@ 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.uninitializedIdentityHashCodeValue; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.unlockedValue; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useLightweightLocking; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useObjectMonitorTable; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.FAST_PATH_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability; @@ -75,9 +73,7 @@ protected int computeIdentityHashCode(final Object x) { // // See src/hotspot/share/oops/markWord.hpp for more details. final Word lockBits = mark.and(Word.unsigned(markWordLockMaskInPlace(INJECTED_VMCONFIG))); - if (useObjectMonitorTable(INJECTED_VMCONFIG) || probability(FAST_PATH_PROBABILITY, - useLightweightLocking(INJECTED_VMCONFIG) ? lockBits.notEqual(Word.unsigned(monitorValue(INJECTED_VMCONFIG))) - : lockBits.equal(Word.unsigned(unlockedValue(INJECTED_VMCONFIG))))) { + if (useObjectMonitorTable(INJECTED_VMCONFIG) || probability(FAST_PATH_PROBABILITY, lockBits.notEqual(Word.unsigned(monitorValue(INJECTED_VMCONFIG))))) { // `& markWord::hash_mask' is essential with -XX:+UseCompactObjectHeaders, because bit // 42 might be set. int hash = (int) mark.unsignedShiftRight(markWordHashCodeShift(INJECTED_VMCONFIG)).and((int) markWordHashMark(INJECTED_VMCONFIG)).rawValue(); 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 7c90aceacccf..8e2a11945e6b 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 @@ -363,11 +363,6 @@ public static int wordSize() { return runtime().getHostJVMCIBackend().getCodeCache().getTarget().wordSize; } - @Fold - public static int pageSize(@InjectedParameter GraalHotSpotVMConfig config) { - return config.vmPageSize; - } - public static final LocationIdentity PROTOTYPE_MARK_WORD_LOCATION = NamedLocationIdentity.mutable("PrototypeMarkWord"); public static final LocationIdentity KLASS_ACCESS_FLAGS_LOCATION = NamedLocationIdentity.immutable("Klass::_access_flags"); @@ -535,16 +530,6 @@ public static void initializeObjectHeader(Word memory, Word markWord, KlassPoint } } - @Fold - public static boolean useStackLocking(@InjectedParameter GraalHotSpotVMConfig config) { - return config.lockingMode == config.lockingModeStack; - } - - @Fold - public static boolean useLightweightLocking(@InjectedParameter GraalHotSpotVMConfig config) { - return config.lockingMode == config.lockingModeLightweight; - } - @Fold public static boolean useObjectMonitorTable(@InjectedParameter GraalHotSpotVMConfig config) { return config.useObjectMonitorTable; @@ -560,11 +545,6 @@ public static int monitorValue(@InjectedParameter GraalHotSpotVMConfig config) { return config.monitorValue; } - @Fold - public static int unusedMark(@InjectedParameter GraalHotSpotVMConfig config) { - return config.unusedMark; - } - @Fold public static int objectMonitorOwnerOffset(@InjectedParameter GraalHotSpotVMConfig config) { return config.objectMonitorOwner; @@ -765,11 +745,6 @@ public static int lockMetadataOffset(@InjectedParameter GraalHotSpotVMConfig con return config.basicLockMetadataOffset; } - @Fold - static int heldMonitorCountOffset(@InjectedParameter GraalHotSpotVMConfig config) { - return config.threadHeldMonitorCountOffset; - } - @Fold static int javaThreadMonitorOwnerIDOffset(@InjectedParameter GraalHotSpotVMConfig config) { return config.javaThreadMonitorOwnerIDOffset; 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 9b73694b2ccb..8b3b4da3fe8a 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 @@ -48,7 +48,6 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJECT_MONITOR_STACK_LOCKER_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.OBJECT_MONITOR_SUCC_LOCATION; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.diagnoseSyncOnValueBasedClasses; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.heldMonitorCountOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.isCAssertEnabled; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.javaThreadLockStackEndOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.javaThreadLockStackTopOffset; @@ -68,13 +67,9 @@ import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.objectMonitorSuccOffset; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.omCacheOopToMonitorDifference; 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.unlockedValue; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.unusedMark; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useLightweightLocking; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useObjectMonitorTable; -import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.useStackLocking; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.verifyOop; import static jdk.graal.compiler.hotspot.replacements.HotSpotReplacementsUtil.wordSize; import static jdk.graal.compiler.hotspot.replacements.HotspotSnippetsOptions.ProfileMonitors; @@ -84,13 +79,11 @@ import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.NOT_FREQUENT_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.NOT_LIKELY_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.SLOW_PATH_PROBABILITY; -import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.VERY_FAST_PATH_PROBABILITY; import static jdk.graal.compiler.nodes.extended.BranchProbabilityNode.probability; import static jdk.graal.compiler.nodes.extended.MembarNode.memoryBarrier; import static jdk.graal.compiler.replacements.SnippetTemplate.DEFAULT_REPLACER; import static jdk.graal.compiler.replacements.nodes.CStringConstant.cstring; import static jdk.graal.compiler.word.Word.nullPointer; -import static jdk.graal.compiler.word.Word.unsigned; import static jdk.graal.compiler.word.Word.zero; import static org.graalvm.word.LocationIdentity.any; @@ -114,7 +107,6 @@ import jdk.graal.compiler.graph.Node.ConstantNodeParameter; import jdk.graal.compiler.graph.Node.NodeIntrinsic; import jdk.graal.compiler.graph.iterators.NodeIterable; -import jdk.graal.compiler.hotspot.GraalHotSpotVMConfig; import jdk.graal.compiler.hotspot.meta.HotSpotForeignCallDescriptor; import jdk.graal.compiler.hotspot.meta.HotSpotProviders; import jdk.graal.compiler.hotspot.meta.HotSpotRegistersProvider; @@ -205,8 +197,10 @@ * appropriately to comply with the layouts above. */ // @formatter:off -@SyncPort(from = "https://github.com/openjdk/jdk/blob/c2d76f9844aadf77a0b213a9169a7c5c8c8f1ffb/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp#L149-L455", - sha1 = "223a88b7bdd10862cd3b112181e1d17682b0fbe2") +@SyncPort(from = "https://github.com/openjdk/jdk/blob/9eeb86d972ac4cc38d923b2b868b426bbd27a4e8/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp#L465-L625", + sha1 = "2d66e0ccf8dbf69f575be2633d5a17f77a20131d") +@SyncPort(from = "https://github.com/openjdk/jdk/blob/250eb743c112fbcc45bf2b3ded1c644b19893577/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp#L627-L788", + sha1 = "e88d7b8c4bb85358c6a810ee1d7d92fde5db42e6") // @formatter:on public class MonitorSnippets implements Snippets { @@ -260,10 +254,8 @@ public static void monitorenter(Object object, KlassPointer hub, @ConstantParame } } - if (tryFastPathLocking(object, stackPointerRegister, trace, counters, mark, lock, thread)) { - maybeUpdateHeldMonitorCount(thread, 1); - } else { - if (synthetic && (useLightweightLocking(INJECTED_VMCONFIG) || useStackLocking(INJECTED_VMCONFIG))) { + if (!tryLightweightLocking(object, lock, mark, thread, trace, counters, stackPointerRegister)) { + if (synthetic) { // The fast locking cases are never permitted to use the slow path. throw UnreachableNode.unreachable(); } else { @@ -273,20 +265,6 @@ public static void monitorenter(Object object, KlassPointer hub, @ConstantParame } } - /** - * Dispatch to the appropriate locking strategy based on the {@code LockingMode} flag value. - */ - private static boolean tryFastPathLocking(Object object, Register stackPointerRegister, boolean trace, Counters counters, Word mark, Word lock, Word thread) { - if (useLightweightLocking(INJECTED_VMCONFIG)) { - return tryLightweightLocking(object, lock, mark, thread, trace, counters, stackPointerRegister); - } else if (useStackLocking(INJECTED_VMCONFIG)) { - return tryStackLocking(object, lock, mark, thread, trace, counters, stackPointerRegister); - } else { - // LM_MONITOR case - return false; - } - } - // Cache the monitor for unlock private static void writeMonitorCache(Word lock, Word monitor) { if (useObjectMonitorTable(INJECTED_VMCONFIG)) { @@ -368,69 +346,6 @@ private static boolean tryEnterInflated(Object object, Word lock, Word mark, Wor return false; } - private static boolean tryStackLocking(Object object, Word lock, Word mark, Word thread, boolean trace, Counters counters, Register stackPointerRegister) { - if (probability(SLOW_PATH_PROBABILITY, mark.and(monitorValue(INJECTED_VMCONFIG)).notEqual(0))) { - // Inflated case - // Set the lock slot's displaced mark to unused. Any non-0 value suffices. - lock.writeWord(lockMetadataOffset(INJECTED_VMCONFIG), Word.unsigned(unusedMark(INJECTED_VMCONFIG)), BASICLOCK_METADATA_LOCATION); - return tryEnterInflated(object, lock, mark, thread, trace, counters); - } - - Pointer objectPointer = Word.objectToTrackedPointer(object); - - // Create the unlocked mark word pattern - Word unlockedMark = mark.or(unlockedValue(INJECTED_VMCONFIG)); - trace(trace, " unlockedMark: 0x%016lx\n", unlockedMark); - - // Copy this unlocked mark word into the lock slot on the stack - lock.writeWord(lockMetadataOffset(INJECTED_VMCONFIG), unlockedMark, BASICLOCK_METADATA_LOCATION); - - // Test if the object's mark word is unlocked, and if so, store the (address of) the - // lock slot into the object's mark word. - // - // Since pointer cas operations are volatile accesses, previous stores cannot float - // below it. - Word currentMark = objectPointer.compareAndSwapWord(markOffset(INJECTED_VMCONFIG), unlockedMark, lock, MARK_WORD_LOCATION); - if (probability(FAST_PATH_PROBABILITY, currentMark.equal(unlockedMark))) { - traceObject(trace, "+lock{stack:cas}", object, true); - counters.lockFastCas.inc(); - return true; - } else { - trace(trace, " currentMark: 0x%016lx\n", currentMark); - // The mark word in the object header was not the same. - // Either the object is locked by another thread or is already locked - // by the current thread. The latter is true if the mark word - // is a stack pointer into the current thread's stack, i.e.: - // - // 1) (currentMark & aligned_mask) == 0 - // 2) rsp <= currentMark - // 3) currentMark <= rsp + page_size - // - // These 3 tests can be done by evaluating the following expression: - // - // (currentMark - rsp) & (aligned_mask - page_size) - // - // assuming both the stack pointer and page_size have their least - // significant 2 bits cleared and page_size is a power of 2 - final Word alignedMask = unsigned(wordSize() - 1); - final Word stackPointer = registerAsWord(stackPointerRegister); - if (probability(FAST_PATH_PROBABILITY, currentMark.subtract(stackPointer).and(alignedMask.subtract(pageSize(INJECTED_VMCONFIG))).equal(0))) { - // Recursively locked => write 0 to the lock slot - lock.writeWord(lockMetadataOffset(INJECTED_VMCONFIG), zero(), BASICLOCK_METADATA_LOCATION); - traceObject(trace, "+lock{stack:recursive}", object, true); - counters.lockFastRecursive.inc(); - return true; - } - traceObject(trace, "+lock{stack:failed-cas}", object, true); - counters.lockFastFailedCas.inc(); - } - return false; - } - - // @formatter:off - @SyncPort(from = "https://github.com/openjdk/jdk/blob/c2d76f9844aadf77a0b213a9169a7c5c8c8f1ffb/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp#L457-L617", - sha1 = "2d66e0ccf8dbf69f575be2633d5a17f77a20131d") - // @formatter:on @SuppressWarnings("unused") private static boolean tryLightweightLocking(Object object, Word lock, Word mark, Word thread, boolean trace, Counters counters, Register stackPointerRegister) { writeMonitorCache(lock, Word.nullPointer()); @@ -503,62 +418,13 @@ public static void monitorexit(Object object, @ConstantParameter int lockDepth, trace(trace, " object: 0x%016lx\n", Word.objectToTrackedPointer(object)); trace(trace, " lock: 0x%016lx\n", lock); - if (tryFastPathUnlocking(object, trace, counters, thread, lock)) { - maybeUpdateHeldMonitorCount(thread, -1); - } else { + if (!tryLightweightUnlocking(object, thread, lock, trace, counters)) { monitorexitStubC(MONITOREXIT, object, lock); } endLockScope(); decCounter(); } - /** - * Dispatch to the appropriate unlocking strategy based on the {@code LockingMode} flag value. - */ - private static boolean tryFastPathUnlocking(Object object, boolean trace, Counters counters, Word thread, Word lock) { - if (useLightweightLocking(INJECTED_VMCONFIG)) { - return tryLightweightUnlocking(object, thread, lock, trace, counters); - } else if (useStackLocking(INJECTED_VMCONFIG)) { - return tryStackUnlocking(object, thread, lock, trace, counters); - } else { - // LM_MONITOR case, i.e., use heavy monitor directly - return false; - } - } - - private static boolean tryStackUnlocking(Object object, Word thread, Word lock, boolean trace, Counters counters) { - final Word displacedMark = lock.readWord(lockMetadataOffset(INJECTED_VMCONFIG), BASICLOCK_METADATA_LOCATION); - - if (probability(NOT_LIKELY_PROBABILITY, displacedMark.equal(0))) { - // Recursive locking => done - traceObject(trace, "-lock{stack:recursive}", object, false); - counters.unlockFastRecursive.inc(); - return true; - } - - Word mark = loadWordFromObject(object, markOffset(INJECTED_VMCONFIG)); - - if (probability(SLOW_PATH_PROBABILITY, mark.and(monitorValue(INJECTED_VMCONFIG)).notEqual(0))) { - return tryExitInflated(object, mark, thread, lock, trace, counters); - } - - if (probability(VERY_FAST_PATH_PROBABILITY, Word.objectToTrackedPointer(object).logicCompareAndSwapWord(markOffset(INJECTED_VMCONFIG), - lock, displacedMark, MARK_WORD_LOCATION))) { - traceObject(trace, "-lock{stack:cas}", object, false); - counters.unlockFastCas.inc(); - return true; - } - - // The object's mark word was not pointing to the displaced header - traceObject(trace, "-lock{stack:failed-cas}", object, false); - counters.unlockFastFailedCas.inc(); - return false; - } - - // @formatter:off - @SyncPort(from = "https://github.com/openjdk/jdk/blob/c2d76f9844aadf77a0b213a9169a7c5c8c8f1ffb/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp#L619-L780", - sha1 = "e88d7b8c4bb85358c6a810ee1d7d92fde5db42e6") - // @formatter:on private static boolean tryLightweightUnlocking(Object object, Word thread, Word lock, boolean trace, Counters counters) { // Load top Word lockStackTop = Word.unsigned(thread.readInt(javaThreadLockStackTopOffset(INJECTED_VMCONFIG), JAVA_THREAD_LOCK_STACK_TOP_LOCATION)); @@ -672,13 +538,6 @@ private static boolean tryExitInflated(Object object, Word mark, Word thread, Wo return false; } - private static void maybeUpdateHeldMonitorCount(Word thread, int increment) { - 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); - } - } - @Fold static boolean doProfile(@Fold.InjectedParameter OptionValues options) { return ProfileMonitors.getValue(options); @@ -793,49 +652,28 @@ public static class Templates extends AbstractTemplates { public final Counters counters; - private final boolean requiresStrictLockOrder; - @SuppressWarnings("this-escape") - public Templates(OptionValues options, SnippetCounter.Group.Factory factory, HotSpotProviders providers, GraalHotSpotVMConfig config) { + public Templates(OptionValues options, SnippetCounter.Group.Factory factory, HotSpotProviders providers) { super(options, providers); - LocationIdentity[] enterLocations; - LocationIdentity[] exitLocations; - - if (useLightweightLocking(config)) { - enterLocations = new LocationIdentity[]{ - JAVA_THREAD_LOCK_STACK_LOCATION, - JAVA_THREAD_LOCK_STACK_TOP_LOCATION, - JAVA_THREAD_OM_CACHE_LOCATION, - JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION, - JAVA_THREAD_MONITOR_OWNER_ID_LOCATION}; - exitLocations = new LocationIdentity[]{ - JAVA_THREAD_LOCK_STACK_LOCATION, - JAVA_THREAD_LOCK_STACK_TOP_LOCATION, - BASICLOCK_METADATA_LOCATION, - OBJECT_MONITOR_OWNER_LOCATION, - OBJECT_MONITOR_CXQ_LOCATION, - OBJECT_MONITOR_ENTRY_LIST_LOCATION, - OBJECT_MONITOR_RECURSION_LOCATION, - OBJECT_MONITOR_SUCC_LOCATION, - OBJECT_MONITOR_STACK_LOCKER_LOCATION, - MARK_WORD_LOCATION, - JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION}; - } else { - enterLocations = new LocationIdentity[]{ - JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION, - JAVA_THREAD_MONITOR_OWNER_ID_LOCATION}; - exitLocations = new LocationIdentity[]{ - BASICLOCK_METADATA_LOCATION, - OBJECT_MONITOR_OWNER_LOCATION, - OBJECT_MONITOR_CXQ_LOCATION, - OBJECT_MONITOR_ENTRY_LIST_LOCATION, - OBJECT_MONITOR_RECURSION_LOCATION, - OBJECT_MONITOR_SUCC_LOCATION, - OBJECT_MONITOR_STACK_LOCKER_LOCATION, - MARK_WORD_LOCATION, - JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION}; - } + LocationIdentity[] enterLocations = new LocationIdentity[]{ + JAVA_THREAD_LOCK_STACK_LOCATION, + JAVA_THREAD_LOCK_STACK_TOP_LOCATION, + JAVA_THREAD_OM_CACHE_LOCATION, + JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION, + JAVA_THREAD_MONITOR_OWNER_ID_LOCATION}; + LocationIdentity[] exitLocations = new LocationIdentity[]{ + JAVA_THREAD_LOCK_STACK_LOCATION, + JAVA_THREAD_LOCK_STACK_TOP_LOCATION, + BASICLOCK_METADATA_LOCATION, + OBJECT_MONITOR_OWNER_LOCATION, + OBJECT_MONITOR_CXQ_LOCATION, + OBJECT_MONITOR_ENTRY_LIST_LOCATION, + OBJECT_MONITOR_RECURSION_LOCATION, + OBJECT_MONITOR_SUCC_LOCATION, + OBJECT_MONITOR_STACK_LOCKER_LOCATION, + MARK_WORD_LOCATION, + JAVA_THREAD_HOLD_MONITOR_COUNT_LOCATION}; this.checkMonitorenter = snippet(providers, MonitorSnippets.class, "checkMonitorenter", enterLocations); this.monitorenter = snippet(providers, MonitorSnippets.class, "monitorenter", enterLocations); @@ -844,12 +682,9 @@ public Templates(OptionValues options, SnippetCounter.Group.Factory factory, Hot this.checkCounter = snippet(providers, MonitorSnippets.class, "checkCounter"); this.counters = new Counters(factory); - this.requiresStrictLockOrder = providers.getPlatformConfigurationProvider().requiresStrictLockOrder(); } - public void lower(CheckFastPathMonitorEnterNode checkFastPathMonitorEnterNode, HotSpotRegistersProvider registers, GraalHotSpotVMConfig config, LoweringTool tool) { - GraalError.guarantee(HotSpotReplacementsUtil.useLightweightLocking(config), "should only be used with lightweight locking"); - + public void lower(CheckFastPathMonitorEnterNode checkFastPathMonitorEnterNode, HotSpotRegistersProvider registers, LoweringTool tool) { StructuredGraph graph = checkFastPathMonitorEnterNode.graph(); Arguments args = new Arguments(checkMonitorenter, graph.getGuardsStage(), tool.getLoweringStage()); // Speculation.equals is too weak so it can incorrectly cache snippet graphs so just @@ -885,20 +720,18 @@ private static boolean isVirtualLock(FrameState frameState, int lockIdx) { return false; } - private boolean verifyLockOrder(MonitorEnterNode monitorenterNode) { - if (requiresStrictLockOrder) { - FrameState state = monitorenterNode.stateAfter(); - boolean subsequentLocksMustBeEliminated = false; - for (int lockIdx = 0; lockIdx < state.locksSize(); lockIdx++) { - if (subsequentLocksMustBeEliminated) { - if (!isVirtualLock(state, lockIdx)) { - return false; - } - } - if (state.monitorIdAt(lockIdx) == monitorenterNode.getMonitorId()) { - subsequentLocksMustBeEliminated = true; + private static boolean verifyLockOrder(MonitorEnterNode monitorenterNode) { + FrameState state = monitorenterNode.stateAfter(); + boolean subsequentLocksMustBeEliminated = false; + for (int lockIdx = 0; lockIdx < state.locksSize(); lockIdx++) { + if (subsequentLocksMustBeEliminated) { + if (!isVirtualLock(state, lockIdx)) { + return false; } } + if (state.monitorIdAt(lockIdx) == monitorenterNode.getMonitorId()) { + subsequentLocksMustBeEliminated = true; + } } return true; } @@ -943,7 +776,7 @@ public static boolean isTracingEnabledForType(ValueNode object) { if (filter == null) { return false; } else { - if (filter.length() == 0) { + if (filter.isEmpty()) { return true; } if (type == null) { @@ -958,7 +791,7 @@ public static boolean isTracingEnabledForMethod(StructuredGraph graph) { if (filter == null) { return false; } else { - if (filter.length() == 0) { + if (filter.isEmpty()) { return true; } if (graph.method() == null) { diff --git a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_misc_ScopedMemoryAccess.java b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_misc_ScopedMemoryAccess.java index dbf5078e46a8..911f9e50456d 100644 --- a/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_misc_ScopedMemoryAccess.java +++ b/substratevm/src/com.oracle.svm.core.foreign/src/com/oracle/svm/core/foreign/Target_jdk_internal_misc_ScopedMemoryAccess.java @@ -199,7 +199,7 @@ public void forceInternal(MemorySessionImpl session, MappedMemoryUtilsProxy mapp * {@link SyncCloseScopeOperation}) is essentially an empty operation but kills the field * location of {@link Target_jdk_internal_foreign_MemorySessionImpl#state}. */ - @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+20/src/hotspot/share/prims/scopedMemoryAccess.cpp#L215-L218") + @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/prims/scopedMemoryAccess.cpp#L215-L218") @SuppressWarnings("static-method") @Substitute @TargetElement(onlyWith = SharedArenasEnabled.class) diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AdaptiveCollectionPolicy.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AdaptiveCollectionPolicy.java index 9d83e35ef955..ccef7cb2a6fa 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AdaptiveCollectionPolicy.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AdaptiveCollectionPolicy.java @@ -50,7 +50,7 @@ @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+1/src/hotspot/share/gc/parallel/psAdaptiveSizePolicy.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+20/src/hotspot/share/gc/parallel/psAdaptiveSizePolicy.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+25/src/hotspot/share/gc/parallel/psParallelCompact.cpp#L964-L1181") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+25/src/hotspot/share/gc/parallel/psScavenge.cpp#L319-L635") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/gc/parallel/psScavenge.cpp#L319-L634") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-25+26/src/hotspot/share/gc/shared/gc_globals.hpp#L303-L407") class AdaptiveCollectionPolicy extends AbstractCollectionPolicy { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/aarch64/AArch64LibCHelper.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/aarch64/AArch64LibCHelper.java index 86c549c9dfff..14e0f6dfd261 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/aarch64/AArch64LibCHelper.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/aarch64/AArch64LibCHelper.java @@ -139,6 +139,10 @@ public interface CPUFeatures extends PointerBase { @AllowNarrowingCast @CField boolean fASIMDHP(); + + @AllowNarrowingCast + @CField + boolean fSB(); } // Checkstyle: resume } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java index 0d5021fed17e..d7cd5b301ad5 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/container/ContainerLibrary.java @@ -60,25 +60,25 @@ @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/cgroupV2Subsystem_linux.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/osContainer_linux.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/osContainer_linux.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.cpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/os/linux/os_linux.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/linux/os_linux.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/include/jvm_md.h") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+2/src/hotspot/os/posix/os_posix.cpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/os/posix/os_posix.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/os_posix.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/os/posix/os_posix.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allStatic.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/nmt/memTag.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.cpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/nmt/memTag.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/runtime/os.cpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/runtime/os.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/os.inline.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/checkedCast.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/compilerWarnings_gcc.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/compilerWarnings.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/globalDefinitions_gcc.hpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/globalDefinitions.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/utilities/globalDefinitions.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/macros.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/ostream.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/ostream.hpp") @@ -86,7 +86,7 @@ // The following annotations are for files in `src/svm`, which are completely customized for SVM @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/logging/log.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/memory/allocation.cpp") -@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/runtime/globals.hpp") +@BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+5/src/hotspot/share/runtime/globals.hpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+3/src/hotspot/share/utilities/debug.cpp") @BasedOnJDKFile("https://github.com/openjdk/jdk/blob/jdk-26+4/src/hotspot/share/utilities/debug.hpp") public class ContainerLibrary { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/util/IdentityHashCodeUtil.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/util/IdentityHashCodeUtil.java index 8fa1b77b6bc7..759b73b6f283 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/util/IdentityHashCodeUtil.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/util/IdentityHashCodeUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 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 @@ -117,13 +117,7 @@ private static int readIdentityHashCode(long markWord) { * See HotSpotHashCodeSnippets for explanation. */ long lockBits = markWord & config.markWordLockMaskInPlace; - boolean containsHashCode; - if (config.lockingMode == config.lockingModeLightweight) { - containsHashCode = lockBits != config.monitorValue; - } else { - containsHashCode = lockBits == config.unlockedValue; - } - if (containsHashCode) { + if (lockBits != config.monitorValue) { int hashcode = (int) ((markWord & hashCodeMask) >>> config.markWordHashCodeShift); if (hashcode == config.uninitializedIdentityHashCodeValue) { return UNINITIALIZED; diff --git a/substratevm/src/com.oracle.svm.native.libchelper/include/aarch64cpufeatures.h b/substratevm/src/com.oracle.svm.native.libchelper/include/aarch64cpufeatures.h index a6092e4a05a9..4bbd44f63fdf 100644 --- a/substratevm/src/com.oracle.svm.native.libchelper/include/aarch64cpufeatures.h +++ b/substratevm/src/com.oracle.svm.native.libchelper/include/aarch64cpufeatures.h @@ -48,4 +48,5 @@ typedef struct { uint8_t fSVEBITPERM; uint8_t fFPHP; uint8_t fASIMDHP; + uint8_t fSB; } CPUFeatures; diff --git a/substratevm/src/com.oracle.svm.native.libchelper/src/cpuid.c b/substratevm/src/com.oracle.svm.native.libchelper/src/cpuid.c index 193fb145c62d..2316e248fc02 100644 --- a/substratevm/src/com.oracle.svm.native.libchelper/src/cpuid.c +++ b/substratevm/src/com.oracle.svm.native.libchelper/src/cpuid.c @@ -690,6 +690,7 @@ void determineCPUFeatures(CPUFeatures* features) { features->fLSE = !!(cpu_has("hw.optional.arm.FEAT_LSE")) | !!(cpu_has("hw.optional.armv8_1_atomics")); features->fSHA512 = !!(cpu_has("hw.optional.arm.FEAT_SHA512")) | !!(cpu_has("hw.optional.armv8_2_sha512")); features->fSHA3 = !!(cpu_has("hw.optional.arm.FEAT_SHA3")) | !!(cpu_has("hw.optional.armv8_2_sha3")); + features->fSB = !!(cpu_has("hw.optional.arm.FEAT_SB")); // Not (yet) checked in the Hotspot code. features->fDCPOP = 0; features->fSVE = 0; @@ -751,6 +752,9 @@ void determineCPUFeatures(CPUFeatures* features) { #ifndef HWCAP_SVE #define HWCAP_SVE (1L << 22) #endif +#ifndef HWCAP_SB +#define HWCAP_SB (1L << 29) +#endif #ifndef HWCAP_PACA #define HWCAP_PACA (1L << 30) #endif @@ -795,6 +799,7 @@ void determineCPUFeatures(CPUFeatures* features) { features->fSTXR_PREFETCH = 0; features->fA53MAC = 0; features->fDMB_ATOMICS = 0; + features->fSB = !!(auxv & HWCAP_SB); features->fPACA = !!(auxv & HWCAP_PACA); features->fSVEBITPERM = !!(auxv2 & HWCAP2_SVEBITPERM); features->fFPHP = !!(auxv & HWCAP_FPHP);