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

Paul Walker via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 31 04:09:40 PDT 2026


================
@@ -3366,6 +3366,35 @@ 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_Intrinsic<UMinID>(m_Specific(Pg), m_Value(A), m_One())) &&
+      match(II.getOperand(2),
+            m_Intrinsic<UMinID>(m_Specific(Pg), m_Value(B), m_One())) &&
+      II.hasOneUse()) {
+    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:

Up to you but just in case you're unaware, `m_Value` also accepts a pattern, making it possible to match the entire pattern and still assign to `InnerUMin`.

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


More information about the llvm-commits mailing list