@@ -3818,34 +3818,16 @@ void InnerLoopVectorizer::fixReduction(VPReductionPHIRecipe *PhiR,
3818
3818
// instead of the former. For an inloop reduction the reduction will already
3819
3819
// be predicated, and does not need to be handled here.
3820
3820
if (Cost->foldTailByMasking () && !PhiR->isInLoop ()) {
3821
- for (unsigned Part = 0 ; Part < UF; ++Part) {
3822
- Value *VecLoopExitInst = State.get (LoopExitInstDef, Part);
3823
- SelectInst *Sel = nullptr ;
3824
- for (User *U : VecLoopExitInst->users ()) {
3825
- if (isa<SelectInst>(U)) {
3826
- assert ((!Sel || U == Sel) &&
3827
- " Reduction exit feeding two different selects" );
3828
- Sel = cast<SelectInst>(U);
3829
- } else
3830
- assert (isa<PHINode>(U) && " Reduction exit must feed Phi's or select" );
3831
- }
3832
- assert (Sel && " Reduction exit feeds no select" );
3833
- State.reset (LoopExitInstDef, Sel, Part);
3834
-
3835
- // If the target can create a predicated operator for the reduction at no
3836
- // extra cost in the loop (for example a predicated vadd), it can be
3837
- // cheaper for the select to remain in the loop than be sunk out of it,
3838
- // and so use the select value for the phi instead of the old
3839
- // LoopExitValue.
3840
- if (PreferPredicatedReductionSelect ||
3841
- TTI->preferPredicatedReductionSelect (
3842
- RdxDesc.getOpcode (), PhiTy,
3843
- TargetTransformInfo::ReductionFlags ())) {
3844
- auto *VecRdxPhi =
3845
- cast<PHINode>(State.get (PhiR, Part));
3846
- VecRdxPhi->setIncomingValueForBlock (VectorLoopLatch, Sel);
3821
+ VPValue *Def = nullptr ;
3822
+ for (VPUser *U : LoopExitInstDef->users ()) {
3823
+ auto *S = dyn_cast<VPInstruction>(U);
3824
+ if (S && S->getOpcode () == Instruction::Select) {
3825
+ Def = S;
3826
+ break ;
3847
3827
}
3848
3828
}
3829
+ if (Def)
3830
+ LoopExitInstDef = Def;
3849
3831
}
3850
3832
3851
3833
// If the vector reduction can be performed in a smaller type, we truncate
@@ -9099,6 +9081,11 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
9099
9081
? new VPInstruction (Instruction::Select, {Cond, Red, PhiR}, FMFs)
9100
9082
: new VPInstruction (Instruction::Select, {Cond, Red, PhiR});
9101
9083
Select->insertBefore (&*Builder.getInsertPoint ());
9084
+ if (PreferPredicatedReductionSelect ||
9085
+ TTI.preferPredicatedReductionSelect (
9086
+ PhiR->getRecurrenceDescriptor ().getOpcode (), PhiTy,
9087
+ TargetTransformInfo::ReductionFlags ()))
9088
+ PhiR->setOperand (1 , Select);
9102
9089
}
9103
9090
}
9104
9091
0 commit comments