[llvm] 3277f6c - [LV] Explicitly disable in-loop reductions for AnyOf and FindIV. nfc (#163541)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 14 01:14:12 PST 2025
Author: Mel Chen
Date: 2025-11-14T09:14:07Z
New Revision: 3277f6caef110359046e32983fee37932b8f9ac2
URL: https://github.com/llvm/llvm-project/commit/3277f6caef110359046e32983fee37932b8f9ac2
DIFF: https://github.com/llvm/llvm-project/commit/3277f6caef110359046e32983fee37932b8f9ac2.diff
LOG: [LV] Explicitly disable in-loop reductions for AnyOf and FindIV. nfc (#163541)
Currently, in-loop reductions for AnyOf and FindIV are not supported.
They were implicitly blocked. This happened because
RecurrenceDescriptor::getReductionOpChain could not detect their
recurrence chain. The reason is that RecurrenceDescriptor::getOpcode was
set to Instruction::Or, but the recurrence chains of AnyOf and FindIV do
not actually contain an Instruction::Or.
This patch explicitly disables in-loop reductions for AnyOf and FindIV
instead of relying on getReductionOpChain to implicitly prevent them.
Added:
Modified:
llvm/lib/Analysis/IVDescriptors.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index 9f8ac6e8e2e0b..641850b46bbd8 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -1220,11 +1220,6 @@ unsigned RecurrenceDescriptor::getOpcode(RecurKind Kind) {
return Instruction::Add;
case RecurKind::Mul:
return Instruction::Mul;
- case RecurKind::AnyOf:
- case RecurKind::FindFirstIVSMin:
- case RecurKind::FindFirstIVUMin:
- case RecurKind::FindLastIVSMax:
- case RecurKind::FindLastIVUMax:
case RecurKind::Or:
return Instruction::Or;
case RecurKind::And:
@@ -1248,6 +1243,13 @@ unsigned RecurrenceDescriptor::getOpcode(RecurKind Kind) {
case RecurKind::FMaximumNum:
case RecurKind::FMinimumNum:
return Instruction::FCmp;
+ case RecurKind::AnyOf:
+ case RecurKind::FindFirstIVSMin:
+ case RecurKind::FindFirstIVUMin:
+ case RecurKind::FindLastIVSMax:
+ case RecurKind::FindLastIVUMax:
+ // TODO: Set AnyOf and FindIV to Instruction::Select once in-loop reductions
+ // are supported.
default:
llvm_unreachable("Unknown recurrence operation");
}
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 9f0d6fcb237ef..58fcab40d5894 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -6591,9 +6591,14 @@ void LoopVectorizationCostModel::collectInLoopReductions() {
if (RdxDesc.getRecurrenceType() != Phi->getType())
continue;
+ // In-loop AnyOf and FindIV reductions are not yet supported.
+ RecurKind Kind = RdxDesc.getRecurrenceKind();
+ if (RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) ||
+ RecurrenceDescriptor::isFindIVRecurrenceKind(Kind))
+ continue;
+
// If the target would prefer this reduction to happen "in-loop", then we
// want to record it as such.
- RecurKind Kind = RdxDesc.getRecurrenceKind();
if (!PreferInLoopReductions && !useOrderedReductions(RdxDesc) &&
!TTI.preferInLoopReduction(Kind, Phi->getType()))
continue;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index e0e6990c56ec7..aa85bd435ee9e 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -821,10 +821,9 @@ Value *VPInstruction::generate(VPTransformState &State) {
auto *OrigPhi = cast<PHINode>(PhiR->getUnderlyingValue());
Value *ReducedPartRdx = State.get(getOperand(2));
for (unsigned Idx = 3; Idx < getNumOperands(); ++Idx)
- ReducedPartRdx = Builder.CreateBinOp(
- (Instruction::BinaryOps)RecurrenceDescriptor::getOpcode(
- RecurKind::AnyOf),
- State.get(getOperand(Idx)), ReducedPartRdx, "bin.rdx");
+ ReducedPartRdx =
+ Builder.CreateBinOp(Instruction::Or, State.get(getOperand(Idx)),
+ ReducedPartRdx, "bin.rdx");
return createAnyOfReduction(Builder, ReducedPartRdx,
State.get(getOperand(1), VPLane(0)), OrigPhi);
}
More information about the llvm-commits
mailing list