[llvm] [VPlan] Add BranchOnMultiCond, use for early exit plans. (PR #172750)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 29 02:36:43 PST 2025
================
@@ -3905,22 +3963,27 @@ void VPlanTransforms::handleUncountableEarlyExit(VPBasicBlock *EarlyExitingVPBB,
ExitIRI->setOperand(EarlyExitIdx, IncomingFromEarlyExit);
}
}
- MiddleBuilder.createNaryOp(VPInstruction::BranchOnCond, {IsEarlyExitTaken});
- // Replace the condition controlling the non-early exit from the vector loop
- // with one exiting if either the original condition of the vector latch is
- // true or the early exit has been taken.
+ // Replace the conditional branch controlling the latch exit from the vector
+ // loop with a multi-conditional branch exiting to vector early exit if the
+ // early exit has been taken, exiting to middle block if the original
+ // condition of the vector latch is true, otherwise continuing back to header.
auto *LatchExitingBranch = cast<VPInstruction>(LatchVPBB->getTerminator());
- // Skip single-iteration loop region
assert(LatchExitingBranch->getOpcode() == VPInstruction::BranchOnCount &&
"Unexpected terminator");
auto *IsLatchExitTaken =
Builder.createICmp(CmpInst::ICMP_EQ, LatchExitingBranch->getOperand(0),
LatchExitingBranch->getOperand(1));
- auto *AnyExitTaken = Builder.createNaryOp(
- Instruction::Or, {IsEarlyExitTaken, IsLatchExitTaken});
- Builder.createNaryOp(VPInstruction::BranchOnCond, AnyExitTaken);
+
+ DebugLoc LatchDL = LatchExitingBranch->getDebugLoc();
LatchExitingBranch->eraseFromParent();
+
+ Builder.setInsertPoint(LatchVPBB);
+ Builder.createNaryOp(VPInstruction::BranchOnTwoConds,
+ {IsEarlyExitTaken, IsLatchExitTaken}, LatchDL);
+ LatchVPBB->clearSuccessors();
+ LatchVPBB->setSuccessors({VectorEarlyExitVPBB, MiddleVPBB, HeaderVPBB});
----------------
ayalz wrote:
Above used a pair of connectSuccessor(), twice. Is this intentional, otherwise better be consistent.
https://github.com/llvm/llvm-project/pull/172750
More information about the llvm-commits
mailing list