[llvm] [VPlan] Dispatch to multiple exit blocks via middle blocks. (PR #112138)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 23 11:27:56 PST 2024
================
@@ -1796,3 +1802,57 @@ void VPlanTransforms::createInterleaveGroups(
}
}
}
+
+void VPlanTransforms::handleUncountableEarlyExit(
+ VPlan &Plan, ScalarEvolution &SE, Loop *OrigLoop,
+ ArrayRef<BasicBlock *> UncountableExitingBlocks,
+ VPRecipeBuilder &RecipeBuilder) {
+ auto *LatchVPBB =
+ cast<VPBasicBlock>(Plan.getVectorLoopRegion()->getExiting());
+ VPBuilder Builder(LatchVPBB->getTerminator());
+ auto *MiddleVPBB = Plan.getMiddleBlock();
+ VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
+ VPValue *EarlyExitTaken = nullptr;
+
+ // Process all uncountable exiting blocks. For each exiting block, update the
+ // EarlyExitTaken, which tracks if any uncountable early exit has been taken.
+ // Also split the middle block and branch to the exit block for the early exit
+ // if it has been taken.
+ for (BasicBlock *Exiting : UncountableExitingBlocks) {
+ auto *ExitingTerm = cast<BranchInst>(Exiting->getTerminator());
+ BasicBlock *TrueSucc = ExitingTerm->getSuccessor(0);
+ BasicBlock *FalseSucc = ExitingTerm->getSuccessor(1);
+ VPIRBasicBlock *VPExitBlock;
+ if (OrigLoop->getUniqueExitBlock()) {
+ VPExitBlock = cast<VPIRBasicBlock>(MiddleVPBB->getSuccessors()[0]);
+ } else {
+ VPExitBlock = VPIRBasicBlock::fromBasicBlock(
----------------
fhahn wrote:
I think `UncountableExitingBlocks` should only have a single exiting block at the moment, updated to process only a single one for now
https://github.com/llvm/llvm-project/pull/112138
More information about the llvm-commits
mailing list