[llvm] [LV] Emit better debug and opt-report messages when vectorization is disallowed in the LoopVectorizer (PR #158513)

Tibor Győri via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 15 10:13:54 PDT 2025


https://github.com/TiborGY updated https://github.com/llvm/llvm-project/pull/158513

>From 81f1800118aab3462dbbd03023c2b052f7d455df Mon Sep 17 00:00:00 2001
From: GYT <tiborgyri at gmail.com>
Date: Sun, 14 Sep 2025 23:19:37 +0200
Subject: [PATCH 1/3] Emit better debug and opt-report messages when
 vectorization is disallowed in the LoopVectorizer

formatting

formatting2

fix ;) vs. ); typos

formatting3
---
 .../Vectorize/LoopVectorizationLegality.cpp   | 35 ++++++++++++++++---
 1 file changed, 31 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index ff35db14f7094..9010ca62aeee7 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -182,14 +182,41 @@ void LoopVectorizeHints::setAlreadyVectorized() {
 bool LoopVectorizeHints::allowVectorization(
     Function *F, Loop *L, bool VectorizeOnlyWhenForced) const {
   if (getForce() == LoopVectorizeHints::FK_Disabled) {
-    LLVM_DEBUG(dbgs() << "LV: Not vectorizing: #pragma vectorize disable.\n");
-    emitRemarkWithHints();
+    if (Force.Value == LoopVectorizeHints::FK_Disabled) {
+      LLVM_DEBUG(dbgs() << "LV: Not vectorizing: #pragma vectorize disable.\n");
+      ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedExplicitlyDisabled",
+                                        TheLoop->getStartLoc(),
+                                        TheLoop->getHeader())
+               << "loop not vectorized: vectorization is explicitly disabled");
+    } else if (hasDisableAllTransformsHint(TheLoop)) {
+      LLVM_DEBUG(
+          dbgs() << "LV: Not vectorizing: loop hasDisableAllTransformsHint.\n");
+      ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedTrafoDisabled",
+                                        TheLoop->getStartLoc(),
+                                        TheLoop->getHeader())
+               << "loop not vectorized: loop transformations are disabled");
+    } else {
+      // This should be unreachable unless there is a bug.
+      LLVM_DEBUG(
+          dbgs() << "LV: [FIXME] Not vectorizing: loop vect disabled for "
+                    "an unknown reason!\n");
+      ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedUnknown",
+                                        TheLoop->getStartLoc(),
+                                        TheLoop->getHeader())
+               << "loop not vectorized: unknown reason, please file a bug "
+                  "report on the LLVM issue tracker");
+    }
     return false;
   }
 
   if (VectorizeOnlyWhenForced && getForce() != LoopVectorizeHints::FK_Enabled) {
-    LLVM_DEBUG(dbgs() << "LV: Not vectorizing: No #pragma vectorize enable.\n");
-    emitRemarkWithHints();
+    LLVM_DEBUG(dbgs() << "LV: Not vectorizing: VectorizeOnlyWhenForced is set, "
+                         "and no #pragma vectorize enable.\n");
+    ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedForceOnly",
+                                      TheLoop->getStartLoc(),
+                                      TheLoop->getHeader())
+             << "loop not vectorized: only vectorizing loops that "
+                "explicitly request it");
     return false;
   }
 

>From 6d941ff51d221e03a9d575086f4cec5efdf43dd2 Mon Sep 17 00:00:00 2001
From: GYT <tiborgyri at gmail.com>
Date: Mon, 15 Sep 2025 12:22:19 +0200
Subject: [PATCH 2/3] Trafo -> Transforms

---
 llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index 9010ca62aeee7..2dbab7d485ec0 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -191,7 +191,7 @@ bool LoopVectorizeHints::allowVectorization(
     } else if (hasDisableAllTransformsHint(TheLoop)) {
       LLVM_DEBUG(
           dbgs() << "LV: Not vectorizing: loop hasDisableAllTransformsHint.\n");
-      ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedTrafoDisabled",
+      ORE.emit(OptimizationRemarkMissed(LV_NAME, "MissedTransformsDisabled",
                                         TheLoop->getStartLoc(),
                                         TheLoop->getHeader())
                << "loop not vectorized: loop transformations are disabled");

>From c0e6aec88cd15bc307d7b9a63828ef4fb2cbe7bb Mon Sep 17 00:00:00 2001
From: GYT <tiborgyri at gmail.com>
Date: Mon, 15 Sep 2025 19:13:41 +0200
Subject: [PATCH 3/3] Testing part 1: explicitly disabled code path

---
 .../check-disabled-vectorization-msgs.ll      | 47 +++++++++++++++++++
 1 file changed, 47 insertions(+)
 create mode 100644 llvm/test/Transforms/LoopVectorize/check-disabled-vectorization-msgs.ll

diff --git a/llvm/test/Transforms/LoopVectorize/check-disabled-vectorization-msgs.ll b/llvm/test/Transforms/LoopVectorize/check-disabled-vectorization-msgs.ll
new file mode 100644
index 0000000000000..be903d3ff61b8
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/check-disabled-vectorization-msgs.ll
@@ -0,0 +1,47 @@
+; This test checks that we emit only the correct debug message and
+; optimization remark when the loop vectorizer is disabled by loop metadata.
+
+; REQUIRES: asserts
+; RUN: opt -passes=loop-vectorize -pass-remarks=loop-vectorize \
+; RUN:     -pass-remarks-missed=loop-vectorize \
+; RUN:     -pass-remarks-analysis=loop-vectorize -debug -disable-output \
+; RUN:     < %s 2>&1 | FileCheck %s
+; CHECK-NOT: LV: We can vectorize this loop
+; CHECK-NOT: LV: Not vectorizing: loop hasDisableAllTransformsHint
+; CHECK-NOT: LV: [FIXME] Not vectorizing: loop vect disabled for an unknown reason
+; CHECK-NOT: LV: Not vectorizing: VectorizeOnlyWhenForced is set
+; CHECK-NOT: LV: Not vectorizing: Disabled/already vectorized
+; CHECK-NOT: LV: Not vectorizing: Cannot prove legality
+; CHECK: LV: Loop hints: force=disabled
+; CHECK: LV: Not vectorizing: #pragma vectorize disable.
+; CHECK: remark:
+; CHECK-SAME: loop not vectorized: vectorization is explicitly disabled
+; CHECK: LV: Loop hints prevent vectorization
+
+define dso_local noundef nofpclass(nan inf) double @_Z15CompareDistmatsPKdS0_(ptr noundef readonly captures(none) %distmat1, ptr noundef readonly captures(none) %distmat2) local_unnamed_addr {
+entry:
+  br label %for.body
+
+for.cond.cleanup:                                 ; preds = %for.body
+  %add.lcssa = phi double [ %add, %for.body ]
+  %div = fmul fast double %add.lcssa, 0x3FB1111111111111
+  %0 = tail call fast double @llvm.sqrt.f64(double %div)
+  ret double %0
+
+for.body:                                         ; preds = %entry, %for.body
+  %i.014 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
+  %RMSD.013 = phi double [ 0.000000e+00, %entry ], [ %add, %for.body ]
+  %arrayidx = getelementptr inbounds nuw double, ptr %distmat1, i64 %i.014
+  %1 = load double, ptr %arrayidx, align 8
+  %arrayidx1 = getelementptr inbounds nuw double, ptr %distmat2, i64 %i.014
+  %2 = load double, ptr %arrayidx1, align 8
+  %sub = fsub fast double %1, %2
+  %mul = fmul fast double %sub, %sub
+  %add = fadd fast double %mul, %RMSD.013
+  %inc = add nuw nsw i64 %i.014, 1
+  %exitcond.not = icmp eq i64 %inc, 15
+  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body, !llvm.loop !0
+}
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.vectorize.enable", i1 false}
\ No newline at end of file



More information about the llvm-commits mailing list