[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