[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