[llvm] simplifyBinaryIntrinsic: Return nan if snan is passed maxnum/minnum (PR #158470)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 15 04:49:18 PDT 2025


================
@@ -6735,12 +6735,17 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
     bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
     bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum;
 
-    // minnum(X, nan) -> X
-    // maxnum(X, nan) -> X
+    // minnum(X, qnan) -> X
+    // maxnum(X, qnan) -> X
+    // minnum(X, snan) -> nan
+    // maxnum(X, snan) -> nan
     // minimum(X, nan) -> nan
     // maximum(X, nan) -> nan
-    if (match(Op1, m_NaN()))
-      return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0;
+    if (match(Op1, m_NaN())) {
+      if (PropagateNaN || match(Op1, m_SNaN()))
----------------
arsenm wrote:

This is performing the same check twice, except the two are subtly different. I don't think this handles vectors with mixed signaling and quiet elements correctly. A conservatively correct matcher would use m_APFloat, then check for a signaling / quiet nan. This wouldn't optimally handle non-splat vectors though 


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


More information about the llvm-commits mailing list