[llvm] [KnownFPClass] Fix fadd/fsub input handling and improve fadd_self (PR #225605)
Eric Ross via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 23:22:29 PDT 2026
================
@@ -398,44 +420,71 @@ static KnownFPClass fadd_impl(const KnownFPClass &KnownLHS,
return Known;
}
-KnownFPClass KnownFPClass::fadd(const KnownFPClass &KnownLHS,
- const KnownFPClass &KnownRHS,
- DenormalMode Mode) {
- KnownFPClass Known = fadd_impl(KnownLHS, KnownRHS, Mode);
-
- // (fadd x, 0.0) is guaranteed to return +0.0, not -0.0.
- if ((KnownLHS.isKnownNeverLogicalNegZero(Mode) ||
- KnownRHS.isKnownNeverLogicalNegZero(Mode)) &&
- // Make sure output negative denormal can't flush to -0
- (Mode.Output == DenormalMode::IEEE ||
- Mode.Output == DenormalMode::PositiveZero))
+static KnownFPClass fadd_fsub_common(const KnownFPClass &KnownLHS,
+ const KnownFPClass &KnownRHS) {
+ KnownFPClass Known = fadd_fsub_fma_common(KnownLHS, KnownRHS);
+
+ // fadd(x, +0.0) is guaranteed to return +0.0, not -0.0.
+ // TODO: fadd(+0.0, -0.0) returns -0.0 if rounding towards negative infinity.
+ if (KnownLHS.isKnownNeverNegZero() || KnownRHS.isKnownNeverNegZero())
Known.knownNot(fcNegZero);
Known.propagateNonSNaN(KnownLHS, KnownRHS);
return Known;
}
-KnownFPClass KnownFPClass::fadd_self(const KnownFPClass &KnownSrc,
+KnownFPClass KnownFPClass::fadd(const KnownFPClass &KnownLHS_,
+ const KnownFPClass &KnownRHS_,
+ DenormalMode Mode) {
+ KnownFPClass KnownLHS = applyInputDenormalMode(KnownLHS_, Mode);
+ KnownFPClass KnownRHS = applyInputDenormalMode(KnownRHS_, Mode);
+
+ KnownFPClass Known = fadd_fsub_common(KnownLHS, KnownRHS);
----------------
ZERICO2005 wrote:
The intention is that only the public functions handle the output/input flushing. This is why I decided not to pass the `DenormalMode` into the `static` functions.
https://github.com/llvm/llvm-project/pull/225605
More information about the llvm-commits
mailing list