Skip to content

Commit 589c7ab

Browse files
committed
Revert "[LV] Improve AnyOf reduction codegen. (#78304)"
Broke sanitizer bots: https://lab.llvm.org/buildbot/#/builders/74/builds/26697 This reverts commit 95fef1d.
1 parent 2cd19df commit 589c7ab

File tree

10 files changed

+274
-279
lines changed

10 files changed

+274
-279
lines changed

llvm/include/llvm/Transforms/Utils/LoopUtils.h

+9
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,15 @@ RecurKind getMinMaxReductionRecurKind(Intrinsic::ID RdxID);
372372
/// Returns the comparison predicate used when expanding a min/max reduction.
373373
CmpInst::Predicate getMinMaxReductionPredicate(RecurKind RK);
374374

375+
/// See RecurrenceDescriptor::isAnyOfPattern for a description of the pattern we
376+
/// are trying to match. In this pattern, we are only ever selecting between two
377+
/// values: 1) an initial start value \p StartVal of the reduction PHI, and 2) a
378+
/// loop invariant value. If any of lane value in \p Left, \p Right is not equal
379+
/// to \p StartVal, select the loop invariant value. This is done by selecting
380+
/// \p Right iff \p Left is equal to \p StartVal.
381+
Value *createAnyOfOp(IRBuilderBase &Builder, Value *StartVal, RecurKind RK,
382+
Value *Left, Value *Right);
383+
375384
/// Returns a Min/Max operation corresponding to MinMaxRecurrenceKind.
376385
/// The Builder's fast-math-flags must be set to propagate the expected values.
377386
Value *createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left,

llvm/lib/Transforms/Utils/LoopUtils.cpp

+18-6
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,15 @@ CmpInst::Predicate llvm::getMinMaxReductionPredicate(RecurKind RK) {
10341034
}
10351035
}
10361036

1037+
Value *llvm::createAnyOfOp(IRBuilderBase &Builder, Value *StartVal,
1038+
RecurKind RK, Value *Left, Value *Right) {
1039+
if (auto VTy = dyn_cast<VectorType>(Left->getType()))
1040+
StartVal = Builder.CreateVectorSplat(VTy->getElementCount(), StartVal);
1041+
Value *Cmp =
1042+
Builder.CreateCmp(CmpInst::ICMP_NE, Left, StartVal, "rdx.select.cmp");
1043+
return Builder.CreateSelect(Cmp, Left, Right, "rdx.select");
1044+
}
1045+
10371046
Value *llvm::createMinMaxOp(IRBuilderBase &Builder, RecurKind RK, Value *Left,
10381047
Value *Right) {
10391048
Type *Ty = Left->getType();
@@ -1142,13 +1151,16 @@ Value *llvm::createAnyOfTargetReduction(IRBuilderBase &Builder, Value *Src,
11421151
NewVal = SI->getTrueValue();
11431152
}
11441153

1154+
// Create a splat vector with the new value and compare this to the vector
1155+
// we want to reduce.
1156+
ElementCount EC = cast<VectorType>(Src->getType())->getElementCount();
1157+
Value *Right = Builder.CreateVectorSplat(EC, InitVal);
1158+
Value *Cmp =
1159+
Builder.CreateCmp(CmpInst::ICMP_NE, Src, Right, "rdx.select.cmp");
1160+
11451161
// If any predicate is true it means that we want to select the new value.
1146-
Value *AnyOf =
1147-
Src->getType()->isVectorTy() ? Builder.CreateOrReduce(Src) : Src;
1148-
// The compares in the loop may yield poison, which propagates through the
1149-
// bitwise ORs. Freeze it here before the condition is used.
1150-
AnyOf = Builder.CreateFreeze(AnyOf);
1151-
return Builder.CreateSelect(AnyOf, NewVal, InitVal, "rdx.select");
1162+
Cmp = Builder.CreateOrReduce(Cmp);
1163+
return Builder.CreateSelect(Cmp, NewVal, InitVal, "rdx.select");
11521164
}
11531165

11541166
Value *llvm::createSimpleTargetReduction(IRBuilderBase &Builder, Value *Src,

llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h

-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ class VPBuilder {
6868
public:
6969
VPBuilder() = default;
7070
VPBuilder(VPBasicBlock *InsertBB) { setInsertPoint(InsertBB); }
71-
VPBuilder(VPRecipeBase *InsertPt) { setInsertPoint(InsertPt); }
7271

7372
/// Clear the insertion point: created instructions will not be inserted into
7473
/// a block.

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

+3-43
Original file line numberDiff line numberDiff line change
@@ -7405,6 +7405,7 @@ static void createAndCollectMergePhiForReduction(
74057405
auto *PhiR = cast<VPReductionPHIRecipe>(RedResult->getOperand(0));
74067406
const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor();
74077407

7408+
TrackingVH<Value> ReductionStartValue = RdxDesc.getRecurrenceStartValue();
74087409
Value *FinalValue =
74097410
State.get(RedResult, VPIteration(State.UF - 1, VPLane::getFirstLane()));
74107411
auto *ResumePhi =
@@ -7429,7 +7430,7 @@ static void createAndCollectMergePhiForReduction(
74297430
BCBlockPhi->addIncoming(ResumePhi->getIncomingValueForBlock(Incoming),
74307431
Incoming);
74317432
else
7432-
BCBlockPhi->addIncoming(RdxDesc.getRecurrenceStartValue(), Incoming);
7433+
BCBlockPhi->addIncoming(ReductionStartValue, Incoming);
74337434
}
74347435

74357436
auto *OrigPhi = cast<PHINode>(PhiR->getUnderlyingValue());
@@ -8853,10 +8854,6 @@ VPlanPtr LoopVectorizationPlanner::buildVPlan(VFRange &Range) {
88538854
// A ComputeReductionResult recipe is added to the middle block, also for
88548855
// in-loop reductions which compute their result in-loop, because generating
88558856
// the subsequent bc.merge.rdx phi is driven by ComputeReductionResult recipes.
8856-
//
8857-
// Adjust AnyOf reductions; replace the reduction phi for the selected value
8858-
// with a boolean reduction phi node to check if the condition is true in any
8859-
// iteration. The final value is selected by the final ComputeReductionResult.
88608857
void LoopVectorizationPlanner::adjustRecipesForReductions(
88618858
VPBasicBlock *LatchVPBB, VPlanPtr &Plan, VPRecipeBuilder &RecipeBuilder,
88628859
ElementCount MinVF) {
@@ -9030,41 +9027,6 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
90309027
continue;
90319028

90329029
const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor();
9033-
// Adjust AnyOf reductions; replace the reduction phi for the selected value
9034-
// with a boolean reduction phi node to check if the condition is true in
9035-
// any iteration. The final value is selected by the final
9036-
// ComputeReductionResult.
9037-
if (RecurrenceDescriptor::isAnyOfRecurrenceKind(
9038-
RdxDesc.getRecurrenceKind())) {
9039-
auto *Select = cast<VPRecipeBase>(*find_if(PhiR->users(), [](VPUser *U) {
9040-
return isa<VPWidenSelectRecipe>(U) ||
9041-
(isa<VPReplicateRecipe>(U) &&
9042-
cast<VPReplicateRecipe>(U)->getUnderlyingInstr()->getOpcode() ==
9043-
Instruction::Select);
9044-
}));
9045-
VPValue *Cmp = Select->getOperand(0);
9046-
// If the compare is checking the reduction PHI node, adjust it to check
9047-
// the start value.
9048-
if (VPRecipeBase *CmpR = Cmp->getDefiningRecipe()) {
9049-
for (unsigned I = 0; I != CmpR->getNumOperands(); ++I)
9050-
if (CmpR->getOperand(I) == PhiR)
9051-
CmpR->setOperand(I, PhiR->getStartValue());
9052-
}
9053-
VPBuilder::InsertPointGuard Guard(Builder);
9054-
Builder.setInsertPoint(Select);
9055-
9056-
// If the true value of the select is the reduction phi, the new value is
9057-
// selected if the negated condition is true in any iteration.
9058-
if (Select->getOperand(1) == PhiR)
9059-
Cmp = Builder.createNot(Cmp);
9060-
VPValue *Or = Builder.createOr(PhiR, Cmp);
9061-
Select->getVPSingleValue()->replaceAllUsesWith(Or);
9062-
9063-
// Convert the reduction phi to operate on bools.
9064-
PhiR->setOperand(0, Plan->getVPValueOrAddLiveIn(ConstantInt::getFalse(
9065-
OrigLoop->getHeader()->getContext())));
9066-
}
9067-
90689030
// If tail is folded by masking, introduce selects between the phi
90699031
// and the live-out instruction of each reduction, at the beginning of the
90709032
// dedicated latch block.
@@ -9097,9 +9059,7 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
90979059
// then extend the loop exit value to enable InstCombine to evaluate the
90989060
// entire expression in the smaller type.
90999061
Type *PhiTy = PhiR->getStartValue()->getLiveInIRValue()->getType();
9100-
if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType() &&
9101-
!RecurrenceDescriptor::isAnyOfRecurrenceKind(
9102-
RdxDesc.getRecurrenceKind())) {
9062+
if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType()) {
91039063
assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
91049064
Type *RdxTy = RdxDesc.getRecurrenceType();
91059065
auto *Trunc =

llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,6 @@ Value *VPInstruction::generateInstruction(VPTransformState &State,
442442
// Reduce all of the unrolled parts into a single vector.
443443
Value *ReducedPartRdx = RdxParts[0];
444444
unsigned Op = RecurrenceDescriptor::getOpcode(RK);
445-
if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK))
446-
Op = Instruction::Or;
447445

448446
if (PhiR->isOrdered()) {
449447
ReducedPartRdx = RdxParts[State.UF - 1];
@@ -456,16 +454,19 @@ Value *VPInstruction::generateInstruction(VPTransformState &State,
456454
if (Op != Instruction::ICmp && Op != Instruction::FCmp)
457455
ReducedPartRdx = Builder.CreateBinOp(
458456
(Instruction::BinaryOps)Op, RdxPart, ReducedPartRdx, "bin.rdx");
459-
else
457+
else if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK)) {
458+
TrackingVH<Value> ReductionStartValue =
459+
RdxDesc.getRecurrenceStartValue();
460+
ReducedPartRdx = createAnyOfOp(Builder, ReductionStartValue, RK,
461+
ReducedPartRdx, RdxPart);
462+
} else
460463
ReducedPartRdx = createMinMaxOp(Builder, RK, ReducedPartRdx, RdxPart);
461464
}
462465
}
463466

464467
// Create the reduction after the loop. Note that inloop reductions create
465468
// the target reduction in the loop using a Reduction recipe.
466-
if ((State.VF.isVector() ||
467-
RecurrenceDescriptor::isAnyOfRecurrenceKind(RK)) &&
468-
!PhiR->isInLoop()) {
469+
if (State.VF.isVector() && !PhiR->isInLoop()) {
469470
ReducedPartRdx =
470471
createTargetReduction(Builder, RdxDesc, ReducedPartRdx, OrigPhi);
471472
// If the reduction can be performed in a smaller type, we need to extend

0 commit comments

Comments
 (0)