diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -4259,14 +4259,11 @@ // Reductions do not have to start at zero. They can start with // any loop invariant values. - BasicBlock *Latch = OrigLoop->getLoopLatch(); - Value *LoopVal = OrigPhi->getIncomingValueForBlock(Latch); - for (unsigned Part = 0; Part < UF; ++Part) { - Value *VecRdxPhi = State.get(PhiR->getVPValue(), Part); - Value *Val = State.get(State.Plan->getVPValue(LoopVal), Part); - cast(VecRdxPhi) - ->addIncoming(Val, LI->getLoopFor(LoopVectorBody)->getLoopLatch()); + Value *VecRdxPhi = State.get(PhiR->getVPValue(0), Part); + cast(VecRdxPhi)->addIncoming( + State.get(PhiR->getOperand(1), Part), + LI->getLoopFor(LoopVectorBody)->getLoopLatch()); } // Before each round, move the insertion point right between @@ -8746,6 +8743,18 @@ RecipeBuilder.recordRecipeOf(Entry.first); RecipeBuilder.recordRecipeOf(Entry.second); } + + SmallVector PhisToFix; + BasicBlock *OrigLatch = OrigLoop->getLoopLatch(); + for (PHINode &Phi : OrigLoop->getHeader()->phis()) { + if (!Legal->isReductionVariable(&Phi)) + continue; + PhisToFix.push_back(&Phi); + RecipeBuilder.recordRecipeOf(&Phi); + RecipeBuilder.recordRecipeOf( + cast(Phi.getIncomingValueForBlock(OrigLatch))); + } + for (auto &Reduction : CM.getInLoopReductionChains()) { PHINode *Phi = Reduction.first; RecurKind Kind = Legal->getReductionVars()[Phi].getRecurrenceKind(); @@ -8844,6 +8853,14 @@ } } + for (PHINode *PN : PhisToFix) { + VPWidenPHIRecipe *R = cast(RecipeBuilder.getRecipe(PN)); + VPRecipeBase *IncR = RecipeBuilder.getRecipe( + cast(PN->getIncomingValueForBlock(OrigLatch))); + assert(IncR->getNumDefinedValues() == 1); + R->addOperand(IncR->getVPValue(0)); + } + // Discard empty dummy pre-entry VPBasicBlock. Note that other VPBasicBlocks // may also be empty, such as the last one VPBB, reflecting original // basic-blocks with no recipes.