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

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 19 01:42:25 PST 2025


Tibor =?utf-8?q?Győri?= <tibor.gyori at chem.u-szeged.hu>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,
Tibor =?utf-8?q?Győri?= <tibor.gyori at chem.u-szeged.hu>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT <tiborgyri at gmail.com>,GYT
 <tiborgyri at gmail.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/158513 at github.com>


================
@@ -0,0 +1,94 @@
+; REQUIRES: asserts
+
+; TEST 1
+; Checks that we emit only the correct debug messages and
+; optimization remark when the loop vectorizer is disabled by loop metadata.
+; RUN: opt -S -passes=loop-vectorize -pass-remarks=loop-vectorize \
+; RUN:     -pass-remarks-missed=loop-vectorize \
+; RUN:     -pass-remarks-analysis=loop-vectorize -debug \
+; RUN:     < %s 2>&1 | FileCheck --dump-input=always --check-prefixes=METADATA,BOTH %s
+; TEST 2
+; Checks that we emit only the correct debug messages and
+; optimization remark when the loop is not vectorized due to the 
+; vectorize-forced-only pass option being set.
+; Strip metadata for FORCEDONLY run, keep it for METADATA run
+; RUN: sed 's/,[[:space:]]*!llvm\.loop[[:space:]]*!0//' %s | \
+; RUN: opt -S -passes='loop-vectorize<vectorize-forced-only>' \
+; RUN:   -pass-remarks=loop-vectorize \
+; RUN:   -pass-remarks-missed=loop-vectorize \
+; RUN:   -pass-remarks-analysis=loop-vectorize -debug \
+; RUN:   2>&1 | FileCheck --dump-input=always --check-prefixes=FORCEDONLY,BOTH %s
+; TEST 3
+; Checks that we emit only the correct debug messages and
+; optimization remark when the loop vectorizer is disabled by loop metadata
+; that requests no loop transformations.
+; RUN: opt -S -passes=loop-vectorize -pass-remarks=loop-vectorize \
+; RUN:     -pass-remarks-missed=loop-vectorize \
+; RUN:     -pass-remarks-analysis=loop-vectorize -debug \
+; RUN:     -force-vector-interleave=1 -force-vector-width=2 \
+; RUN:     < %s 2>&1 | FileCheck --dump-input=always %s
+
+; BOTH-LABEL: 'disabled_loop_vectorization' from <stdin>
+; BOTH-NOT: LV: We can vectorize this loop
+; BOTH-NOT: LV: Not vectorizing: loop hasDisableAllTransformsHint
+; BOTH-NOT: LV: Not vectorizing: Disabled/already vectorized
+; BOTH-NOT: LV: Not vectorizing: Cannot prove legality
+;
+; METADATA-NOT: LV: Not vectorizing: VectorizeOnlyWhenForced is set
+; METADATA: LV: Loop hints: force=disabled
+; METADATA: LV: Not vectorizing: #pragma vectorize disable.
+; METADATA: remark:
+; METADATA-SAME: loop not vectorized: vectorization is explicitly disabled
+;
+; FORCEDONLY-NOT: LV: Not vectorizing: #pragma vectorize disable
+; FORCEDONLY: LV: Loop hints: force=?
+; FORCEDONLY: LV: Not vectorizing: VectorizeOnlyWhenForced is set, and no #pragma vectorize enable
+; FORCEDONLY: remark:
+; FORCEDONLY-SAME: loop not vectorized: only vectorizing loops that explicitly request it
+;
+; BOTH: LV: Loop hints prevent vectorization
+define void @disabled_loop_vectorization(ptr %src) {
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i64 [ 0, %entry ], [ %inc, %loop ]
+  %arrayidx = getelementptr inbounds nuw double, ptr %src, i64 %iv
+  store double 0.0, ptr %arrayidx, align 8
+  %inc = add nuw nsw i64 %iv, 1
+  %exitcond.not = icmp eq i64 %inc, 15
+  br i1 %exitcond.not, label %exit, label %loop, !llvm.loop !0
+
+exit:
+  ret void
+}
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.vectorize.enable", i1 false}
+
+; CHECK-LABEL: 'disable_nonforced' from <stdin>
+; CHECK-NOT: LV: We can vectorize this loop
+; CHECK-NOT: LV: Not vectorizing: #pragma vectorize disable.
+; 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: loop hasDisableAllTransformsHint.
+; CHECK: remark:
+; CHECK-SAME: loop not vectorized: loop transformations are disabled
+; CHECK: LV: Loop hints prevent vectorization
----------------
fhahn wrote:

I was wondering if we should also add checks for the RUN lines with FORCED-ONLY/METADATA for the second function?

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


More information about the llvm-commits mailing list