[llvm] [LV] -scalable-vectorization=preferred should not override UserVF=1 (PR #226948)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 28 03:33:02 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Gaƫtan Bossu (gbossu)
<details>
<summary>Changes</summary>
For loops using #pragma clang loop vectorize(disable), one would expect vectorisation to be disabled regardless of -scalable-vectorization flags.
However, LV used to turn a UserVF=1 (vectorisation disabled) into UserVF=vscale x 1 when -scalable-vectorization=preferred was passed.
---
Full diff: https://github.com/llvm/llvm-project/pull/226948.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp (+5-2)
- (added) llvm/test/Transforms/LoopVectorize/disable-with-prefer-scalable.ll (+37)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
index 862470ce0de6d..fe68a03ca7e40 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp
@@ -132,8 +132,11 @@ LoopVectorizeHints::LoopVectorizeHints(const Loop *L,
// If the flag is set to force any use of scalable vectors, override the loop
// hints.
- if (ForceScalableVectorization.getValue() !=
- LoopVectorizeHints::SK_Unspecified)
+ // However: A preference must not turn a UserVF of 1, used by e.g.
+ // vectorize(disable) pragmas, into a vscale x 1 VF.
+ if (ForceScalableVectorization.getValue() != SK_Unspecified &&
+ (Width.Value != 1 ||
+ ForceScalableVectorization.getValue() != SK_PreferScalable))
Scalable = ForceScalableVectorization.getValue();
// If force-vector-width is scalable, force scalable vectorization.
diff --git a/llvm/test/Transforms/LoopVectorize/disable-with-prefer-scalable.ll b/llvm/test/Transforms/LoopVectorize/disable-with-prefer-scalable.ll
new file mode 100644
index 0000000000000..084bebf4a1202
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/disable-with-prefer-scalable.ll
@@ -0,0 +1,37 @@
+; RUN: opt -force-target-supports-scalable-vectors -scalable-vectorization=preferred -passes=loop-vectorize -S %s | FileCheck %s
+;
+; Clang lowers "#pragma clang loop vectorize(disable) interleave_count(1)" to
+; width 1 and interleave count 1.
+
+; Ensure the scalable preference does not override the usual fixed-width meaning
+; of that width hint:
+; A UserVF of 1 should disable vectorization.
+; -scalable-vectorization=preferred should not yield a VF of vscale x 1.
+;
+; CHECK-LABEL: define void @repro(
+; CHECK-NOT: vector.body:
+define void @repro(ptr %out, ptr %in, i32 %tc) {
+entry:
+ %start = zext i32 %tc to i64
+ br label %loop
+
+loop:
+ %iv = phi i64 [ %start, %entry ], [ %next, %loop ]
+ %in.ptr = getelementptr inbounds i8, ptr %in, i64 %iv
+ %value = load i8, ptr %in.ptr, align 1
+ %sum = add i8 %value, 10
+ %out.ptr = getelementptr inbounds i8, ptr %out, i64 %iv
+ store i8 %sum, ptr %out.ptr, align 1
+ %next = add nsw i64 %iv, -1
+ %next32 = and i64 %next, 4294967295
+ %done = icmp eq i64 %next32, 0
+ br i1 %done, label %exit, label %loop, !llvm.loop !0
+
+exit:
+ ret void
+}
+
+!0 = distinct !{!0, !1, !2, !3}
+!1 = !{!"llvm.loop.mustprogress"}
+!2 = !{!"llvm.loop.vectorize.width", i32 1}
+!3 = !{!"llvm.loop.interleave.count", i32 1}
``````````
</details>
https://github.com/llvm/llvm-project/pull/226948
More information about the llvm-commits
mailing list