@@ -9073,15 +9073,27 @@ addUsersInExitBlocks(VPlan &Plan,
90739073 return ;
90749074
90759075 auto *MiddleVPBB = Plan.getMiddleBlock ();
9076- VPBuilder B (MiddleVPBB, MiddleVPBB->getFirstNonPhi ());
90779076 VPBuilder MiddleB (MiddleVPBB, MiddleVPBB->getFirstNonPhi ());
90789077 VPBuilder EarlyExitB;
90799078 VPBasicBlock *VectorEarlyExitVPBB = Plan.getEarlyExit ();
90809079 VPValue *EarlyExitMask = nullptr ;
9081- if (VectorEarlyExitVPBB)
9080+ if (VectorEarlyExitVPBB) {
90829081 EarlyExitB.setInsertPoint (VectorEarlyExitVPBB,
90839082 VectorEarlyExitVPBB->getFirstNonPhi ());
90849083
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+
90859097 // Introduce extract for exiting values and update the VPIRInstructions
90869098 // modeling the corresponding LCSSA phis.
90879099 for (VPIRInstruction *ExitIRI : ExitUsersToFix) {
@@ -9097,22 +9109,6 @@ addUsersInExitBlocks(VPlan &Plan,
90979109 cast<VPBasicBlock>(ExitIRI->getParent ()->getPredecessors ()[Idx]);
90989110 if (PredVPBB != MiddleVPBB) {
90999111 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- }
91169112 Ext = EarlyExitB.createNaryOp (VPInstruction::ExtractFirstActive,
91179113 {Op, EarlyExitMask});
91189114 } else {
0 commit comments