[llvm] [KnownFPClass] Add neg_square and fma_neg_square (PR #227248)

Eric Ross via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 08:46:03 PDT 2026


================
@@ -287,6 +287,27 @@ struct KnownFPClass {
     return Known;
   }
 
+  // Special cases of fmul -x, x and fmul x, -x.
+  static KnownFPClass
+  neg_square(const KnownFPClass &Src,
+             DenormalMode Mode = DenormalMode::getDynamic()) {
+    KnownFPClass Known = fmul(fneg(Src), Src, Mode);
+
+    // -X * X is always negative, zero, or a NaN.
+    Known.knownNot(fcPosSubnormal | fcPosNormal | fcPosInf);
+
+    // Zero results are -0 unless a denormal is flushed to +0.
+    if ((Mode.Input == DenormalMode::IEEE ||
+         Mode.Input == DenormalMode::PreserveSign) &&
+        (Mode.Output == DenormalMode::IEEE ||
+         Mode.Output == DenormalMode::PreserveSign)) {
+      Known.knownNot(fcPosZero);
+    }
+
+    Known.propagateNonNaN(Src);
----------------
ZERICO2005 wrote:

No, because `0.0 * inf` and `inf * 0.0` produce NaN. Whereas this is impossible if the LHS == RHS (squaring).

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


More information about the llvm-commits mailing list