[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