[llvm] [InstSimplify] Optimize maximumnum and minimumnum (PR #139581)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue May 13 08:48:05 PDT 2025
================
@@ -6725,32 +6735,50 @@ Value *llvm::simplifyBinaryIntrinsic(Intrinsic::ID IID, Type *ReturnType,
return Op0;
bool PropagateNaN = IID == Intrinsic::minimum || IID == Intrinsic::maximum;
- bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum;
-
- // minnum(X, nan) -> X
- // maxnum(X, nan) -> X
- // minimum(X, nan) -> nan
- // maximum(X, nan) -> nan
- if (match(Op1, m_NaN()))
- return PropagateNaN ? propagateNaN(cast<Constant>(Op1)) : Op0;
+ bool PropagateSNaN = IID == Intrinsic::minnum || IID == Intrinsic::maxnum;
+ bool IsMin = IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
+ IID == Intrinsic::minimumnum;
+
+ // minnum(x, qnan) -> x
+ // maxnum(x, qnan) -> x
+ // minnum(x, snan) -> qnan
+ // maxnum(x, snan) -> qnan
+ // minimum(X, nan) -> qnan
+ // maximum(X, nan) -> qnan
+ if (PropagateSNaN && match(Op1, m_sNaN())) {
+ return propagateNaN(cast<Constant>(Op1));
+ } else if (match(Op1, m_NaN())) {
+ if (PropagateNaN)
+ return propagateNaN(cast<Constant>(Op1));
+ // In cases like mixed <sNaN, qNaN> vectors, avoid the optimization to
+ // allow correct sNaN propagation where necessary.
+ else if (PropagateSNaN && !match(Op1, m_qNaN()))
+ break;
+ else
+ return Op0;
----------------
arsenm wrote:
With this chain of nan-matchers, it might actually be easier to just do the elementwise handling - propgqtenan already has the elementwise code in it
https://github.com/llvm/llvm-project/pull/139581
More information about the llvm-commits
mailing list