[llvm] [LV] Add a statistic for early exit vectorization (PR #145730)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 25 08:59:29 PDT 2025
https://github.com/annamthomas created https://github.com/llvm/llvm-project/pull/145730
We currently do not vectorize the epilog loops with early-exits, but the
stats are updated there as well for completeness.
>From be3a9ca9164e12131ec1ae8354fa25430823e40a Mon Sep 17 00:00:00 2001
From: Anna Thomas <anna at azul.com>
Date: Wed, 25 Jun 2025 11:44:56 -0400
Subject: [PATCH] [LV] Add a statistic for early exit vectorization
We currently do not vectorize the epilog loops with early-exits, but the
stats are updated there as well for completeness.
---
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 11 +++++++++++
.../Transforms/LoopVectorize/single_early_exit.ll | 2 +-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 5eda2003920e6..4f365b9f990bf 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -175,6 +175,8 @@ const char LLVMLoopVectorizeFollowupEpilogue[] =
STATISTIC(LoopsVectorized, "Number of loops vectorized");
STATISTIC(LoopsAnalyzed, "Number of loops analyzed for vectorization");
STATISTIC(LoopsEpilogueVectorized, "Number of epilogues vectorized");
+STATISTIC(LoopsEarlyExitVectorized, "Number of early exit loops vectorized");
+
static cl::opt<bool> EnableEpilogueVectorization(
"enable-epilogue-vectorization", cl::init(true), cl::Hidden,
@@ -10291,6 +10293,9 @@ bool LoopVectorizePass::processLoop(Loop *L) {
auto ExpandedSCEVs = LVP.executePlan(EPI.MainLoopVF, EPI.MainLoopUF,
*BestMainPlan, MainILV, DT, false);
++LoopsVectorized;
+ // TODO: Currently unsupported for early exits.
+ if (BestPlan.hasEarlyExit())
+ ++LoopsEarlyExitVectorized;
// Second pass vectorizes the epilogue and adjusts the control flow
// edges from the first pass.
@@ -10319,6 +10324,10 @@ bool LoopVectorizePass::processLoop(Loop *L) {
Inc->setIncomingValueForBlock(BypassBlock, V);
}
++LoopsEpilogueVectorized;
+ // TODO: Currently unsupported for early exits.
+ if (BestEpiPlan.hasEarlyExit())
+ ++LoopsEarlyExitVectorized;
+
if (!Checks.hasChecks())
DisableRuntimeUnroll = true;
@@ -10328,6 +10337,8 @@ bool LoopVectorizePass::processLoop(Loop *L) {
Checks, BestPlan);
LVP.executePlan(VF.Width, IC, BestPlan, LB, DT, false);
++LoopsVectorized;
+ if (BestPlan.hasEarlyExit())
+ ++LoopsEarlyExitVectorized;
// Add metadata to disable runtime unrolling a scalar loop when there
// are no runtime checks about strides and memory. A scalar loop that is
diff --git a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
index 00e21f102038a..c7b4a8f915405 100644
--- a/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
+++ b/llvm/test/Transforms/LoopVectorize/single_early_exit.ll
@@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S < %s -p loop-vectorize -enable-early-exit-vectorization -force-vector-width=4 | FileCheck %s
-declare void @init_mem(ptr, i64);
+eclare void @init_mem(ptr, i64);
define i64 @same_exit_block_phi_of_consts() {
More information about the llvm-commits
mailing list