[llvm] [KnownFPClass] Move float-to-integer bitcast handling into KnownFPClass [NFC] (PR #218090)

via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 23 15:39:31 PDT 2026


https://github.com/ZERICO2005 updated https://github.com/llvm/llvm-project/pull/218090

>From 12a01375734c7e9196ccd6b0eb6cf2acadc64a1a Mon Sep 17 00:00:00 2001
From: zerico <zerico2005 at gmail.com>
Date: Fri, 21 Aug 2026 19:30:56 -0600
Subject: [PATCH] [KnownFPClass] Move float-to-integer bitcast handling into
 KnownFPClass [NFC]

---
 llvm/include/llvm/Support/KnownFPClass.h |  3 +++
 llvm/lib/Analysis/ValueTracking.cpp      | 28 +------------------
 llvm/lib/Support/KnownFPClass.cpp        | 34 ++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 27 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index dadf4133d826b..60b5ae3d7e5be 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -241,6 +241,9 @@ struct KnownFPClass {
   LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
                                        const KnownBits &Bits);
 
+  /// Report known bits for a float with provided semantics.
+  LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
+
   /// Report known values for fadd
   LLVM_ABI static KnownFPClass
   fadd(const KnownFPClass &LHS, const KnownFPClass &RHS,
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 92874656fe899..c38951d7027c1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -12,7 +12,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/ValueTracking.h"
-#include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/APInt.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/FloatingPointMode.h"
@@ -1526,33 +1525,8 @@ static void computeKnownBitsFromOperator(const Operator *I,
       Type *FPType = V->getType()->getScalarType();
       KnownFPClass Result =
           computeKnownFPClass(V, DemandedElts, fcAllFlags, Q, Depth + 1);
-      FPClassTest FPClasses = Result.KnownFPClasses;
 
-      // TODO: Treat it as zero/poison if the use of I is unreachable.
-      if (FPClasses == fcNone)
-        break;
-
-      if (Result.isKnownNever(fcNormal | fcSubnormal | fcNan)) {
-        Known.setAllConflict();
-
-        if (FPClasses & fcInf)
-          Known = Known.intersectWith(KnownBits::makeConstant(
-              APFloat::getInf(FPType->getFltSemantics()).bitcastToAPInt()));
-
-        if (FPClasses & fcZero)
-          Known = Known.intersectWith(KnownBits::makeConstant(
-              APInt::getZero(FPType->getScalarSizeInBits())));
-
-        Known.Zero.clearSignBit();
-        Known.One.clearSignBit();
-      }
-
-      if (Result.SignBit) {
-        if (*Result.SignBit)
-          Known.makeNegative();
-        else
-          Known.makeNonNegative();
-      }
+      Known = Result.toKnownBits(FPType->getFltSemantics());
 
       break;
     }
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index ac9406ecd0280..a80d687ba5d54 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -282,6 +282,40 @@ KnownFPClass KnownFPClass::bitcast(const fltSemantics &FltSemantics,
   return Known;
 }
 
+KnownBits
+KnownFPClass::toKnownBits(const fltSemantics &FltSemantics) const {
+  KnownBits Known(FltSemantics.sizeInBits);
+  const FPClassTest FPClasses = KnownFPClasses;
+
+  // Return unknown if poison.
+  if (FPClasses == fcNone)
+    return Known;
+
+  if (isKnownNever(fcNormal | fcSubnormal | fcNan)) {
+    Known.setAllConflict();
+
+    if (FPClasses & fcInf)
+      Known = Known.intersectWith(KnownBits::makeConstant(
+          APFloat::getInf(FltSemantics).bitcastToAPInt()));
+
+    if (FPClasses & fcZero)
+      Known = Known.intersectWith(
+          KnownBits::makeConstant(APInt::getZero(FltSemantics.sizeInBits)));
+
+    Known.Zero.clearSignBit();
+    Known.One.clearSignBit();
+  }
+
+  if (SignBit) {
+    if (*SignBit)
+      Known.makeNegative();
+    else
+      Known.makeNonNegative();
+  }
+
+  return Known;
+}
+
 // Handle known sign bit and nan cases for fadd.
 static KnownFPClass fadd_impl(const KnownFPClass &KnownLHS,
                               const KnownFPClass &KnownRHS, DenormalMode Mode) {



More information about the llvm-commits mailing list