[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