From 08b2df80c68e182fbf6b1fc94e991c02b23040ec Mon Sep 17 00:00:00 2001 From: Doug Simon Date: Tue, 13 May 2025 15:58:59 +0000 Subject: [PATCH] 8356447: Change default for EagerJVMCI to true Reviewed-by: yzheng, kvn, never --- src/hotspot/share/jvmci/jvmciCompilerToVM.cpp | 7 ++++++- src/hotspot/share/jvmci/jvmci_globals.cpp | 1 + src/hotspot/share/jvmci/jvmci_globals.hpp | 3 ++- .../jdk/vm/ci/hotspot/CompilerToVM.java | 5 +++++ .../ci/hotspot/HotSpotJVMCICompilerConfig.java | 18 +++++++++++++++++- .../jvmci/TestJVMCIPrintProperties.java | 1 + 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index a4a8f3bb1d0..b4b8150917d 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -3231,7 +3231,11 @@ C2V_END C2V_VMENTRY_0(jint, getCompilationActivityMode, (JNIEnv* env, jobject)) return CompileBroker::get_compilation_activity_mode(); -} +C2V_END + +C2V_VMENTRY_0(jboolean, isCompilerThread, (JNIEnv* env, jobject)) + return thread->is_Compiler_thread(); +C2V_END #define CC (char*) /*cast a literal from (const char*)*/ #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f)) @@ -3396,6 +3400,7 @@ JNINativeMethod CompilerToVM::methods[] = { {CC "getOopMapAt", CC "(" HS_METHOD2 "I[J)V", FN_PTR(getOopMapAt)}, {CC "updateCompilerThreadCanCallJava", CC "(Z)Z", FN_PTR(updateCompilerThreadCanCallJava)}, {CC "getCompilationActivityMode", CC "()I", FN_PTR(getCompilationActivityMode)}, + {CC "isCompilerThread", CC "()Z", FN_PTR(isCompilerThread)}, }; int CompilerToVM::methods_count() { diff --git a/src/hotspot/share/jvmci/jvmci_globals.cpp b/src/hotspot/share/jvmci/jvmci_globals.cpp index d4d52afd069..d5a23a59982 100644 --- a/src/hotspot/share/jvmci/jvmci_globals.cpp +++ b/src/hotspot/share/jvmci/jvmci_globals.cpp @@ -86,6 +86,7 @@ bool JVMCIGlobals::check_jvmci_flags_are_consistent() { return false; } FLAG_SET_DEFAULT(EnableJVMCI, true); + FLAG_SET_ERGO_IF_DEFAULT(EagerJVMCI, true); } if (EnableJVMCI) { diff --git a/src/hotspot/share/jvmci/jvmci_globals.hpp b/src/hotspot/share/jvmci/jvmci_globals.hpp index 5bcead9ff7b..fc1607b8393 100644 --- a/src/hotspot/share/jvmci/jvmci_globals.hpp +++ b/src/hotspot/share/jvmci/jvmci_globals.hpp @@ -88,7 +88,8 @@ class fileStream; "-XX:-TieredCompilation makes JVMCI compile more of itself.") \ \ product(bool, EagerJVMCI, false, EXPERIMENTAL, \ - "Force eager JVMCI initialization") \ + "Force eager JVMCI initialization. Defaults to true if " \ + "UseJVMCICompiler is true.") \ \ product(bool, PrintBootstrap, true, EXPERIMENTAL, \ "Print JVMCI bootstrap progress and summary") \ diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/CompilerToVM.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/CompilerToVM.java index 9c64126c62d..d7356659296 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/CompilerToVM.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/CompilerToVM.java @@ -1528,4 +1528,9 @@ final class CompilerToVM { * {@code stop_compilation = 0}, {@code run_compilation = 1} or {@code shutdown_compilation = 2} */ native int getCompilationActivityMode(); + + /** + * Returns whether the current thread is a CompilerThread. + */ + native boolean isCompilerThread(); } diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCICompilerConfig.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCICompilerConfig.java index d4c824f6a27..8767531451b 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCICompilerConfig.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/hotspot/HotSpotJVMCICompilerConfig.java @@ -51,11 +51,27 @@ final class HotSpotJVMCICompilerConfig { DummyCompilerFactory(String reason, HotSpotJVMCIRuntime runtime) { this.reason = reason; this.runtime = runtime; + if (runtime.getConfig().getFlag("EagerJVMCI", Boolean.class)) { + if (runtime.getCompilerToVM().isCompilerThread()) { + throw noCompilerError(); + } else { + // This path will be taken when initializing JVMCI on a non-JIT thread. + // Such a usage of JVMCI might never request a compilation so delay the + // noCompilerError until such a request is made. + } + } + } + + /** + * Exits the VM due to unavailability of a JVMCI compiler. + */ + Error noCompilerError() { + throw runtime.exitHotSpotWithMessage(1, "Cannot use JVMCI compiler: %s%n", reason); } @Override public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) { - throw runtime.exitHotSpotWithMessage(1, "Cannot use JVMCI compiler: %s%n", reason); + throw noCompilerError(); } @Override diff --git a/test/hotspot/jtreg/compiler/jvmci/TestJVMCIPrintProperties.java b/test/hotspot/jtreg/compiler/jvmci/TestJVMCIPrintProperties.java index e58bc4df169..1d76655382d 100644 --- a/test/hotspot/jtreg/compiler/jvmci/TestJVMCIPrintProperties.java +++ b/test/hotspot/jtreg/compiler/jvmci/TestJVMCIPrintProperties.java @@ -45,6 +45,7 @@ public class TestJVMCIPrintProperties { ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder( "-XX:+UnlockExperimentalVMOptions", enableFlag, "-Djvmci.Compiler=null", + "-XX:-EagerJVMCI", "-XX:+JVMCIPrintProperties"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); output.shouldContain("[JVMCI properties]"); // expected message