[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:25:03 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);
+
+  return applyOutputDenormalMode(Known, Mode);
+}
+
+KnownFPClass KnownFPClass::fadd_self(const KnownFPClass &KnownSrc_,
                                      DenormalMode Mode) {
-  KnownFPClass Known = fadd(KnownSrc, KnownSrc, Mode);
-
-  // Doubling 0 will give the same 0.
-  if (KnownSrc.isKnownNeverLogicalPosZero(Mode) &&
-      (Mode.Output == DenormalMode::IEEE ||
-       (Mode.Output == DenormalMode::PreserveSign &&
-        KnownSrc.isKnownNeverPosSubnormal()) ||
-       (Mode.Output == DenormalMode::PositiveZero &&
-        KnownSrc.isKnownNeverSubnormal())))
+  KnownFPClass KnownSrc = applyInputDenormalMode(KnownSrc_, Mode);
+
+  KnownFPClass Known;
+
+  Known.propagateNonNaN(KnownSrc);
----------------
ZERICO2005 wrote:

I thought it would be better to rewrite `fadd_self` compared to having it wrap `fadd_fsub_common`.


https://github.com/llvm/llvm-project/pull/225605


More information about the llvm-commits mailing list