From ce38699dfae3d55b2c0056f26312f658f6193e0a Mon Sep 17 00:00:00 2001 From: Alexander Zakharenko Date: Thu, 3 Aug 2023 18:39:03 +0200 Subject: [PATCH] [K/N] Fix of NaN normalization for arm64 --- .../org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 05fee14aaad..170a71374e9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1855,9 +1855,12 @@ internal class CodeGeneratorVisitor( * * So for now, we would just normalize all NaN constants. At least this leads to predictable result * useful in almost all cases. + * + * Also, java.lang classes are used here to avoid unexpected NaN values if a compiler and stdlib + * are built in an arm64 architecture environment. */ - private fun Float.normalizeNan() = if (isNaN()) Float.NaN else this - private fun Double.normalizeNan() = if (isNaN()) Double.NaN else this + private fun Float.normalizeNan() = if (isNaN()) java.lang.Float.NaN else this + private fun Double.normalizeNan() = if (isNaN()) java.lang.Double.NaN else this private fun evaluateConst(value: IrConst<*>): ConstValue { context.log{"evaluateConst : ${ir2string(value)}"}