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

Niklas Ulvinge via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 2 00:36:59 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;
----------------
nulvinge wrote:

I wrote a test that enumerated all cases for denormals, comparing this and the previous verison, and found no cases where the mode affected the result and where the result differed.

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


More information about the llvm-commits mailing list