[llvm] [Transforms] Skip FailedRequestedVectorization warning for OpenMP parallel loops (PR #203465)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 23:18:01 PDT 2026


https://github.com/wpcwzy created https://github.com/llvm/llvm-project/pull/203465

OpenMP SIMD loops are represented as `!llvm.loop.parallel_accesses` annotated
parallel loops in IR.  When vectorization fails for these loops, the existing
code emits a FailedRequestedVectorization diagnostic, which -Werror promotes
to a hard error and breaks valid OpenMP programs.  Fix by skipping the warning
when the loop is annotated parallel.

>From 3aaebd64731cfbe1aeadd211c4c06c2f910cd2f5 Mon Sep 17 00:00:00 2001
From: Pincheng Wang <pincheng.plct at isrc.iscas.ac.cn>
Date: Fri, 5 Jun 2026 10:01:42 +0800
Subject: [PATCH] [Transforms][LoopTransformWarning] Suppress
 FailedRequestedVectorization for OpenMP parallel loops and wrap over-long
 diagnostic strings

---
 .../Scalar/WarnMissedTransforms.cpp           | 50 +++++++++++--------
 ...p-simd-vectorization-remarks-suppressed.ll | 30 +++++++++++
 2 files changed, 59 insertions(+), 21 deletions(-)
 create mode 100644 llvm/test/Transforms/LoopTransformWarning/omp-simd-vectorization-remarks-suppressed.ll

diff --git a/llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp b/llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
index e53019768e881..71eff1ca8f918 100644
--- a/llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
+++ b/llvm/lib/Transforms/Scalar/WarnMissedTransforms.cpp
@@ -46,28 +46,36 @@ static void warnAboutLeftoverTransformations(Loop *L,
   }
 
   if (hasVectorizeTransformation(L) == TM_ForcedByUser) {
-    LLVM_DEBUG(dbgs() << "Leftover vectorization transformation\n");
-    std::optional<ElementCount> VectorizeWidth =
-        getOptionalElementCountLoopAttribute(L);
-    std::optional<int> InterleaveCount =
-        getOptionalIntLoopAttribute(L, "llvm.loop.interleave.count");
+    // OpenMP SIMD loops are represented as annotated parallel loops.  They can
+    // still legally execute without loop-vectorization, so avoid turning these
+    // cases into transform-warning diagnostics that are commonly promoted to
+    // hard errors by -Werror builds.
+    if (!L->isAnnotatedParallel()) {
+      LLVM_DEBUG(dbgs() << "Leftover vectorization transformation\n");
+      std::optional<ElementCount> VectorizeWidth =
+          getOptionalElementCountLoopAttribute(L);
+      std::optional<int> InterleaveCount =
+          getOptionalIntLoopAttribute(L, "llvm.loop.interleave.count");
 
-    if (!VectorizeWidth || VectorizeWidth->isVector())
-      ORE->emit(
-          DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
-                                            "FailedRequestedVectorization",
-                                            L->getStartLoc(), L->getHeader())
-          << "loop not vectorized: the optimizer was unable to perform the "
-             "requested transformation; the transformation might be disabled "
-             "or specified as part of an unsupported transformation ordering");
-    else if (InterleaveCount.value_or(0) != 1)
-      ORE->emit(
-          DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
-                                            "FailedRequestedInterleaving",
-                                            L->getStartLoc(), L->getHeader())
-          << "loop not interleaved: the optimizer was unable to perform the "
-             "requested transformation; the transformation might be disabled "
-             "or specified as part of an unsupported transformation ordering");
+      if (!VectorizeWidth || VectorizeWidth->isVector())
+        ORE->emit(
+            DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
+                                              "FailedRequestedVectorization",
+                                              L->getStartLoc(), L->getHeader())
+            << "loop not vectorized: the optimizer was unable to perform the "
+               "requested transformation; the transformation might be disabled "
+               "or specified as part of an unsupported transformation "
+               "ordering");
+      else if (InterleaveCount.value_or(0) != 1)
+        ORE->emit(
+            DiagnosticInfoOptimizationFailure(DEBUG_TYPE,
+                                              "FailedRequestedInterleaving",
+                                              L->getStartLoc(), L->getHeader())
+            << "loop not interleaved: the optimizer was unable to perform the "
+               "requested transformation; the transformation might be disabled "
+               "or specified as part of an unsupported transformation "
+               "ordering");
+    }
   }
 
   if (hasDistributeTransformation(L) == TM_ForcedByUser) {
diff --git a/llvm/test/Transforms/LoopTransformWarning/omp-simd-vectorization-remarks-suppressed.ll b/llvm/test/Transforms/LoopTransformWarning/omp-simd-vectorization-remarks-suppressed.ll
new file mode 100644
index 0000000000000..6f7773ac034ae
--- /dev/null
+++ b/llvm/test/Transforms/LoopTransformWarning/omp-simd-vectorization-remarks-suppressed.ll
@@ -0,0 +1,30 @@
+; RUN: opt -passes=transform-warning -disable-output -pass-remarks-missed=transform-warning -pass-remarks-analysis=transform-warning < %s 2>&1 | FileCheck -allow-empty %s
+;
+; OpenMP SIMD loops are represented as annotated parallel loops. Keep
+; transform-warning from emitting FailedRequestedVectorization for these loops.
+;
+; CHECK-NOT: FailedRequestedVectorization
+; CHECK-NOT: loop not vectorized
+
+define void @test(ptr %x, ptr %c) {
+entry:
+  br label %loop
+
+loop:
+  %i = phi i64 [ 0, %entry ], [ %next, %loop ]
+  %src.ptr = getelementptr inbounds double, ptr %c, i64 %i
+  %v = load double, ptr %src.ptr, align 8, !llvm.access.group !1
+  %dst.ptr = getelementptr inbounds double, ptr %x, i64 %i
+  store double %v, ptr %dst.ptr, align 8, !llvm.access.group !1
+  %next = add nuw nsw i64 %i, 1
+  %done = icmp eq i64 %next, 64
+  br i1 %done, label %exit, label %loop, !llvm.loop !0
+
+exit:
+  ret void
+}
+
+!0 = distinct !{!0, !2, !3}
+!1 = distinct !{}
+!2 = !{!"llvm.loop.vectorize.enable", i1 true}
+!3 = !{!"llvm.loop.parallel_accesses", !1}



More information about the llvm-commits mailing list