[llvm] [KnownFPClass] Remove `propagateNonNan` `PreserveSign` parameter (PR #219841)

via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 30 12:46:31 PDT 2026


https://github.com/ZERICO2005 created https://github.com/llvm/llvm-project/pull/219841

`void propagateNonNaN(const KnownFPClass &Src, bool PreserveSign = false)`
The `PreserveSign` function does not do what you expect (I thought it would copy the signbit of NaN). It will copy `Src.SignBit` if and only if `Src` is never NaN, which is counterintuitive. It also does not properly update `KnownFPClasses`. I have removed `void propagateNonNaN(const KnownFPClass &Src, bool PreserveSign = false)` and replaced it with just `void propagateNonNaN(const KnownFPClass &Src)`.

This fixes https://github.com/llvm/llvm-project/issues/217127

I discovered this while working on https://github.com/llvm/llvm-project/pull/218514


>From 4380c5cb5f679496c77f83f6f5e7d44ff01f2a7b Mon Sep 17 00:00:00 2001
From: zerico <zerico2005 at gmail.com>
Date: Sun, 30 Aug 2026 13:44:01 -0600
Subject: [PATCH] [KnownFPClass] Remove propagateNonNan PreserveSign parameter

---
 llvm/include/llvm/Support/KnownFPClass.h               | 7 ++-----
 llvm/lib/Support/KnownFPClass.cpp                      | 8 ++++----
 llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp | 4 ++--
 3 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index 32a6515987d87..5dcc5d5d59e9b 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -412,13 +412,10 @@ struct KnownFPClass {
   // Propagate knowledge that a non-NaN source implies the result can also not
   // be a NaN. For unconstrained operations, signaling nans are not guaranteed
   // to be quieted but cannot be introduced.
-  void propagateNonNaN(const KnownFPClass &Src, bool PreserveSign = false) {
+  void propagateNonNaN(const KnownFPClass &Src) {
     propagateNonSNaN(Src);
-    if (Src.isKnownNever(fcNan)) {
+    if (Src.isKnownNever(fcNan))
       knownNot(fcNan);
-      if (PreserveSign)
-        SignBit = Src.SignBit;
-    }
   }
 
   void propagateNonNaN(const KnownFPClass &LHS, const KnownFPClass &RHS) {
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index 09bb9c5538a34..a7c632827308d 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -601,7 +601,7 @@ KnownFPClass KnownFPClass::exp(const KnownFPClass &KnownSrc) {
 void KnownFPClass::propagateCanonicalizingSrc(const KnownFPClass &Src,
                                               DenormalMode Mode) {
   propagateDenormal(Src, Mode);
-  propagateNonNaN(Src, /*PreserveSign=*/true);
+  propagateNonNaN(Src);
 }
 
 KnownFPClass KnownFPClass::log(const KnownFPClass &KnownSrc,
@@ -822,7 +822,7 @@ KnownFPClass KnownFPClass::fptrunc(const KnownFPClass &KnownSrc) {
   if (KnownSrc.cannotBeOrderedLessThanZero())
     Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
 
-  Known.propagateNonNaN(KnownSrc, true);
+  Known.propagateNonNaN(KnownSrc);
 
   // Infinity needs a range check.
   return Known;
@@ -836,7 +836,7 @@ KnownFPClass KnownFPClass::roundToIntegral(const KnownFPClass &KnownSrc,
   // Integer results cannot be subnormal.
   Known.knownNot(fcSubnormal);
 
-  Known.propagateNonNaN(KnownSrc, true);
+  Known.propagateNonNaN(KnownSrc);
 
   // Pass through infinities, except PPC_FP128 is a special case for
   // intrinsics other than trunc.
@@ -888,7 +888,7 @@ KnownFPClass KnownFPClass::ldexp(const KnownFPClass &KnownSrc,
                                  const APInt &ConstantRangeExpMax,
                                  const fltSemantics &Flt, DenormalMode Mode) {
   KnownFPClass Known;
-  Known.propagateNonNaN(KnownSrc, /*PreserveSign=*/true);
+  Known.propagateNonNaN(KnownSrc);
 
   // Sign is preserved, but underflows may produce zeroes.
   if (KnownSrc.isKnownNever(fcNegative))
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index bdd2b3faf6d5c..81f9152204f15 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -165,7 +165,7 @@ TEST_F(AArch64GISelMITest, TestFPClassCstZeroFPTrunc) {
   KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
 
   EXPECT_EQ(fcPosFinite | fcNegZero, Known.KnownFPClasses);
-  EXPECT_EQ(false, Known.SignBit);
+  EXPECT_EQ(std::nullopt, Known.SignBit);
 }
 
 TEST_F(AArch64GISelMITest, TestFPClassCstVecZeroFPTrunc) {
@@ -191,7 +191,7 @@ TEST_F(AArch64GISelMITest, TestFPClassCstVecZeroFPTrunc) {
   KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
 
   EXPECT_EQ(fcPosFinite | fcNegZero, Known.KnownFPClasses);
-  EXPECT_EQ(false, Known.SignBit);
+  EXPECT_EQ(std::nullopt, Known.SignBit);
 }
 
 TEST_F(AArch64GISelMITest, TestFPClassSelectPos0) {



More information about the llvm-commits mailing list