Skip to content

Commit 8f0a379

Browse files
committed
Address comments
1 parent f635d4d commit 8f0a379

File tree

5 files changed

+29
-26
lines changed

5 files changed

+29
-26
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7290,8 +7290,8 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
72907290
// Regions are dissolved after optimizing for VF and UF, which completely
72917291
// removes unneeded loop regions first.
72927292
VPlanTransforms::dissolveLoopRegions(BestVPlan);
7293-
// Enable variable-length stepping for EVL loops after regions are dissolved
7294-
VPlanTransforms::simplifyEVLIVs(BestVPlan);
7293+
// Canonicalize EVL loops after regions are dissolved.
7294+
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
72957295
// Perform the actual loop transformation.
72967296
VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan,
72977297
OrigLoop->getParentLoop(),

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,10 +2369,10 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
23692369
return true;
23702370
}
23712371

2372-
void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
2372+
void VPlanTransforms::canonicalizeEVLLoops(VPlan &Plan) {
23732373
using namespace llvm::VPlanPatternMatch;
2374-
// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe
2375-
// There should be only one EVL PHI in the entire plan
2374+
// Find EVL loop entries by locating VPEVLBasedIVPHIRecipe.
2375+
// There should be only one EVL PHI in the entire plan.
23762376
VPEVLBasedIVPHIRecipe *EVLPhi = nullptr;
23772377

23782378
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
@@ -2383,11 +2383,11 @@ void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
23832383
EVLPhi = PhiR;
23842384
}
23852385

2386-
// Early return if no EVL PHI is found
2386+
// Early return if no EVL PHI is found.
23872387
if (!EVLPhi)
23882388
return;
23892389

2390-
VPBasicBlock *Entry = EVLPhi->getParent();
2390+
VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
23912391
VPValue *EVLIncrement = EVLPhi->getBackedgeValue();
23922392

23932393
// Convert EVLPhi to concrete recipe.
@@ -2397,32 +2397,29 @@ void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
23972397
EVLPhi->replaceAllUsesWith(ScalarR);
23982398
EVLPhi->eraseFromParent();
23992399

2400-
// Replace CanonicalIVInc with EVL-PHI increment
2401-
VPRecipeBase *CanonicalIV = &*Entry->begin();
2402-
assert(dyn_cast<VPPhi>(CanonicalIV) && "Unexpected canoincal iv");
2400+
// Replace CanonicalIVInc with EVL-PHI increment.
2401+
VPRecipeBase *CanonicalIV = &*HeaderVPBB->begin();
2402+
assert(
2403+
isa<VPPhi>(CanonicalIV) &&
2404+
match(CanonicalIV->getOperand(1),
2405+
m_c_Binary<Instruction::Add>(m_Specific(cast<VPPhi>(CanonicalIV)),
2406+
m_Specific(&Plan.getVFxUF()))) &&
2407+
"Unexpected canoincal iv");
24032408
VPValue *Backedge = CanonicalIV->getOperand(1);
24042409
Backedge->replaceAllUsesWith(EVLIncrement);
24052410

2406-
// Remove unused phi
2411+
// Remove unused phi and increment.
24072412
VPRecipeBase *CanonicalIVIncrement = Backedge->getDefiningRecipe();
24082413
CanonicalIVIncrement->eraseFromParent();
24092414
CanonicalIV->eraseFromParent();
24102415

2411-
// Find the latch-exiting block and replace use of VectorTripCount
2416+
// Replace the use of VectorTripCount in the latch-exiting block.
24122417
// Before: (branch-on-count EVLIVInc, VectorTripCount)
24132418
// After: (branch-on-count EVLIVInc, TripCount)
2414-
auto Range =
2415-
VPBlockUtils::blocksOnly<VPBasicBlock>(vp_depth_first_shallow(Entry));
2416-
auto It = find_if(Range, [&Entry](VPBasicBlock *VPBB) {
2417-
return any_of(VPBB->successors(),
2418-
[&Entry](VPBlockBase *Succ) { return Succ == Entry; });
2419-
});
2420-
assert((It != Range.end()) && "LatchExiting is not found");
2421-
2422-
VPBasicBlock *LatchExiting = *It;
24232419

2420+
VPBasicBlock *LatchExiting =
2421+
HeaderVPBB->getPredecessors()[1]->getEntryBasicBlock();
24242422
auto *LatchExitingBr = cast<VPInstruction>(LatchExiting->getTerminator());
2425-
24262423
// Skip single-iteration loop region
24272424
if (match(LatchExitingBr, m_BranchOnCond(m_True())))
24282425
return;

llvm/lib/Transforms/Vectorize/VPlanTransforms.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,12 @@ struct VPlanTransforms {
214214
///
215215
/// Once loop regions are replaced with explicit CFG, EVL loops can step with
216216
/// variable vector lengths instead of fixed lengths. This transformation:
217-
/// * EVL-Phi concretization (makes them concrete)
217+
/// * Make EVL-Phi concrete.
218+
// * Remove CanonicalIV and increment.
218219
/// * Replaces fixed-length stepping (branch-on-cond CanonicalIVInc,
219220
/// VectorTripCount) with variable-length stepping (branch-on-cond
220221
/// EVLIVInc, TripCount).
221-
static void simplifyEVLIVs(VPlan &Plan);
222+
static void canonicalizeEVLLoops(VPlan &Plan);
222223

223224
/// Lower abstract recipes to concrete ones, that can be codegen'd. Use \p
224225
/// CanonicalIVTy as type for all un-typed live-ins in VPTypeAnalysis.

llvm/lib/Transforms/Vectorize/VPlanVerifier.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "VPlanCFG.h"
1818
#include "VPlanDominatorTree.h"
1919
#include "VPlanHelpers.h"
20+
#include "VPlanPatternMatch.h"
2021
#include "llvm/ADT/SmallPtrSet.h"
2122
#include "llvm/ADT/TypeSwitch.h"
2223

@@ -193,8 +194,12 @@ bool VPlanVerifier::verifyEVLRecipe(const VPInstruction &EVL) const {
193194
return false;
194195
}
195196
// EVLIVIncrement is only used by EVLIV & BranchOnCount.
196-
// More than two is unexpected.
197-
if (I->getNumUsers() > 2) {
197+
// Having more than two users is unexpected.
198+
if ((I->getNumUsers() != 1) &&
199+
(I->getNumUsers() != 2 || !any_of(I->users(), [&I](VPUser *U) {
200+
using namespace llvm::VPlanPatternMatch;
201+
return match(U, m_BranchOnCount(m_Specific(I), m_VPValue()));
202+
}))) {
198203
errs() << "EVL is used in VPInstruction with multiple users\n";
199204
return false;
200205
}

0 commit comments

Comments
 (0)