@@ -9073,15 +9073,27 @@ addUsersInExitBlocks(VPlan &Plan,
9073
9073
return;
9074
9074
9075
9075
auto *MiddleVPBB = Plan.getMiddleBlock();
9076
- VPBuilder B(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9077
9076
VPBuilder MiddleB(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9078
9077
VPBuilder EarlyExitB;
9079
9078
VPBasicBlock *VectorEarlyExitVPBB = Plan.getEarlyExit();
9080
9079
VPValue *EarlyExitMask = nullptr;
9081
- if (VectorEarlyExitVPBB)
9080
+ if (VectorEarlyExitVPBB) {
9082
9081
EarlyExitB.setInsertPoint(VectorEarlyExitVPBB,
9083
9082
VectorEarlyExitVPBB->getFirstNonPhi());
9084
9083
9084
+ // Lookup and cache the early exit mask.
9085
+ VPBasicBlock *MiddleSplitVPBB =
9086
+ cast<VPBasicBlock>(VectorEarlyExitVPBB->getSinglePredecessor());
9087
+ VPInstruction *PredTerm =
9088
+ cast<VPInstruction>(MiddleSplitVPBB->getTerminator());
9089
+ assert(PredTerm->getOpcode() == VPInstruction::BranchOnCond &&
9090
+ "Unexpected middle split block terminator");
9091
+ VPInstruction *ScalarCond = cast<VPInstruction>(PredTerm->getOperand(0));
9092
+ assert(ScalarCond->getOpcode() == VPInstruction::AnyOf &&
9093
+ "Unexpected condition for middle split block terminator branch");
9094
+ EarlyExitMask = ScalarCond->getOperand(0);
9095
+ }
9096
+
9085
9097
// Introduce extract for exiting values and update the VPIRInstructions
9086
9098
// modeling the corresponding LCSSA phis.
9087
9099
for (VPIRInstruction *ExitIRI : ExitUsersToFix) {
@@ -9097,22 +9109,6 @@ addUsersInExitBlocks(VPlan &Plan,
9097
9109
cast<VPBasicBlock>(ExitIRI->getParent()->getPredecessors()[Idx]);
9098
9110
if (PredVPBB != MiddleVPBB) {
9099
9111
assert(ExitIRI->getParent()->getNumPredecessors() <= 2);
9100
-
9101
- // Lookup and cache the early exit mask.
9102
- if (!EarlyExitMask) {
9103
- VPBasicBlock *MiddleSplitVPBB =
9104
- cast<VPBasicBlock>(VectorEarlyExitVPBB->getSinglePredecessor());
9105
- VPInstruction *PredTerm =
9106
- cast<VPInstruction>(MiddleSplitVPBB->getTerminator());
9107
- assert(PredTerm->getOpcode() == VPInstruction::BranchOnCond &&
9108
- "Unexpected middle split block terminator");
9109
- VPInstruction *ScalarCond =
9110
- cast<VPInstruction>(PredTerm->getOperand(0));
9111
- assert(
9112
- ScalarCond->getOpcode() == VPInstruction::AnyOf &&
9113
- "Unexpected condition for middle split block terminator branch");
9114
- EarlyExitMask = ScalarCond->getOperand(0);
9115
- }
9116
9112
Ext = EarlyExitB.createNaryOp(VPInstruction::ExtractFirstActive,
9117
9113
{Op, EarlyExitMask});
9118
9114
} else {
0 commit comments