[llvm] [KnownFPClass] Add `KnownFPClass::frem` [NFC] (PR #218949)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 26 08:06:57 PDT 2026
https://github.com/ZERICO2005 created https://github.com/llvm/llvm-project/pull/218949
Follow up to https://github.com/llvm/llvm-project/pull/218726
Moves `frem` deduction logic from `Analysis/ValueTracking.cpp` and `CodeGen/GlobalISel/GISelValueTracking.cpp` to `KnownFPClass::frem`.
>From 263e42d4594377e4fe05d0643d3a41fa77bbee12 Mon Sep 17 00:00:00 2001
From: zerico <zerico2005 at gmail.com>
Date: Tue, 25 Aug 2026 11:17:47 -0600
Subject: [PATCH] [KnownFPClass] Add KnownFPClass::frem [NFC]
---
llvm/include/llvm/Support/KnownFPClass.h | 5 ++++
llvm/lib/Analysis/ValueTracking.cpp | 19 +-----------
.../CodeGen/GlobalISel/GISelValueTracking.cpp | 19 +-----------
llvm/lib/Support/KnownFPClass.cpp | 30 +++++++++++++++++++
4 files changed, 37 insertions(+), 36 deletions(-)
diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index fd9e68b2475bb..32a6515987d87 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -291,6 +291,11 @@ struct KnownFPClass {
/// Report known values for frem
LLVM_ABI static KnownFPClass
+ frem(const KnownFPClass &LHS, const KnownFPClass &RHS,
+ DenormalMode Mode = DenormalMode::getDynamic());
+
+ /// Report known values for frem x, x
+ LLVM_ABI static KnownFPClass
frem_self(const KnownFPClass &Src,
DenormalMode Mode = DenormalMode::getDynamic());
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 3df80238e638e..e028768f3a487 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6022,24 +6022,7 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
computeKnownFPClass(Op->getOperand(0), DemandedElts, fcAllFlags, KnownLHS,
Q, Depth + 1);
- // Inf REM x and x REM 0 produce NaN.
- if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
- KnownLHS.isKnownNeverInfinity() &&
- KnownRHS.isKnownNeverLogicalZero(Mode)) {
- Known.knownNot(fcNan);
- }
-
- // The sign for frem is the same as the first operand.
- if (KnownLHS.cannotBeOrderedLessThanZero())
- Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
- if (KnownLHS.cannotBeOrderedGreaterThanZero())
- Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
-
- // See if we can be more aggressive about the sign of 0.
- if (KnownLHS.isKnownNever(fcNegative))
- Known.knownNot(fcNegative);
- if (KnownLHS.isKnownNever(fcPositive))
- Known.knownNot(fcPositive);
+ Known = KnownFPClass::frem(KnownLHS, KnownRHS, Mode);
break;
}
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index f288eadf82e3c..8dbb0c5f04ee2 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -1904,24 +1904,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
if (KnowSomethingUseful || WantPositive)
computeKnownFPClass(LHS, DemandedElts, fcAllFlags, KnownLHS, Depth + 1);
- // Inf REM x and x REM 0 produce NaN.
- if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
- KnownLHS.isKnownNeverInfinity() &&
- KnownRHS.isKnownNeverLogicalZero(Mode)) {
- Known.knownNot(fcNan);
- }
-
- // The sign for frem is the same as the first operand.
- if (KnownLHS.cannotBeOrderedLessThanZero())
- Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
- if (KnownLHS.cannotBeOrderedGreaterThanZero())
- Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
-
- // See if we can be more aggressive about the sign of 0.
- if (KnownLHS.isKnownNever(fcNegative))
- Known.knownNot(fcNegative);
- if (KnownLHS.isKnownNever(fcPositive))
- Known.knownNot(fcPositive);
+ Known = KnownFPClass::frem(KnownLHS, KnownRHS, Mode);
break;
}
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index 2680abaddfc12..09bb9c5538a34 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -502,6 +502,36 @@ KnownFPClass KnownFPClass::fdiv_self(const KnownFPClass &KnownSrc,
return Known;
}
+
+KnownFPClass KnownFPClass::frem(const KnownFPClass &KnownLHS,
+ const KnownFPClass &KnownRHS,
+ DenormalMode Mode) {
+ KnownFPClass Known;
+
+ Known.knownNot(fcInf);
+
+ // Inf REM x and x REM 0 produce NaN.
+ if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
+ KnownLHS.isKnownNeverInfinity() &&
+ KnownRHS.isKnownNeverLogicalZero(Mode)) {
+ Known.knownNot(fcNan);
+ }
+
+ // The sign for frem is the same as the first operand.
+ if (KnownLHS.cannotBeOrderedLessThanZero())
+ Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
+ if (KnownLHS.cannotBeOrderedGreaterThanZero())
+ Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
+
+ // See if we can be more aggressive about the sign of 0.
+ if (KnownLHS.isKnownNever(fcNegative))
+ Known.knownNot(fcNegative);
+ if (KnownLHS.isKnownNever(fcPositive))
+ Known.knownNot(fcPositive);
+
+ return Known;
+}
+
KnownFPClass KnownFPClass::frem_self(const KnownFPClass &KnownSrc,
DenormalMode Mode) {
// X % X is always exactly [+-]0.0 or a NaN.
More information about the llvm-commits
mailing list