[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