[llvm] [Valuetracking] Use all FPClasses ordering information for min/max (PR #199651)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Fri May 29 08:10:17 PDT 2026


================
@@ -107,36 +107,32 @@ KnownFPClass KnownFPClass::minMaxLike(const KnownFPClass &LHS_,
        Kind == MinMaxKind::minimumnum || Kind == MinMaxKind::maximumnum))
     Known.knownNot(fcNan);
 
+  FPClassTest Excluded = fcNone;
   if (Kind == MinMaxKind::maxnum || Kind == MinMaxKind::maximumnum) {
-    // If at least one operand is known to be positive, the result must be
-    // positive.
-    if ((KnownLHS.cannotBeOrderedLessThanZero() &&
-         KnownLHS.isKnownNeverNaN()) ||
-        (KnownRHS.cannotBeOrderedLessThanZero() && KnownRHS.isKnownNeverNaN()))
-      Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
+    if (KnownLHS.isKnownNeverNaN())
+      Excluded |= orderedStrictlyLess(KnownLHS.KnownFPClasses);
+    if (KnownRHS.isKnownNeverNaN())
+      Excluded |= orderedStrictlyLess(KnownRHS.KnownFPClasses);
   } else if (Kind == MinMaxKind::maximum) {
-    // If at least one operand is known to be positive, the result must be
-    // positive.
-    if (KnownLHS.cannotBeOrderedLessThanZero() ||
-        KnownRHS.cannotBeOrderedLessThanZero())
-      Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
+    Excluded = orderedStrictlyLess(KnownLHS.KnownFPClasses) |
+               orderedStrictlyLess(KnownRHS.KnownFPClasses);
   } else if (Kind == MinMaxKind::minnum || Kind == MinMaxKind::minimumnum) {
-    // If at least one operand is known to be negative, the result must be
-    // negative.
-    if ((KnownLHS.cannotBeOrderedGreaterThanZero() &&
-         KnownLHS.isKnownNeverNaN()) ||
-        (KnownRHS.cannotBeOrderedGreaterThanZero() &&
-         KnownRHS.isKnownNeverNaN()))
-      Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
+    if (KnownLHS.isKnownNeverNaN())
+      Excluded |= orderedStrictlyGreater(KnownLHS.KnownFPClasses);
+    if (KnownRHS.isKnownNeverNaN())
+      Excluded |= orderedStrictlyGreater(KnownRHS.KnownFPClasses);
   } else if (Kind == MinMaxKind::minimum) {
-    // If at least one operand is known to be negative, the result must be
-    // negative.
-    if (KnownLHS.cannotBeOrderedGreaterThanZero() ||
-        KnownRHS.cannotBeOrderedGreaterThanZero())
-      Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
+    Excluded = orderedStrictlyGreater(KnownLHS.KnownFPClasses) |
+               orderedStrictlyGreater(KnownRHS.KnownFPClasses);
   } else
     llvm_unreachable("unhandled intrinsic");
 
+  // We cannot exclude just one zero since the operation may be NSZ
+  if ((Excluded & fcZero) != fcZero)
+    Excluded &= ~fcZero;
----------------
arsenm wrote:

I'd prefer to get correct results before, rather than filtering out wrong cases later. I think this doesn't work correctly with denormal flushing. You would need to account for the DenormalMode when adding the 0 to the mask 

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


More information about the llvm-commits mailing list