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