[llvm] [NFC][KnowFPClass] Refactor fmul & fdiv (PR #191651)
Max Graey via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 11 11:08:36 PDT 2026
https://github.com/MaxGraey created https://github.com/llvm/llvm-project/pull/191651
- Remove this redundant check and bit setting in fmul.
```cpp
// +/-0 * +/-inf = nan
if ((KnownLHS.isKnownAlways(fcZero | fcNan) &&
KnownRHS.isKnownAlways(fcInf | fcNan)) ||
(KnownLHS.isKnownAlways(fcInf | fcNan) &&
KnownRHS.isKnownAlways(fcZero | fcNan)))
Known.knownNot(~fcNan);
```
- group repeated twice sign inferring into `propagateXorSign` helper
>From bb96b9973ae9513cdbfae92059bac947be05cf38 Mon Sep 17 00:00:00 2001
From: MaxGraey <maxgraey at gmail.com>
Date: Sat, 11 Apr 2026 21:04:49 +0300
Subject: [PATCH] [nfc] refactor fmul & fdiv for KnowFPClass
---
llvm/include/llvm/Support/KnownFPClass.h | 13 +++++++
llvm/lib/Support/KnownFPClass.cpp | 46 +++++++-----------------
2 files changed, 25 insertions(+), 34 deletions(-)
diff --git a/llvm/include/llvm/Support/KnownFPClass.h b/llvm/include/llvm/Support/KnownFPClass.h
index 3ded51909615b..7e018d25d2d1d 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -391,6 +391,19 @@ struct KnownFPClass {
knownNot(fcSNan);
}
+ // Propagate knowledge for operations whose result sign is the xor of the
+ // operand signs, such as multiply and divide. This only rules out possible
+ // non-NaN sign classes. NaNs do not have a constrained sign class here.
+ void propagateXorSign(const KnownFPClass &LHS, const KnownFPClass &RHS) {
+ if ((LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcNegative)) ||
+ (LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcPositive)))
+ knownNot(fcNegative);
+
+ if ((LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcNegative)) ||
+ (LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcPositive)))
+ knownNot(fcPositive);
+ }
+
/// Propagate knowledge from a source value that could be a denormal or
/// zero. We have to be conservative since output flushing is not guaranteed,
/// so known-never-zero may not hold.
diff --git a/llvm/lib/Support/KnownFPClass.cpp b/llvm/lib/Support/KnownFPClass.cpp
index 96a1b26daf04d..f796215e54dfc 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -365,38 +365,24 @@ KnownFPClass KnownFPClass::fmul(const KnownFPClass &KnownLHS,
DenormalMode Mode) {
KnownFPClass Known;
- // xor sign bit.
- if ((KnownLHS.isKnownNever(fcNegative) &&
- KnownRHS.isKnownNever(fcNegative)) ||
- (KnownLHS.isKnownNever(fcPositive) && KnownRHS.isKnownNever(fcPositive)))
- Known.knownNot(fcNegative);
-
- if ((KnownLHS.isKnownNever(fcPositive) &&
- KnownRHS.isKnownNever(fcNegative)) ||
- (KnownLHS.isKnownNever(fcNegative) && KnownRHS.isKnownNever(fcPositive)))
- Known.knownNot(fcPositive);
+ // +X * +Y or -X * -Y => +Q
+ // +X * -Y or -X * +Y => -Q
+ Known.propagateXorSign(KnownLHS, KnownRHS);
- // inf * anything => inf or nan
+ // Inf * Y => Inf or NaN
if (KnownLHS.isKnownAlways(fcInf | fcNan) ||
KnownRHS.isKnownAlways(fcInf | fcNan))
Known.knownNot(fcNormal | fcSubnormal | fcZero);
- // 0 * anything => 0 or nan
+ // 0 * Y => 0 or NaN
if (KnownRHS.isKnownAlways(fcZero | fcNan) ||
KnownLHS.isKnownAlways(fcZero | fcNan))
Known.knownNot(fcNormal | fcSubnormal | fcInf);
- // +/-0 * +/-inf = nan
- if ((KnownLHS.isKnownAlways(fcZero | fcNan) &&
- KnownRHS.isKnownAlways(fcInf | fcNan)) ||
- (KnownLHS.isKnownAlways(fcInf | fcNan) &&
- KnownRHS.isKnownAlways(fcZero | fcNan)))
- Known.knownNot(~fcNan);
-
if (!KnownLHS.isKnownNeverNaN() || !KnownRHS.isKnownNeverNaN())
return Known;
- // If 0 * +/-inf produces NaN.
+ // 0 * +/-inf => NaN
if ((KnownRHS.isKnownNeverInfinity() ||
KnownLHS.isKnownNeverLogicalZero(Mode)) &&
(KnownLHS.isKnownNeverInfinity() ||
@@ -448,24 +434,16 @@ KnownFPClass KnownFPClass::fdiv(const KnownFPClass &KnownLHS,
Known.knownNot(fcNan);
}
- // xor sign bit.
- // X / -0.0 is -Inf (or NaN).
- // +X / +X is +X
- if ((KnownLHS.isKnownNever(fcNegative) &&
- KnownRHS.isKnownNever(fcNegative)) ||
- (KnownLHS.isKnownNever(fcPositive) && KnownRHS.isKnownNever(fcPositive)))
- Known.knownNot(fcNegative);
-
- if ((KnownLHS.isKnownNever(fcPositive) &&
- KnownRHS.isKnownNever(fcNegative)) ||
- (KnownLHS.isKnownNever(fcNegative) && KnownRHS.isKnownNever(fcPositive)))
- Known.knownNot(fcPositive);
+ // X / -0.0 => -Inf (or NaN)
+ // +X / +Y or -X / -Y => +Q
+ // +X / -Y or -X / +Y => -Q
+ Known.propagateXorSign(KnownLHS, KnownRHS);
- // 0 / x => 0 or nan
+ // 0 / X => 0 or NaN
if (KnownLHS.isKnownAlways(fcZero))
Known.knownNot(fcSubnormal | fcNormal | fcInf);
- // x / 0 => nan or inf
+ // X / 0 => NaN or Inf
if (KnownRHS.isKnownAlways(fcZero))
Known.knownNot(fcFinite);
More information about the llvm-commits
mailing list