[llvm] 38fb876 - [LV][NFC] Move up getEpilogueTailLowering() (#222358)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 10 04:36:17 PDT 2026
Author: Hassnaa Hamdi
Date: 2026-09-10T11:36:11Z
New Revision: 38fb876bf1e9ce9c5ccdc6f38fac4eb60ac66fce
URL: https://github.com/llvm/llvm-project/commit/38fb876bf1e9ce9c5ccdc6f38fac4eb60ac66fce
DIFF: https://github.com/llvm/llvm-project/commit/38fb876bf1e9ce9c5ccdc6f38fac4eb60ac66fce.diff
LOG: [LV][NFC] Move up getEpilogueTailLowering() (#222358)
This patch only moves up `getEpilogueTailLowering()` so that it can be
used by `planForEpilogueTF` as needed here: https://github.com/llvm/llvm-project/pull/208764
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 82b1faaaa9b23..dd4616d4b0cb4 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -3355,6 +3355,79 @@ static bool hasFindLastReductionPhi(VPlan &Plan) {
RedPhi->getRecurrenceKind());
});
}
+
+/// Determine how to lower the epilogue for the vector epilogue loop.
+/// Check if there are any conflicts that prevent tail-folding the epilogue.
+/// \return CM_EpilogueNotNeededFoldTail if epilogue tail-folding is possible,
+/// otherwise CM_EpilogueAllowed.
+static EpilogueLowering
+getEpilogueTailLowering(const LoopVectorizationCostModel &MainCM, const Loop *L,
+ OptimizationRemarkEmitter *ORE,
+ LoopVectorizationLegality &LVL,
+ LoopVectorizeHints &Hints) {
+ // Epilogue TF is only enabled when explicitly requested via command line.
+ if (!EpilogueTailFoldingPolicy.getNumOccurrences() ||
+ EpilogueTailFoldingPolicy != TailFoldingPolicyTy::PreferFoldTail)
+ return CM_EpilogueAllowed;
+
+ if (!EnableEpilogueVectorization) {
+ reportVectorizationInfo(
+ "Options conflict, epilogue vectorization is disallowed while "
+ "epilogue tail-folding allowed!",
+ "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ if (!Hints.getWidth() || !hasForcedEpilogueVF()) {
+ reportVectorizationInfo("For now, epilogue tail-folding can't be "
+ "applied without forced main/epilogue loop VF",
+ "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ if (ElementCount::isKnownLE(Hints.getWidth(), EpilogueVectorizationForceVF)) {
+ reportVectorizationInfo("For now, epilogue tail-folding can't be applied "
+ "when VF of the main loop <= VF of the epilogue",
+ "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ if (!L->isInnermost()) {
+ reportVectorizationInfo(
+ "Epilogue tail-folding is not supported for outer loop",
+ "InvalidTailFoldedEpilogue", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ // If scalar epilogue is explicitly required, we can't apply TF.
+ if (MainCM.requiresScalarEpilogue(/*IsVectorizing*/ true)) {
+ reportVectorizationInfo(
+ "Epilogue tail-folding can't be applied because scalar epilogue is "
+ "required. Fall back to a normal epilogue",
+ "InvalidTailFoldedEpilogue", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ // If having epilogue is NOT allowed, then no epilogue to apply TF for.
+ if (!MainCM.isEpilogueAllowed()) {
+ reportVectorizationInfo("Not applying tail-folding to the epilogue, since "
+ "no epilogue is allowed.",
+ "InvalidTailFoldedEpilogue", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ if (L->getExitingBlock() != L->getLoopLatch() ||
+ LVL.hasUncountableEarlyExit()) {
+ reportVectorizationInfo(
+ "Epilogue tail-folding is not supported yet for early-exit loops",
+ "InvalidTailFoldedEpilogue", ORE, L);
+ return CM_EpilogueAllowed;
+ }
+
+ // We can apply tail-folding on the vectorized epilogue loop.
+ return CM_EpilogueNotNeededFoldTail;
+}
+
bool VFSelectionContext::isEpilogueVectorizationProfitable(
const ElementCount VF, const unsigned IC) const {
// FIXME: We need a much better cost-model to take
diff erent parameters such
@@ -7035,78 +7108,6 @@ getEpilogueLowering(Function *F, Loop *L, LoopVectorizeHints &Hints,
return CM_EpilogueAllowed;
}
-/// Determine how to lower the epilogue for the vector epilogue loop.
-/// Check if there are any conflicts that prevent tail-folding the epilogue.
-/// \return CM_EpilogueNotNeededFoldTail if epilogue tail-folding is possible,
-/// otherwise CM_EpilogueAllowed.
-static EpilogueLowering
-getEpilogueTailLowering(const LoopVectorizationCostModel &MainCM, const Loop *L,
- OptimizationRemarkEmitter *ORE,
- LoopVectorizationLegality &LVL,
- LoopVectorizeHints &Hints) {
- // Epilogue TF is only enabled when explicitly requested via command line.
- if (!EpilogueTailFoldingPolicy.getNumOccurrences() ||
- EpilogueTailFoldingPolicy != TailFoldingPolicyTy::PreferFoldTail)
- return CM_EpilogueAllowed;
-
- if (!EnableEpilogueVectorization) {
- reportVectorizationInfo(
- "Options conflict, epilogue vectorization is disallowed while "
- "epilogue tail-folding allowed!",
- "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- if (!Hints.getWidth() || !hasForcedEpilogueVF()) {
- reportVectorizationInfo("For now, epilogue tail-folding can't be "
- "applied without forced main/epilogue loop VF",
- "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- if (ElementCount::isKnownLE(Hints.getWidth(), EpilogueVectorizationForceVF)) {
- reportVectorizationInfo("For now, epilogue tail-folding can't be applied "
- "when VF of the main loop <= VF of the epilogue",
- "UnsupportedEpilogueTailFoldingPolicy", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- if (!L->isInnermost()) {
- reportVectorizationInfo(
- "Epilogue tail-folding is not supported for outer loop",
- "InvalidTailFoldedEpilogue", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- // If scalar epilogue is explicitly required, we can't apply TF.
- if (MainCM.requiresScalarEpilogue(/*IsVectorizing*/ true)) {
- reportVectorizationInfo(
- "Epilogue tail-folding can't be applied because scalar epilogue is "
- "required. Fall back to a normal epilogue",
- "InvalidTailFoldedEpilogue", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- // If having epilogue is NOT allowed, then no epilogue to apply TF for.
- if (!MainCM.isEpilogueAllowed()) {
- reportVectorizationInfo("Not applying tail-folding to the epilogue, since "
- "no epilogue is allowed.",
- "InvalidTailFoldedEpilogue", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- if (L->getExitingBlock() != L->getLoopLatch() ||
- LVL.hasUncountableEarlyExit()) {
- reportVectorizationInfo(
- "Epilogue tail-folding is not supported yet for early-exit loops",
- "InvalidTailFoldedEpilogue", ORE, L);
- return CM_EpilogueAllowed;
- }
-
- // We can apply tail-folding on the vectorized epilogue loop.
- return CM_EpilogueNotNeededFoldTail;
-}
-
// Emit a remark if there are stores to floats that required a floating point
// extension. If the vectorized loop was generated with floating point there
// will be a performance penalty from the conversion overhead and the change in
More information about the llvm-commits
mailing list