[llvm] [VPlan] Retain exit conditions and edges in initial VPlan (NFC). (PR #137709)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Wed May 7 05:55:09 PDT 2025
================
@@ -491,12 +481,33 @@ void VPlanTransforms::prepareForVectorization(VPlan &Plan, Type *InductionTy,
VPBlockUtils::insertBlockAfter(VecPreheader, Plan.getEntry());
VPBasicBlock *MiddleVPBB = Plan.createVPBasicBlock("middle.block");
- VPBlockUtils::connectBlocks(LatchVPB, MiddleVPBB);
- LatchVPB->swapSuccessors();
+ // Canonical LatchVPB has header block as last successor. If it has another
+ // successor, the latter is an exit block - insert middle block on its edge.
+ // Otherwise, add middle block as another successor retaining header as last.
+ if (LatchVPB->getNumSuccessors() == 2) {
+ VPBlockBase *LatchExitVPB = LatchVPB->getSuccessors()[0];
+ VPBlockUtils::insertOnEdge(LatchVPB, LatchExitVPB, MiddleVPBB);
+ } else {
+ VPBlockUtils::connectBlocks(LatchVPB, MiddleVPBB);
+ LatchVPB->swapSuccessors();
+ }
addCanonicalIVRecipes(Plan, cast<VPBasicBlock>(HeaderVPB),
cast<VPBasicBlock>(LatchVPB), InductionTy, IVDL);
+ // Disconnect all edges to exit blocks other than from the middle block.
+ // TODO: VPlans with early exits should be explicitly converted to a form
+ // exiting only via the latch here, including adjusting the exit condition,
+ // instead of simply disconnecting the edges and adjusting the VPlan later.
+ for (VPBlockBase *EB : Plan.getExitBlocks()) {
+ for (VPBlockBase *Pred : to_vector(EB->getPredecessors())) {
+ if (Pred == MiddleVPBB)
+ continue;
+ cast<VPBasicBlock>(Pred)->getTerminator()->eraseFromParent();
+ VPBlockUtils::disconnectBlocks(Pred, EB);
----------------
david-arm wrote:
This looks a bit odd at first as it seems to be undoing what you did above with `VPBlockUtils::insertOnEdge(LatchVPB, LatchExitVPB, MiddleVPBB);`. I presume that's because the `vector.early.exit` VPBB sits between the latch block and the original IR early exit block?
https://github.com/llvm/llvm-project/pull/137709
More information about the llvm-commits
mailing list