[llvm] [InstCombine] Fold select(X >s 0, 0, -X) | smax(X, 0) to abs(X) (PR #165200)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 27 08:35:47 PDT 2025


================
@@ -3997,6 +3997,20 @@ static Value *foldOrUnsignedUMulOverflowICmp(BinaryOperator &I,
   return nullptr;
 }
 
+// Fold select(X >s 0, 0, -X) | smax(X, 0) --> abs(X)
+static Value *FoldOrOfSelectSmaxToAbs(BinaryOperator &I,
+                                      InstCombiner::BuilderTy &Builder) {
+  CmpPredicate Pred;
+  Value *X;
+  if (match(&I, m_c_Or(m_Select(m_ICmp(Pred, m_Value(X), m_ZeroInt()),
+                                m_ZeroInt(), m_Sub(m_ZeroInt(), m_Deferred(X))),
+                       m_OneUse(m_Intrinsic<Intrinsic::smax>(m_Deferred(X),
+                                                             m_ZeroInt())))) &&
+      Pred == ICmpInst::ICMP_SGT)
----------------
dtcxzyw wrote:

```suggestion
  if (match(&I, m_c_Or(m_Select(m_SpecificICmp(ICmpInst::ICMP_SGT, m_Value(X), m_ZeroInt()),
                                m_ZeroInt(), m_Sub(m_ZeroInt(), m_Deferred(X))),
                       m_OneUse(m_Intrinsic<Intrinsic::smax>(m_Deferred(X),
                                                             m_ZeroInt())))))
```

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


More information about the llvm-commits mailing list