@@ -7405,7 +7405,6 @@ static void createAndCollectMergePhiForReduction(
74057405 auto *PhiR = cast<VPReductionPHIRecipe>(RedResult->getOperand (0 ));
74067406 const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor ();
74077407
7408- TrackingVH<Value> ReductionStartValue = RdxDesc.getRecurrenceStartValue ();
74097408 Value *FinalValue =
74107409 State.get (RedResult, VPIteration (State.UF - 1 , VPLane::getFirstLane ()));
74117410 auto *ResumePhi =
@@ -7430,7 +7429,7 @@ static void createAndCollectMergePhiForReduction(
74307429 BCBlockPhi->addIncoming (ResumePhi->getIncomingValueForBlock (Incoming),
74317430 Incoming);
74327431 else
7433- BCBlockPhi->addIncoming (ReductionStartValue , Incoming);
7432+ BCBlockPhi->addIncoming (RdxDesc. getRecurrenceStartValue () , Incoming);
74347433 }
74357434
74367435 auto *OrigPhi = cast<PHINode>(PhiR->getUnderlyingValue ());
@@ -8854,6 +8853,10 @@ VPlanPtr LoopVectorizationPlanner::buildVPlan(VFRange &Range) {
88548853// A ComputeReductionResult recipe is added to the middle block, also for
88558854// in-loop reductions which compute their result in-loop, because generating
88568855// 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.
88578860void LoopVectorizationPlanner::adjustRecipesForReductions (
88588861 VPBasicBlock *LatchVPBB, VPlanPtr &Plan, VPRecipeBuilder &RecipeBuilder,
88598862 ElementCount MinVF) {
@@ -9027,6 +9030,41 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
90279030 continue ;
90289031
90299032 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+
90309068 // If tail is folded by masking, introduce selects between the phi
90319069 // and the live-out instruction of each reduction, at the beginning of the
90329070 // dedicated latch block.
@@ -9059,7 +9097,9 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
90599097 // then extend the loop exit value to enable InstCombine to evaluate the
90609098 // entire expression in the smaller type.
90619099 Type *PhiTy = PhiR->getStartValue ()->getLiveInIRValue ()->getType ();
9062- if (MinVF.isVector () && PhiTy != RdxDesc.getRecurrenceType ()) {
9100+ if (MinVF.isVector () && PhiTy != RdxDesc.getRecurrenceType () &&
9101+ !RecurrenceDescriptor::isAnyOfRecurrenceKind (
9102+ RdxDesc.getRecurrenceKind ())) {
90639103 assert (!PhiR->isInLoop () && " Unexpected truncated inloop reduction!" );
90649104 Type *RdxTy = RdxDesc.getRecurrenceType ();
90659105 auto *Trunc =
0 commit comments