[llvm] [KnownFPClass] Move float-to-integer bitcast handling into KnownFPClass [NFC] (PR #218090)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 21 19:22:03 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: ZERICO2005
<details>
<summary>Changes</summary>
I moved the float-to-integer bitcast code into a new `KnownBits bitcastToKnownBits(const fltSemantics &FltSemantics) const;` function. This allows the code to be unit testable, and allows the code to be reused elsewhere.
I also have future plans to work on the `KnownBits` deductions for the float-to-integer bitcast.
---
Full diff: https://github.com/llvm/llvm-project/pull/218090.diff
3 Files Affected:
- (modified) llvm/include/llvm/Support/KnownFPClass.h (+3)
- (modified) llvm/lib/Analysis/ValueTracking.cpp (+1-27)
- (modified) llvm/lib/Support/KnownFPClass.cpp (+34)
``````````diff
diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index dadf4133d826b..a2ecb85cd23e9 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 bitcast from a float with provided semantics.
+ LLVM_ABI KnownBits bitcastToKnownBits(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..73098e8c3ad27 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.bitcastToKnownBits(FPType->getFltSemantics());
break;
}
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index ac9406ecd0280..6b358c8d49005 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::bitcastToKnownBits(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) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/218090
More information about the llvm-commits
mailing list