[llvm] [VPlan] Lower BranchOnTwoConds to chain of 2 simple branches. (PR #174016)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 11 12:48:08 PST 2026
================
@@ -3760,42 +3760,40 @@ void VPlanTransforms::expandBranchOnTwoConds(VPlan &Plan) {
// Expand BranchOnTwoConds instructions into explicit CFG with
// single-condition branches, by introducing a new branch in VPBB that jumps
- // to a new intermediate block if either condition is true and to the
- // third successor otherwise. The intermediate block jumps to the first or
- // second successor, depending on the first condition.
+ // to the first successor if the first condition is true, and a new
+ // intermediate block otherwise. The intermediate block jumps to the second
+ // successor if the second condition is true, otherwise to the third
+ // successor.
for (VPInstruction *Br : WorkList) {
assert(Br->getNumOperands() == 2 &&
"BranchOnTwoConds must have exactly 2 conditions");
DebugLoc DL = Br->getDebugLoc();
- VPBasicBlock *Latch = Br->getParent();
- const auto Successors = to_vector(Latch->getSuccessors());
+ VPBasicBlock *Cond0BB = Br->getParent();
+ const auto Successors = to_vector(Cond0BB->getSuccessors());
assert(Successors.size() == 3 &&
"BranchOnTwoConds must have exactly 3 successors");
for (VPBlockBase *Succ : Successors)
- VPBlockUtils::disconnectBlocks(Latch, Succ);
-
- VPValue *EarlyExitingCond = Br->getOperand(0);
- VPValue *LateExitingCond = Br->getOperand(1);
- VPBlockBase *EarlyExitBB = Successors[0];
- VPBlockBase *LateExitBB = Successors[1];
- VPBlockBase *Header = Successors[2];
-
- VPBasicBlock *MiddleSplit = Plan.createVPBasicBlock("middle.split");
- MiddleSplit->setParent(LateExitBB->getParent());
-
- VPBuilder Builder(Latch);
- VPValue *AnyExitTaken = Builder.createNaryOp(
- Instruction::Or, {EarlyExitingCond, LateExitingCond}, DL);
- Builder.createNaryOp(VPInstruction::BranchOnCond, {AnyExitTaken}, DL);
- VPBlockUtils::connectBlocks(Latch, MiddleSplit);
- VPBlockUtils::connectBlocks(Latch, Header);
-
- VPBuilder(MiddleSplit)
- .createNaryOp(VPInstruction::BranchOnCond, {EarlyExitingCond}, DL);
- VPBlockUtils::connectBlocks(MiddleSplit, EarlyExitBB);
- VPBlockUtils::connectBlocks(MiddleSplit, LateExitBB);
-
+ VPBlockUtils::disconnectBlocks(Cond0BB, Succ);
+
+ VPValue *Cond0 = Br->getOperand(0);
+ VPValue *Cond1 = Br->getOperand(1);
+ VPBlockBase *Succ0 = Successors[0];
+ VPBlockBase *Succ1 = Successors[1];
+ VPBlockBase *Succ2 = Successors[2];
+ assert(!Succ0->getParent() && !Succ1->getParent() && !Succ2->getParent() &&
+ !Cond0BB->getParent() && "regions must already be dissolved");
+
+ VPBasicBlock *Cond1BB =
----------------
ayalz wrote:
```suggestion
VPBasicBlock *InterimBB =
```
following the documentation.
https://github.com/llvm/llvm-project/pull/174016
More information about the llvm-commits
mailing list