@@ -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