Skip to content

Commit 819d615

Browse files
committed
Address review comment
1 parent f705506 commit 819d615

File tree

2 files changed

+45
-43
lines changed

2 files changed

+45
-43
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9043,13 +9043,8 @@ collectUsersInExitBlocks(Loop *OrigLoop, VPRecipeBuilder &Builder,
90439043
break;
90449044
for (VPBlockBase *PredVPBB : ExitVPBB->getPredecessors()) {
90459045
BasicBlock *ExitingBB = OrigLoop->getLoopLatch();
9046-
if (PredVPBB != MiddleVPBB) {
9047-
SmallVector<BasicBlock *> ExitingBlocks;
9048-
OrigLoop->getExitingBlocks(ExitingBlocks);
9049-
assert(ExitingBlocks.size() == 2 && "only support 2 exiting blocks");
9050-
ExitingBB = ExitingBB == ExitingBlocks[0] ? ExitingBlocks[1]
9051-
: ExitingBlocks[0];
9052-
}
9046+
if (PredVPBB != MiddleVPBB)
9047+
continue;
90539048
Value *IncomingValue = ExitPhi->getIncomingValueForBlock(ExitingBB);
90549049
VPValue *V = Builder.getVPValueOrAddLiveIn(IncomingValue);
90559050
ExitUsersToFix.insert(ExitIRI);
@@ -9070,26 +9065,7 @@ addUsersInExitBlocks(VPlan &Plan,
90709065
return;
90719066

90729067
auto *MiddleVPBB = Plan.getMiddleBlock();
9073-
VPBuilder MiddleB(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9074-
VPBuilder EarlyExitB;
9075-
VPBasicBlock *VectorEarlyExitVPBB = Plan.getEarlyExit();
9076-
VPValue *EarlyExitMask = nullptr;
9077-
if (VectorEarlyExitVPBB) {
9078-
EarlyExitB.setInsertPoint(VectorEarlyExitVPBB,
9079-
VectorEarlyExitVPBB->getFirstNonPhi());
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-
}
9068+
VPBuilder B(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
90939069

90949070
// Introduce extract for exiting values and update the VPIRInstructions
90959071
// modeling the corresponding LCSSA phis.
@@ -9100,19 +9076,17 @@ addUsersInExitBlocks(VPlan &Plan,
91009076
if (Op->isLiveIn())
91019077
continue;
91029078

9103-
LLVMContext &Ctx = ExitIRI->getInstruction().getContext();
9104-
VPValue *Ext;
9079+
// Values that came from an uncountable early exiting block are dealt
9080+
// with separately in handleUncountableEarlyExit.
91059081
VPBasicBlock *PredVPBB =
91069082
cast<VPBasicBlock>(ExitIRI->getParent()->getPredecessors()[Idx]);
9107-
if (PredVPBB != MiddleVPBB) {
9108-
assert(ExitIRI->getParent()->getNumPredecessors() <= 2);
9109-
Ext = EarlyExitB.createNaryOp(VPInstruction::ExtractFirstActive,
9110-
{Op, EarlyExitMask});
9111-
} else {
9112-
Ext = MiddleB.createNaryOp(VPInstruction::ExtractFromEnd,
9113-
{Op, Plan.getOrAddLiveIn(ConstantInt::get(
9114-
IntegerType::get(Ctx, 32), 1))});
9115-
}
9083+
if (PredVPBB != MiddleVPBB)
9084+
continue;
9085+
9086+
LLVMContext &Ctx = ExitIRI->getInstruction().getContext();
9087+
VPValue *Ext = B.createNaryOp(VPInstruction::ExtractFromEnd,
9088+
{Op, Plan.getOrAddLiveIn(ConstantInt::get(
9089+
IntegerType::get(Ctx, 32), 1))});
91169090
ExitIRI->setOperand(Idx, Ext);
91179091
}
91189092
}
@@ -9409,15 +9383,19 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
94099383
R->setOperand(1, WideIV->getStepValue());
94109384
}
94119385

9386+
// This must be called before handleUncountableEarlyExit in order to preserve
9387+
// the correct ordering of operands, which should correspond like-for-like
9388+
// with the order of exit block predecessors in vplan. The middle block is
9389+
// always the first predecessor, followed by the vector early exit block.
9390+
SetVector<VPIRInstruction *> ExitUsersToFix =
9391+
collectUsersInExitBlocks(OrigLoop, RecipeBuilder, *Plan);
94129392
if (auto *UncountableExitingBlock =
94139393
Legal->getUncountableEarlyExitingBlock()) {
94149394
VPlanTransforms::handleUncountableEarlyExit(
94159395
*Plan, *PSE.getSE(), OrigLoop, UncountableExitingBlock, RecipeBuilder);
94169396
}
94179397
DenseMap<VPValue *, VPValue *> IVEndValues;
94189398
addScalarResumePhis(RecipeBuilder, *Plan, IVEndValues);
9419-
SetVector<VPIRInstruction *> ExitUsersToFix =
9420-
collectUsersInExitBlocks(OrigLoop, RecipeBuilder, *Plan);
94219399
addExitUsersForFirstOrderRecurrences(*Plan, ExitUsersToFix);
94229400
addUsersInExitBlocks(*Plan, ExitUsersToFix);
94239401

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,12 +2099,13 @@ void VPlanTransforms::handleUncountableEarlyExit(
20992099
Builder.createNaryOp(VPInstruction::AnyOf, {EarlyExitTakenCond});
21002100

21012101
VPBasicBlock *NewMiddle = Plan.createVPBasicBlock("middle.split");
2102-
VPBasicBlock *EarlyExitVPBB = Plan.createVPBasicBlock("vector.early.exit");
2102+
VPBasicBlock *VectorEarlyExitVPBB =
2103+
Plan.createVPBasicBlock("vector.early.exit");
21032104
VPBlockUtils::insertOnEdge(LoopRegion, MiddleVPBB, NewMiddle);
2104-
VPBlockUtils::connectBlocks(NewMiddle, EarlyExitVPBB);
2105+
VPBlockUtils::connectBlocks(NewMiddle, VectorEarlyExitVPBB);
21052106
NewMiddle->swapSuccessors();
21062107

2107-
VPBlockUtils::connectBlocks(EarlyExitVPBB, VPEarlyExitBlock);
2108+
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, VPEarlyExitBlock);
21082109

21092110
VPBuilder MiddleBuilder(NewMiddle);
21102111
MiddleBuilder.createNaryOp(VPInstruction::BranchOnCond, {IsEarlyExitTaken});
@@ -2122,4 +2123,27 @@ void VPlanTransforms::handleUncountableEarlyExit(
21222123
Instruction::Or, {IsEarlyExitTaken, IsLatchExitTaken});
21232124
Builder.createNaryOp(VPInstruction::BranchOnCond, AnyExitTaken);
21242125
LatchExitingBranch->eraseFromParent();
2126+
2127+
// Fix up any users of loop-defined values in the early exit block.
2128+
VPBuilder EarlyExitB(VectorEarlyExitVPBB,
2129+
VectorEarlyExitVPBB->getFirstNonPhi());
2130+
for (VPRecipeBase &R : *VPEarlyExitBlock) {
2131+
auto *ExitIRI = dyn_cast<VPIRInstruction>(&R);
2132+
if (!ExitIRI)
2133+
continue;
2134+
auto *ExitPhi = dyn_cast<PHINode>(&ExitIRI->getInstruction());
2135+
if (!ExitPhi)
2136+
break;
2137+
2138+
Value *IncomingValue =
2139+
ExitPhi->getIncomingValueForBlock(UncountableExitingBlock);
2140+
VPValue *V = RecipeBuilder.getVPValueOrAddLiveIn(IncomingValue);
2141+
2142+
// Pass live-in values used by exit phis directly through to their users
2143+
// in the exit block.
2144+
if (!V->isLiveIn())
2145+
V = EarlyExitB.createNaryOp(VPInstruction::ExtractFirstActive,
2146+
{V, EarlyExitTakenCond});
2147+
ExitIRI->addOperand(V);
2148+
}
21252149
}

0 commit comments

Comments
 (0)