https://github.com/gbossu updated https://github.com/llvm/llvm-project/pull/226948
From fbfacd9f96eaf8f58fad3c06125f875d1c35ba01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Bossu?= <[email protected]> Date: Wed, 7 Oct 2026 14:33:07 +0000 Subject: [PATCH 1/2] -scalable-vectorization=on should not override !loop MD --- .../Transforms/Vectorize/LoopVectorizationLegality.cpp | 9 +++++++-- .../LoopVectorize/pragma-disable-with-scalable-prefer.ll | 8 +++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp index 69ce0cb8a145f..9edd25e48fb08 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp @@ -118,8 +118,9 @@ LoopVectorizeHints::LoopVectorizeHints(const Loop *L, [TTI](ScalableForceKind ForceScalableHint, ScalableForceKind ForceScalableOpt, unsigned ForceWidth, ElementCount ForceWidthOpt) -> ScalableForceKind { - // -scalable-vectorization=(always|off|on) has the highest precedence. - if (ForceScalableOpt != SK_Unspecified) + // -scalable-vectorization=(always|off) has the highest precedence. + if (ForceScalableOpt == SK_AlwaysScalable || + ForceScalableOpt == SK_FixedWidthOnly) return ForceScalableOpt; // Then, consider loop hints. @@ -128,6 +129,10 @@ LoopVectorizeHints::LoopVectorizeHints(const Loop *L, ForceScalableHint == SK_FixedWidthOnly) return ForceScalableHint; + // Then, -scalable-vectorization=on. + if (ForceScalableOpt == SK_PreferScalable) + return SK_PreferScalable; + // Then, infer scalability from a preferred VF. assert(ForceScalableOpt == SK_Unspecified); if (ForceWidthOpt.isScalable()) diff --git a/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-prefer.ll b/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-prefer.ll index 70b579f999c61..b03c205b42c89 100644 --- a/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-prefer.ll +++ b/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-prefer.ll @@ -3,12 +3,10 @@ ; Clang lowers "#pragma clang loop vectorize(disable) interleave_count(1)" to ; width 1, scalable.disable and interleave count 1. -; Currently, -scalable-vectorization=preferred overrides the user VF=1 and -; re-enables vectorisation, with VF = vscale x 1. +; -scalable-vectorization=preferred must not override the user VF=1 and +; re-enable vectorisation. ; CHECK-LABEL: define void @repro( -; CHECK: vector.body: -; CHECK: load <vscale x 1 x i8> -; CHECK: store <vscale x 1 x i8> +; CHECK-NOT: vector.body: define void @repro(ptr %out, ptr %in, i32 %tc) { entry: From c55162c1e8f3027cda9889d6f8e8a7ddd059b9cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Bossu?= <[email protected]> Date: Mon, 12 Oct 2026 12:12:35 +0000 Subject: [PATCH 2/2] Have pragmas take precedence over -scalable-vectorization --- .../Vectorize/LoopVectorizationLegality.cpp | 15 +++++---------- .../pragma-disable-with-scalable-always.ll | 8 +++----- .../pragma-fixed-width-with-scalable-always.ll | 6 +++--- .../pragma-scalable-width-with-scalable-off.ll | 6 ++++-- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp index 9edd25e48fb08..3e24c07868909 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp @@ -59,7 +59,7 @@ static cl::opt<LoopVectorizeHints::ScalableForceKind> "scalable-vectorization", cl::init(LoopVectorizeHints::SK_Unspecified), cl::Hidden, cl::desc("Control whether the compiler can use scalable vectors to " - "vectorize a loop"), + "vectorize a loop. This does not override loop pragmas."), cl::values( clEnumValN(LoopVectorizeHints::SK_FixedWidthOnly, "off", "Scalable vectorization is disabled."), @@ -118,20 +118,15 @@ LoopVectorizeHints::LoopVectorizeHints(const Loop *L, [TTI](ScalableForceKind ForceScalableHint, ScalableForceKind ForceScalableOpt, unsigned ForceWidth, ElementCount ForceWidthOpt) -> ScalableForceKind { - // -scalable-vectorization=(always|off) has the highest precedence. - if (ForceScalableOpt == SK_AlwaysScalable || - ForceScalableOpt == SK_FixedWidthOnly) - return ForceScalableOpt; - - // Then, consider loop hints. + // Loop hints have the highest precedence. assert(ForceScalableHint != SK_AlwaysScalable && "Unexpected loop hint."); if (ForceScalableHint == SK_PreferScalable || ForceScalableHint == SK_FixedWidthOnly) return ForceScalableHint; - // Then, -scalable-vectorization=on. - if (ForceScalableOpt == SK_PreferScalable) - return SK_PreferScalable; + // Then, consider -scalable-vectorization=(always|off|on). + if (ForceScalableOpt != SK_Unspecified) + return ForceScalableOpt; // Then, infer scalability from a preferred VF. assert(ForceScalableOpt == SK_Unspecified); diff --git a/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-always.ll b/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-always.ll index 33e95f32d48a6..4cc2e32666ca6 100644 --- a/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-always.ll +++ b/llvm/test/Transforms/LoopVectorize/pragma-disable-with-scalable-always.ll @@ -3,12 +3,10 @@ ; Clang lowers "#pragma clang loop vectorize(disable) interleave_count(1)" to ; width 1, scalable.disable and interleave count 1. -; Currently, -scalable-vectorization=always overrides the user VF=1 and -; re-enables vectorisation, with VF = vscale x 1. +; -scalable-vectorization=always must not override the user VF=1 and +; re-enable vectorisation. ; CHECK-LABEL: define void @repro( -; CHECK: vector.body: -; CHECK: load <vscale x 1 x i8> -; CHECK: store <vscale x 1 x i8> +; CHECK-NOT: vector.body: define void @repro(ptr %out, ptr %in, i32 %tc) { entry: diff --git a/llvm/test/Transforms/LoopVectorize/pragma-fixed-width-with-scalable-always.ll b/llvm/test/Transforms/LoopVectorize/pragma-fixed-width-with-scalable-always.ll index 8e49abc6380ea..9a7ed5db0e394 100644 --- a/llvm/test/Transforms/LoopVectorize/pragma-fixed-width-with-scalable-always.ll +++ b/llvm/test/Transforms/LoopVectorize/pragma-fixed-width-with-scalable-always.ll @@ -2,12 +2,12 @@ ; ; Clang lowers "#pragma clang loop vectorize_width(4)" and ; "interleave_count(1)" to width 4, scalable.disable, and interleave count 1. -; -scalable-vectorization=always overrides scalable.disable and forces vectorization with VF=vscale x 4. +; -scalable-vectorization=always must not override scalable.disable and force a scalable VF. ; ; CHECK-LABEL: define void @repro( ; CHECK: vector.body: -; CHECK: load <vscale x 4 x i8> -; CHECK: store <vscale x 4 x i8> +; CHECK: load <4 x i8> +; CHECK: store <4 x i8> define void @repro(ptr %out, ptr %in, i32 %tc) { entry: diff --git a/llvm/test/Transforms/LoopVectorize/pragma-scalable-width-with-scalable-off.ll b/llvm/test/Transforms/LoopVectorize/pragma-scalable-width-with-scalable-off.ll index 18c94449c8240..7be598bd03584 100644 --- a/llvm/test/Transforms/LoopVectorize/pragma-scalable-width-with-scalable-off.ll +++ b/llvm/test/Transforms/LoopVectorize/pragma-scalable-width-with-scalable-off.ll @@ -2,10 +2,12 @@ ; ; Clang lowers "#pragma clang loop vectorize_width(1, scalable)" and ; "interleave_count(1)" to width 1, scalable.enable, and interleave count 1. -; -scalable-vectorization=off overrides scalable.enable and disables vectorisation +; -scalable-vectorization=off must not override scalable.enable and disable vectorization. ; ; CHECK-LABEL: define void @repro( -; CHECK-NOT: vector.body: +; CHECK: vector.body: +; CHECK: load <vscale x 1 x i8> +; CHECK: store <vscale x 1 x i8> define void @repro(ptr %out, ptr %in, i32 %tc) { entry: _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
