[clang] [Mips] Fix wrong qNaN encoding when -mnan=legacy (PR #153777)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 8 18:50:20 PDT 2025
https://github.com/yingopq updated https://github.com/llvm/llvm-project/pull/153777
>From a1d7d8c7ce5ea46a15b95be5461f094e2cb57227 Mon Sep 17 00:00:00 2001
From: Ying Huang <ying.huang at oss.cipunited.com>
Date: Fri, 15 Aug 2025 05:57:33 -0400
Subject: [PATCH] [Mips] Convert -mnan=legacy to nan2008 when architecture
support nan2008
Because we now do not really support legacy, so let us do the following:
a. Convert -mnan=legacy to nan2008 when architecture support nan2008;
b. Ignore -mnan=legacy when architecture does not support nan2008;
c. All the above report a warning.
Fix #100495.
---
clang/include/clang/Basic/DiagnosticDriverKinds.td | 4 ++++
clang/lib/Driver/ToolChains/Arch/Mips.cpp | 9 ++++++---
clang/test/CodeGen/builtin-nan-legacy.c | 4 ++--
clang/test/CodeGen/mips-unsupported-nan.c | 4 ++--
clang/test/Driver/mips-as.c | 2 +-
clang/test/Driver/mips-features.c | 5 ++---
clang/test/Driver/mips-integrated-as.s | 4 +---
7 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 0f17f4aa761ea..620c2cab2707b 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -620,6 +620,10 @@ def warn_target_unsupported_nan2008 : Warning<
def warn_target_unsupported_nanlegacy : Warning<
"ignoring '-mnan=legacy' option because the '%0' architecture does not support it">,
InGroup<UnsupportedNan>;
+def warn_target_unsupported_convertnanlegacytonan2008 : Warning<
+ "ignoring '-mnan=legacy' option because now we does not support it and set to `-mnan=2008` "
+ "option because the '%0' architecture support it">,
+ InGroup<UnsupportedNan>;
def warn_target_unsupported_abslegacy : Warning<
"ignoring '-mabs=legacy' option because the '%0' architecture does not support it">,
InGroup<UnsupportedAbs>;
diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
index 8787c8276721c..768612c656926 100644
--- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
@@ -301,10 +301,13 @@ void mips::getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
}
} else if (Val == "legacy") {
- if (mips::getIEEE754Standard(CPUName) & mips::Legacy)
- Features.push_back("-nan2008");
- else {
+ if (mips::getIEEE754Standard(CPUName) & mips::Std2008) {
Features.push_back("+nan2008");
+ HasNaN2008Opt = true;
+ D.Diag(diag::warn_target_unsupported_convertnanlegacytonan2008)
+ << CPUName;
+ } else {
+ Features.push_back("-nan2008");
D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
}
} else
diff --git a/clang/test/CodeGen/builtin-nan-legacy.c b/clang/test/CodeGen/builtin-nan-legacy.c
index de6c15379a4dd..9db374f7fbbde 100644
--- a/clang/test/CodeGen/builtin-nan-legacy.c
+++ b/clang/test/CodeGen/builtin-nan-legacy.c
@@ -1,6 +1,6 @@
// RUN: %clang -target mipsel-unknown-linux -mnan=legacy -emit-llvm -S %s -o - | FileCheck %s
-// CHECK: float 0x7FFC000000000000, float 0x7FF8000000000000
-// CHECK: double 0x7FF4000000000000, double 0x7FF8000000000000
+// CHECK: float 0x7FF8000000000000, float 0x7FFC000000000000
+// CHECK: double 0x7FF8000000000000, double 0x7FF4000000000000
// The first line shows an unintended consequence.
// __builtin_nan() creates a legacy QNAN double with an empty payload
diff --git a/clang/test/CodeGen/mips-unsupported-nan.c b/clang/test/CodeGen/mips-unsupported-nan.c
index 16cea3c2e7e18..3b426f3d842e9 100644
--- a/clang/test/CodeGen/mips-unsupported-nan.c
+++ b/clang/test/CodeGen/mips-unsupported-nan.c
@@ -35,9 +35,9 @@
// CHECK-MIPS3: warning: ignoring '-mnan=2008' option because the 'mips3' architecture does not support it
// CHECK-MIPS4: warning: ignoring '-mnan=2008' option because the 'mips4' architecture does not support it
// CHECK-MIPS32: warning: ignoring '-mnan=2008' option because the 'mips32' architecture does not support it
-// CHECK-MIPS32R6: warning: ignoring '-mnan=legacy' option because the 'mips32r6' architecture does not support it
+// CHECK-MIPS32R6: warning: ignoring '-mnan=legacy' option because now we does not support it and set to `-mnan=2008` option because the 'mips32r6' architecture support it
// CHECK-MIPS64: warning: ignoring '-mnan=2008' option because the 'mips64' architecture does not support it
-// CHECK-MIPS64R6: warning: ignoring '-mnan=legacy' option because the 'mips64r6' architecture does not support it
+// CHECK-MIPS64R6: warning: ignoring '-mnan=legacy' option because now we does not support it and set to `-mnan=2008` option because the 'mips64r6' architecture support it
// This call creates a QNAN double with an empty payload.
// The quiet bit is inverted in legacy mode: it is clear to indicate QNAN,
diff --git a/clang/test/Driver/mips-as.c b/clang/test/Driver/mips-as.c
index fc366f529ffbb..e009420c37052 100644
--- a/clang/test/Driver/mips-as.c
+++ b/clang/test/Driver/mips-as.c
@@ -246,7 +246,7 @@
// RUN: -fno-integrated-as -fno-pic -c %s 2>&1 \
// RUN: | FileCheck -check-prefix=MIPS-NAN-LEGACY %s
// MIPS-NAN-LEGACY: as{{(.exe)?}}"
-// MIPS-NAN-LEGACY-NOT: "{{[ A-Za-z\\\/]*}}as{{(.exe)?}}{{.*}}"-mnan={{.*}}"
+// MIPS-NAN-LEGACY: "-target-feature" "+nan2008" "-target-feature" "+abs2008"
//
// RUN: %clang --target=mips-linux-gnu -mfp64 -mfpxx -mfp32 -### \
// RUN: -fno-integrated-as -fno-pic -c %s 2>&1 \
diff --git a/clang/test/Driver/mips-features.c b/clang/test/Driver/mips-features.c
index ee370051d1ebe..cbfae9e8f4030 100644
--- a/clang/test/Driver/mips-features.c
+++ b/clang/test/Driver/mips-features.c
@@ -227,11 +227,10 @@
// RUN: | FileCheck --check-prefix=CHECK-ABSLEGACYNAN2008 %s
// CHECK-ABSLEGACYNAN2008: "-target-feature" "+nan2008" "-target-feature" "-abs2008"
//
-// -mnan=legacy
+// -mnan=2008
// RUN: %clang --target=mips-linux-gnu -march=mips32r3 -### -c %s \
// RUN: -mnan=2008 -mnan=legacy 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-NANLEGACY %s
-// CHECK-NANLEGACY: "-target-feature" "-nan2008"
+// RUN: | FileCheck --check-prefix=CHECK-NAN2008 %s
//
// -mabs=2008 on pre R2
// RUN: %clang --target=mips-linux-gnu -march=mips32 -### -c %s \
diff --git a/clang/test/Driver/mips-integrated-as.s b/clang/test/Driver/mips-integrated-as.s
index 1714596acca98..5815080b79ee1 100644
--- a/clang/test/Driver/mips-integrated-as.s
+++ b/clang/test/Driver/mips-integrated-as.s
@@ -58,9 +58,7 @@
// NAN-DEFAULT-NOT: "-target-feature" "{{[-+]}}nan2008"
// RUN: %clang --target=mips-linux-gnu -### -fintegrated-as -c %s -mnan=legacy 2>&1 | \
-// RUN: FileCheck -check-prefix=NAN-LEGACY %s
-// NAN-LEGACY: -cc1as
-// NAN-LEGACY: "-target-feature" "-nan2008"
+// RUN: FileCheck -check-prefix=NAN-2008 %s
// RUN: %clang --target=mips-linux-gnu -march=mips32r6 -### -fintegrated-as -c %s -mnan=2008 2>&1 | \
// RUN: FileCheck -check-prefix=NAN-2008 %s
More information about the cfe-commits
mailing list