From 21cda33d64f3ec3c50e9a8629633f8aad82d5f87 Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Fri, 6 Jun 2025 13:29:32 -0700 Subject: [PATCH 1/6] Fix assertion failures for libm math intrinsics that don't have shared runtime implementations --- src/hotspot/share/classfile/vmIntrinsics.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index 6fd5c07e13702..70950cc1b5a74 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -255,6 +255,18 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { } } + // -XX:UseLibmIntrinsic or -XX:-InlineIntrinsics disables all intrinsics + // listed in the following switch statement + if (!UseLibmIntrinsic || !InlineIntrinsics) { + switch (id) { + case vmIntrinsics::_dtanh: + case vmIntrinsics::_dcbrt: + return true; + default: + break; + } + } + switch (id) { case vmIntrinsics::_isInstance: case vmIntrinsics::_isAssignableFrom: From c11f54e1f273ca41d5da70251853f5cd6403c800 Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Fri, 6 Jun 2025 14:06:54 -0700 Subject: [PATCH 2/6] Move UseLibmIntrinsic flag to x86 portion of code base to avoid build breaks --- .../cpu/x86/templateInterpreterGenerator_x86_64.cpp | 7 +++++++ src/hotspot/share/classfile/vmIntrinsics.cpp | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp b/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp index 9ea4aeeccfa3b..1d284471d4405 100644 --- a/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp +++ b/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp @@ -396,6 +396,13 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M // [ hi(arg) ] // + if (!UseLibmIntrinsic) { + if (kind == Interpreter::java_lang_math_tanh || + kind == Interpreter::java_lang_math_cbrt) { + return nullptr; // Fallback to default implementation + } + } + if (kind == Interpreter::java_lang_math_fmaD) { if (!UseFMA) { return nullptr; // Generate a vanilla entry diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index 70950cc1b5a74..d9b0fa0922cca 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -255,9 +255,9 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { } } - // -XX:UseLibmIntrinsic or -XX:-InlineIntrinsics disables all intrinsics - // listed in the following switch statement - if (!UseLibmIntrinsic || !InlineIntrinsics) { + // -XX:-InlineIntrinsics disables all intrinsics listed in the following + // switch statement + if (!InlineIntrinsics) { switch (id) { case vmIntrinsics::_dtanh: case vmIntrinsics::_dcbrt: From 8dadb41cd9e7248450c398412397a97b40f0292b Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Fri, 6 Jun 2025 16:28:34 -0700 Subject: [PATCH 3/6] Re-structure logic to avoid reliance on UseLibmIntrinsic flag as others could be used later on --- .../templateInterpreterGenerator_x86_64.cpp | 21 +++++++++---------- src/hotspot/share/classfile/vmIntrinsics.cpp | 18 ++++------------ 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp b/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp index 1d284471d4405..46af93e97607c 100644 --- a/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp +++ b/src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp @@ -396,13 +396,6 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M // [ hi(arg) ] // - if (!UseLibmIntrinsic) { - if (kind == Interpreter::java_lang_math_tanh || - kind == Interpreter::java_lang_math_cbrt) { - return nullptr; // Fallback to default implementation - } - } - if (kind == Interpreter::java_lang_math_fmaD) { if (!UseFMA) { return nullptr; // Generate a vanilla entry @@ -472,13 +465,19 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M __ call_VM_leaf0(CAST_FROM_FN_PTR(address, SharedRuntime::dtan)); } } else if (kind == Interpreter::java_lang_math_tanh) { - assert(StubRoutines::dtanh() != nullptr, "not initialized"); + if (StubRoutines::dtanh() != nullptr) { __ movdbl(xmm0, Address(rsp, wordSize)); __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dtanh()))); + } else { + return nullptr; // Fallback to default implementation + } } else if (kind == Interpreter::java_lang_math_cbrt) { - assert(StubRoutines::dcbrt() != nullptr, "not initialized"); - __ movdbl(xmm0, Address(rsp, wordSize)); - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcbrt()))); + if (StubRoutines::dcbrt() != nullptr) { + __ movdbl(xmm0, Address(rsp, wordSize)); + __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dcbrt()))); + } else { + return nullptr; // Fallback to default implementation + } } else if (kind == Interpreter::java_lang_math_abs) { assert(StubRoutines::x86::double_sign_mask() != nullptr, "not initialized"); __ movdbl(xmm0, Address(rsp, wordSize)); diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index d9b0fa0922cca..0d18d3eed9727 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -255,18 +255,6 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { } } - // -XX:-InlineIntrinsics disables all intrinsics listed in the following - // switch statement - if (!InlineIntrinsics) { - switch (id) { - case vmIntrinsics::_dtanh: - case vmIntrinsics::_dcbrt: - return true; - default: - break; - } - } - switch (id) { case vmIntrinsics::_isInstance: case vmIntrinsics::_isAssignableFrom: @@ -301,8 +289,6 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { case vmIntrinsics::_dsin: case vmIntrinsics::_dcos: case vmIntrinsics::_dtan: - case vmIntrinsics::_dtanh: - case vmIntrinsics::_dcbrt: case vmIntrinsics::_dlog: case vmIntrinsics::_dexp: case vmIntrinsics::_dpow: @@ -328,6 +314,10 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { case vmIntrinsics::_fmaF: if (!InlineMathNatives || !UseFMA) return true; break; + case vmIntrinsics::_dtanh: + case vmIntrinsics::_dcbrt: + if (!InlineMathNatives) return true; + break; case vmIntrinsics::_floatToFloat16: case vmIntrinsics::_float16ToFloat: if (!InlineIntrinsics) return true; From b887243cb3871dac9675f3c6044cad797590f574 Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Fri, 6 Jun 2025 17:54:06 -0700 Subject: [PATCH 4/6] Add extra check for InlineIntrinscs flag --- src/hotspot/share/classfile/vmIntrinsics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index 0d18d3eed9727..25a6c02471770 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -316,7 +316,7 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { break; case vmIntrinsics::_dtanh: case vmIntrinsics::_dcbrt: - if (!InlineMathNatives) return true; + if (!InlineMathNatives || !InlineIntrinsics) return true; break; case vmIntrinsics::_floatToFloat16: case vmIntrinsics::_float16ToFloat: From aff9ca096de04af51b1357582816102269737de3 Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Mon, 9 Jun 2025 13:37:00 -0700 Subject: [PATCH 5/6] Include check for UseLibmIntrinsic flag but restrict to x86 platforms --- src/hotspot/share/classfile/vmIntrinsics.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index 25a6c02471770..e330bd77e6a68 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -317,6 +317,9 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { case vmIntrinsics::_dtanh: case vmIntrinsics::_dcbrt: if (!InlineMathNatives || !InlineIntrinsics) return true; +#ifdef AMD64 + if (!UseLibmIntrinsic) return true; +#endif break; case vmIntrinsics::_floatToFloat16: case vmIntrinsics::_float16ToFloat: From fa21605fe7d5acb401c2e7b36431dc9a28fa6d99 Mon Sep 17 00:00:00 2001 From: Mohamed Issa Date: Mon, 9 Jun 2025 17:47:39 -0700 Subject: [PATCH 6/6] Add guard preprocessors to ensure HotSpot Zero JVM builds don't fail --- src/hotspot/share/classfile/vmIntrinsics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/classfile/vmIntrinsics.cpp b/src/hotspot/share/classfile/vmIntrinsics.cpp index e330bd77e6a68..baa945cdddf1c 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.cpp +++ b/src/hotspot/share/classfile/vmIntrinsics.cpp @@ -317,7 +317,7 @@ bool vmIntrinsics::disabled_by_jvm_flags(vmIntrinsics::ID id) { case vmIntrinsics::_dtanh: case vmIntrinsics::_dcbrt: if (!InlineMathNatives || !InlineIntrinsics) return true; -#ifdef AMD64 +#if defined(AMD64) && (defined(COMPILER1) || defined(COMPILER2)) if (!UseLibmIntrinsic) return true; #endif break;