[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