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 @@ -9454,16 +9454,21 @@ if (!RecurPhi) continue; + VPRecipeBase *PrevRecipe = RecurPhi->getBackedgeRecipe(); + if (auto *Region = GetReplicateRegion(PrevRecipe)) { + VPBasicBlock *Succ = cast(Region->getSingleSuccessor()); + Builder.setInsertPoint(Succ, Succ->getFirstNonPhi()); + } else if (PrevRecipe->isPhi()) + Builder.setInsertPoint(PrevRecipe->getParent(), + PrevRecipe->getParent()->getFirstNonPhi()); + else + Builder.setInsertPoint(PrevRecipe->getParent(), + std::next(PrevRecipe->getIterator())); + auto *RecurSplice = cast( Builder.createNaryOp(VPInstruction::FirstOrderRecurrenceSplice, {RecurPhi, RecurPhi->getBackedgeValue()})); - VPRecipeBase *PrevRecipe = RecurPhi->getBackedgeRecipe(); - if (auto *Region = GetReplicateRegion(PrevRecipe)) { - VPBasicBlock *Succ = cast(Region->getSingleSuccessor()); - RecurSplice->moveBefore(*Succ, Succ->getFirstNonPhi()); - } else - RecurSplice->moveAfter(PrevRecipe); RecurPhi->replaceAllUsesWith(RecurSplice); // Set the first operand of RecurSplice to RecurPhi again, after replacing // all users.