Skip to content

Commit c962dbf

Browse files
committed
Address comments
1 parent 87e9f4a commit c962dbf

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
@@ -7286,8 +7286,8 @@ DenseMap<const SCEV *, Value *> LoopVectorizationPlanner::executePlan(
72867286
// Regions are dissolved after optimizing for VF and UF, which completely
72877287
// removes unneeded loop regions first.
72887288
VPlanTransforms::dissolveLoopRegions(BestVPlan);
7289-
// Enable variable-length stepping for EVL loops after regions are dissolved
7290-
VPlanTransforms::simplifyEVLIVs(BestVPlan);
7289+
// Canonicalize EVL loops after regions are dissolved.
7290+
VPlanTransforms::canonicalizeEVLLoops(BestVPlan);
72917291
// Perform the actual loop transformation.
72927292
VPTransformState State(&TTI, BestVF, LI, DT, ILV.AC, ILV.Builder, &BestVPlan,
72937293
OrigLoop->getParentLoop(),

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,10 +2365,10 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
23652365
return true;
23662366
}
23672367

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

23742374
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
@@ -2379,11 +2379,11 @@ void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
23792379
EVLPhi = PhiR;
23802380
}
23812381

2382-
// Early return if no EVL PHI is found
2382+
// Early return if no EVL PHI is found.
23832383
if (!EVLPhi)
23842384
return;
23852385

2386-
VPBasicBlock *Entry = EVLPhi->getParent();
2386+
VPBasicBlock *HeaderVPBB = EVLPhi->getParent();
23872387
VPValue *EVLIncrement = EVLPhi->getBackedgeValue();
23882388

23892389
// Convert EVLPhi to concrete recipe.
@@ -2393,32 +2393,29 @@ void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
23932393
EVLPhi->replaceAllUsesWith(ScalarR);
23942394
EVLPhi->eraseFromParent();
23952395

2396-
// Replace CanonicalIVInc with EVL-PHI increment
2397-
VPRecipeBase *CanonicalIV = &*Entry->begin();
2398-
assert(dyn_cast<VPPhi>(CanonicalIV) && "Unexpected canoincal iv");
2396+
// Replace CanonicalIVInc with EVL-PHI increment.
2397+
VPRecipeBase *CanonicalIV = &*HeaderVPBB->begin();
2398+
assert(
2399+
isa<VPPhi>(CanonicalIV) &&
2400+
match(CanonicalIV->getOperand(1),
2401+
m_c_Binary<Instruction::Add>(m_Specific(cast<VPPhi>(CanonicalIV)),
2402+
m_Specific(&Plan.getVFxUF()))) &&
2403+
"Unexpected canoincal iv");
23992404
VPValue *Backedge = CanonicalIV->getOperand(1);
24002405
Backedge->replaceAllUsesWith(EVLIncrement);
24012406

2402-
// Remove unused phi
2407+
// Remove unused phi and increment.
24032408
VPRecipeBase *CanonicalIVIncrement = Backedge->getDefiningRecipe();
24042409
CanonicalIVIncrement->eraseFromParent();
24052410
CanonicalIV->eraseFromParent();
24062411

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

2416+
VPBasicBlock *LatchExiting =
2417+
HeaderVPBB->getPredecessors()[1]->getEntryBasicBlock();
24202418
auto *LatchExitingBr = cast<VPInstruction>(LatchExiting->getTerminator());
2421-
24222419
// Skip single-iteration loop region
24232420
if (match(LatchExitingBr, m_BranchOnCond(m_True())))
24242421
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)