[llvm] [LV] Support argmin/argmax with strict predicates. (PR #170223)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 1 13:19:31 PST 2026
================
@@ -1371,33 +1498,42 @@ bool VPlanTransforms::handleMultiUseReductions(VPlan &Plan) {
FindIVPhiR->getRecurrenceKind()))
return false;
+ assert(!FindIVPhiR->isInLoop() && !FindIVPhiR->isOrdered() &&
+ "cannot handle inloop/ordered reductions yet");
+
// TODO: Support cases where IVOp is the IV increment.
if (!match(IVOp, m_TruncOrSelf(m_VPValue(IVOp))) ||
!isa<VPWidenIntOrFpInductionRecipe>(IVOp))
return false;
- CmpInst::Predicate RdxPredicate = [RdxKind]() {
+ // Check if the predicate is compatible with the reduction kind.
+ bool IsValidKindPred = [RdxKind, Pred]() {
switch (RdxKind) {
case RecurKind::UMin:
- return CmpInst::ICMP_UGE;
+ return Pred == CmpInst::ICMP_UGE || Pred == CmpInst::ICMP_UGT;
case RecurKind::UMax:
- return CmpInst::ICMP_ULE;
+ return Pred == CmpInst::ICMP_ULE || Pred == CmpInst::ICMP_ULT;
case RecurKind::SMax:
- return CmpInst::ICMP_SLE;
+ return Pred == CmpInst::ICMP_SLE || Pred == CmpInst::ICMP_SLT;
case RecurKind::SMin:
- return CmpInst::ICMP_SGE;
+ return Pred == CmpInst::ICMP_SGE || Pred == CmpInst::ICMP_SGT;
default:
llvm_unreachable("unhandled recurrence kind");
}
}();
- // TODO: Strict predicates need to find the first IV value for which the
- // predicate holds, not the last.
- if (Pred != RdxPredicate)
+ if (!IsValidKindPred)
return false;
- assert(!FindIVPhiR->isInLoop() && !FindIVPhiR->isOrdered() &&
- "cannot handle inloop/ordered reductions yet");
+ // For strict predicates, use a UMin reduction to find the minimum index.
+ // Canonical IVs (0, 1, 2, ...) are guaranteed not to wrap in the vector
+ // loop, so UMin can always be used.
+ bool IsStrictPredicate = ICmpInst::isLT(Pred) || ICmpInst::isGT(Pred);
+ if (IsStrictPredicate) {
+ return handleFirstArgMinArgMax(Plan, MinMaxPhiR, FindIVPhiR,
+ cast<VPWidenIntOrFpInductionRecipe>(IVOp),
+ MinMaxResult);
----------------
fhahn wrote:
done thanks
https://github.com/llvm/llvm-project/pull/170223
More information about the llvm-commits
mailing list