[llvm] [SLP]Initial support for ordered reductions (PR #182644)
Ryan Buchner via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 6 10:50:58 PST 2026
================
@@ -25349,31 +25354,38 @@ class HorizontalReduction {
}
/// Checks if instruction is associative and can be vectorized.
- static bool isVectorizable(RecurKind Kind, Instruction *I,
- bool TwoElementReduction = false) {
+ enum class ReductionOrdering { Unordered, Ordered, None };
+ ReductionOrdering RK = ReductionOrdering::None;
+ static ReductionOrdering isVectorizable(RecurKind Kind, Instruction *I,
+ bool TwoElementReduction = false) {
if (Kind == RecurKind::None)
- return false;
+ return ReductionOrdering::None;
// Integer ops that map to select instructions or intrinsics are fine.
if (RecurrenceDescriptor::isIntMinMaxRecurrenceKind(Kind) ||
isBoolLogicOp(I))
- return true;
+ return ReductionOrdering::Unordered;
// No need to check for associativity, if 2 reduced values.
if (TwoElementReduction)
- return true;
+ return ReductionOrdering::Unordered;
if (Kind == RecurKind::FMax || Kind == RecurKind::FMin) {
// FP min/max are associative except for NaN and -0.0. We do not
// have to rule out -0.0 here because the intrinsic semantics do not
// specify a fixed result for it.
- return I->getFastMathFlags().noNaNs();
+ return I->getFastMathFlags().noNaNs() ? ReductionOrdering::Unordered
+ : ReductionOrdering::Ordered;
}
if (Kind == RecurKind::FMaximum || Kind == RecurKind::FMinimum)
- return true;
+ return ReductionOrdering::Unordered;
- return I->isAssociative();
+ if (I->isAssociative())
+ return ReductionOrdering::Unordered;
+
+ return ::isCommutative(I) ? ReductionOrdering::Ordered
+ : ReductionOrdering::None;
----------------
bababuck wrote:
Would you mind if I have a go at it? (I have a couple things on my plate ahead of it so might be a couple weeks before I get to it).
https://github.com/llvm/llvm-project/pull/182644
More information about the llvm-commits
mailing list