[llvm] d659046 - [LV] Move logic to create trip count check to helper (NFC).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 12 13:38:19 PDT 2025
Author: Florian Hahn
Date: 2025-06-12T21:35:56+01:00
New Revision: d65904675ea106713937c9cce24e3d1ec0bc570a
URL: https://github.com/llvm/llvm-project/commit/d65904675ea106713937c9cce24e3d1ec0bc570a
DIFF: https://github.com/llvm/llvm-project/commit/d65904675ea106713937c9cce24e3d1ec0bc570a.diff
LOG: [LV] Move logic to create trip count check to helper (NFC).
Move the logic to create the iteration count check to a separate helper,
so it can be re-used by when creating the skeleton for epilogue
vectorization as well.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 8177b76ad5bdf..404ee6874d2a5 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -530,6 +530,9 @@ class InnerLoopVectorizer {
/// Returns (and creates if needed) the trip count of the widened loop.
Value *getOrCreateVectorTripCount(BasicBlock *InsertBlock);
+ // Create a check to see if the vector loop should be executed
+ Value *createIterationCountCheck(ElementCount VF, unsigned UF) const;
+
/// Emit a bypass check to see if the vector trip count is zero, including if
/// it overflows.
void emitIterationCountCheck(BasicBlock *Bypass);
@@ -2370,13 +2373,8 @@ void InnerLoopVectorizer::introduceCheckBlockInVPlan(BasicBlock *CheckIRBB) {
}
}
-void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
- Value *Count = getTripCount();
- // Reuse existing vector loop preheader for TC checks.
- // Note that new preheader block is generated for vector loop.
- BasicBlock *const TCCheckBlock = LoopVectorPreHeader;
- IRBuilder<> Builder(TCCheckBlock->getTerminator());
-
+Value *InnerLoopVectorizer::createIterationCountCheck(ElementCount VF,
+ unsigned UF) const {
// Generate code to check if the loop's trip count is less than VF * UF, or
// equal to it in case a scalar epilogue is required; this implies that the
// vector trip count is zero. This check also covers the case where adding one
@@ -2385,7 +2383,13 @@ void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
auto P = Cost->requiresScalarEpilogue(VF.isVector()) ? ICmpInst::ICMP_ULE
: ICmpInst::ICMP_ULT;
+ // Reuse existing vector loop preheader for TC checks.
+ // Note that new preheader block is generated for vector loop.
+ BasicBlock *const TCCheckBlock = LoopVectorPreHeader;
+ IRBuilder<> Builder(TCCheckBlock->getTerminator());
+
// If tail is to be folded, vector loop takes care of all iterations.
+ Value *Count = getTripCount();
Type *CountTy = Count->getType();
Value *CheckMinIters = Builder.getFalse();
auto CreateStep = [&]() -> Value * {
@@ -2434,7 +2438,12 @@ void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
// Don't execute the vector loop if (UMax - n) < (VF * UF).
CheckMinIters = Builder.CreateICmp(ICmpInst::ICMP_ULT, LHS, CreateStep());
}
+ return CheckMinIters;
+}
+void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
+ BasicBlock *const TCCheckBlock = LoopVectorPreHeader;
+ Value *CheckMinIters = createIterationCountCheck(VF, UF);
// Create new preheader for vector loop.
LoopVectorPreHeader = SplitBlock(TCCheckBlock, TCCheckBlock->getTerminator(),
static_cast<DominatorTree *>(nullptr), LI,
More information about the llvm-commits
mailing list