[llvm] [AArch64][SVE] Fold nested boolean UMIN trees (PR #209234)

Paul Walker via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 31 06:47:53 PDT 2026


================
@@ -3366,6 +3366,34 @@ instCombineInStreamingMode(InstCombiner &IC, IntrinsicInst &II) {
   return std::nullopt;
 }
 
+static std::optional<Instruction *> instCombineSVEUMin(InstCombiner &IC,
+                                                       IntrinsicInst &II) {
+  // umin(umin(A, 1), umin(B, 1)) -> umin(umin(A,B), 1)
+  constexpr Intrinsic::ID UMinID = Intrinsic::aarch64_sve_umin_u;
+  Value *A, *B;
+  Value *Pg = II.getOperand(0);
+  if (match(II.getOperand(1), m_OneUse(m_Intrinsic<UMinID>(
+                                  m_Specific(Pg), m_Value(A), m_One()))) &&
+      match(II.getOperand(2), m_OneUse(m_Intrinsic<UMinID>(
+                                  m_Specific(Pg), m_Value(B), m_One())))) {
+    Value *NewUMin =
+        IC.Builder.CreateIntrinsic(UMinID, II.getType(), {Pg, A, B});
+    Value *NewLogicalUMin = IC.Builder.CreateIntrinsic(
+        UMinID, II.getType(), {Pg, NewUMin, ConstantInt::get(II.getType(), 1)});
+    return IC.replaceInstUsesWith(II, NewLogicalUMin);
+  }
+
+  // umin(umin(A, 1), 1) -> umin(A, 1)
+  Value *InnerUMin;
+  if (match(&II,
+            m_Intrinsic<UMinID>(m_Specific(Pg), m_Value(InnerUMin), m_One())) &&
+      match(InnerUMin,
+            m_Intrinsic<UMinID>(m_Specific(Pg), m_Value(A), m_One())))
----------------
paulwalker-arm wrote:

```suggestion
      match(InnerUMin,
            m_Intrinsic<UMinID>(m_Specific(Pg), m_Value(), m_One())))
```

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


More information about the llvm-commits mailing list