[llvm] [VPlan] Model branch cond to enter scalar epilogue in VPlan. (PR #92651)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 4 05:25:16 PDT 2024
================
@@ -879,15 +922,41 @@ void VPlan::execute(VPTransformState *State) {
State->CFG.ExitBB = State->CFG.PrevBB->getSingleSuccessor();
BasicBlock *VectorPreHeader = State->CFG.PrevBB;
State->Builder.SetInsertPoint(VectorPreHeader->getTerminator());
- replaceVPBBWithIRVPBB(
- cast<VPBasicBlock>(getVectorLoopRegion()->getSingleSuccessor()),
- State->CFG.ExitBB);
// Disconnect VectorPreHeader from ExitBB in both the CFG and DT.
cast<BranchInst>(VectorPreHeader->getTerminator())->setSuccessor(0, nullptr);
State->CFG.DTU.applyUpdates(
{{DominatorTree::Delete, VectorPreHeader, State->CFG.ExitBB}});
+ // Replace regular VPBB's for the middle and scalar preheader blocks with
+ // VPIRBasicBlocks with VPIRBasicBlocks wrapping their IR blocks. The IR
+ // blocks are created during skeleton creation, so we can only create the
+ // VPIRBasicBlocks after legacy skeleton creation.
+ BasicBlock *MiddleBB = State->CFG.ExitBB;
+ VPBasicBlock *MiddleVPBB =
+ cast<VPBasicBlock>(getVectorLoopRegion()->getSingleSuccessor());
+ // Find the VPBB for the scalar preheader, relying on the current structure
+ // when creating the middle block and its successrs: if there's a single
+ // predecessor, it must be the scalar preheader. Otherwise, the second
+ // successor is the scalar preheader.
+ BasicBlock *ScalarPh = MiddleBB->getSingleSuccessor();
+ auto &MiddleSuccs = MiddleVPBB->getSuccessors();
+ assert((MiddleSuccs.size() == 1 || MiddleSuccs.size() == 2) &&
+ "middle block has unexpected successors");
+ VPBasicBlock *ScalarPhVPBB = cast<VPBasicBlock>(
+ MiddleSuccs.size() == 1 ? MiddleSuccs[0] : MiddleSuccs[1]);
+ assert(!isa<VPIRBasicBlock>(ScalarPhVPBB) &&
+ "scalar preheader cannot be wrapped already");
+ replaceVPBBWithIRVPBB(ScalarPhVPBB, ScalarPh);
+ replaceVPBBWithIRVPBB(MiddleVPBB, MiddleBB);
+
+ // Disconnect the middle block from its single successor (the scalar loop
+ // header) in both the CFG and DT. The branch will be created during VPlan
----------------
ayalz wrote:
```suggestion
// header) in both the CFG and DT. The branch will be recreated during VPlan
```
https://github.com/llvm/llvm-project/pull/92651
More information about the llvm-commits
mailing list