[Mlir-commits] [mlir] [mlir][SCF] Avoid crash in parallel loop unrolling test pass (PR #222644)

purnima shrivastava llvmlistbot at llvm.org
Mon Sep 14 01:49:52 PDT 2026


https://github.com/purnima-nlp updated https://github.com/llvm/llvm-project/pull/222644

>From 130af1947d37106695abacbec8c95576b7772c3e Mon Sep 17 00:00:00 2001
From: Purnima Shrivastava <purnimashrivastava05 at .com>
Date: Thu, 10 Sep 2026 18:26:05 +0530
Subject: [PATCH 1/4] [mlir][SCF] Avoid crash in parallel loop unrolling test
 pass

---
 mlir/test/Dialect/SCF/parallel-loop-unroll.mlir         | 6 ++++++
 mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
index 6e02074d18475..3aa1d341f6e5f 100644
--- a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
+++ b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
@@ -1,7 +1,13 @@
+// RUN: mlir-opt %s -test-parallel-loop-unrolling -split-input-file | FileCheck %s --check-prefix=CHECK-NO-UNROLL
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2' -split-input-file | FileCheck %s
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2 loop-depth=1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-INNER
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=3,1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-BY-3
 
+// CHECK-NO-UNROLL-LABEL: func @unroll_simple_parallel_loop
+// CHECK-NO-UNROLL: [[C1:%.*]] = arith.constant 1 : index
+// CHECK-NO-UNROLL: scf.parallel {{.*}} step ([[C1]], [[C1]], [[C1]])
+// CHECK-NO-UNROLL-NOT: affine.apply
+// CHECK-NO-UNROLL: return
 func.func @unroll_simple_parallel_loop(%src: memref<1x16x12xf32>, %dst: memref<1x16x12xf32>) {
   %c12 = arith.constant 12 : index
   %c16 = arith.constant 16 : index
diff --git a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
index 12a6a6af59fa6..c6da5b8842f77 100644
--- a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
+++ b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
@@ -46,6 +46,9 @@ struct TestParallelLoopUnrollingPass
   }
 
   void runOnOperation() override {
+    if (unrollFactors.empty())
+      return;
+
     SmallVector<scf::ParallelOp, 4> loops;
     getOperation()->walk([&](scf::ParallelOp parLoop) {
       if (getNestingDepth(parLoop) == loopDepth)

>From 61c5d1c1f32b615b81c194ce1e83e5181a432473 Mon Sep 17 00:00:00 2001
From: Purnima Shrivastava <purnimashrivastava05 at .com>
Date: Thu, 10 Sep 2026 23:37:01 +0530
Subject: [PATCH 2/4] [mlir][SCF] Guard zero parallel loop unroll factors

---
 mlir/test/Dialect/SCF/parallel-loop-unroll.mlir         | 1 +
 mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
index 3aa1d341f6e5f..38123c393b2fc 100644
--- a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
+++ b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
@@ -1,4 +1,5 @@
 // RUN: mlir-opt %s -test-parallel-loop-unrolling -split-input-file | FileCheck %s --check-prefix=CHECK-NO-UNROLL
+// RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,0' -split-input-file | FileCheck %s --check-prefix=CHECK-NO-UNROLL
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2' -split-input-file | FileCheck %s
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2 loop-depth=1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-INNER
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=3,1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-BY-3
diff --git a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
index c6da5b8842f77..47f6083c78d94 100644
--- a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
+++ b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
@@ -15,6 +15,7 @@
 #include "mlir/Dialect/SCF/Utils/Utils.h"
 #include "mlir/IR/Builders.h"
 #include "mlir/Pass/Pass.h"
+#include "llvm/ADT/STLExtras.h"
 
 using namespace mlir;
 
@@ -46,7 +47,7 @@ struct TestParallelLoopUnrollingPass
   }
 
   void runOnOperation() override {
-    if (unrollFactors.empty())
+    if (unrollFactors.empty() || llvm::is_contained(unrollFactors, 0))
       return;
 
     SmallVector<scf::ParallelOp, 4> loops;

>From 0c911d9c080644ac99e810b28a5664813b8f67f8 Mon Sep 17 00:00:00 2001
From: Purnima Shrivastava <purnimashrivastava05 at .com>
Date: Fri, 11 Sep 2026 14:12:48 +0530
Subject: [PATCH 3/4] [mlir][scf] Diagnose invalid parallel loop unroll factors

---
 mlir/test/Dialect/SCF/parallel-loop-unroll.mlir      | 12 +++++-------
 .../lib/Dialect/SCF/TestParallelLoopUnrolling.cpp    | 12 +++++++++++-
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
index 38123c393b2fc..9dbee774197bf 100644
--- a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
+++ b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
@@ -1,14 +1,9 @@
-// RUN: mlir-opt %s -test-parallel-loop-unrolling -split-input-file | FileCheck %s --check-prefix=CHECK-NO-UNROLL
-// RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,0' -split-input-file | FileCheck %s --check-prefix=CHECK-NO-UNROLL
+// RUN: not mlir-opt %s -test-parallel-loop-unrolling -split-input-file 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-FACTORS
+// RUN: not mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,0' -split-input-file 2>&1 | FileCheck %s --check-prefix=CHECK-ZERO-FACTOR
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2' -split-input-file | FileCheck %s
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2 loop-depth=1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-INNER
 // RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=3,1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-BY-3
 
-// CHECK-NO-UNROLL-LABEL: func @unroll_simple_parallel_loop
-// CHECK-NO-UNROLL: [[C1:%.*]] = arith.constant 1 : index
-// CHECK-NO-UNROLL: scf.parallel {{.*}} step ([[C1]], [[C1]], [[C1]])
-// CHECK-NO-UNROLL-NOT: affine.apply
-// CHECK-NO-UNROLL: return
 func.func @unroll_simple_parallel_loop(%src: memref<1x16x12xf32>, %dst: memref<1x16x12xf32>) {
   %c12 = arith.constant 12 : index
   %c16 = arith.constant 16 : index
@@ -22,6 +17,9 @@ func.func @unroll_simple_parallel_loop(%src: memref<1x16x12xf32>, %dst: memref<1
   return
 }
 
+// CHECK-MISSING-FACTORS: error: missing `unroll-factors` pass option
+// CHECK-ZERO-FACTOR: error: unroll factors must be non-zero
+
 // CHECK-LABEL:   func @unroll_simple_parallel_loop
 // CHECK-SAME:     ([[ARG0:%.*]]: memref<1x16x12xf32>, [[ARG1:%.*]]: memref<1x16x12xf32>)
 // CHECK-DAG:      [[C0:%.*]] = arith.constant 0 : index
diff --git a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
index 47f6083c78d94..6f7e721825c5d 100644
--- a/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
+++ b/mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp
@@ -47,8 +47,18 @@ struct TestParallelLoopUnrollingPass
   }
 
   void runOnOperation() override {
-    if (unrollFactors.empty() || llvm::is_contained(unrollFactors, 0))
+    if (unrollFactors.empty()) {
+      emitError(UnknownLoc::get(&getContext()),
+                "missing `unroll-factors` pass option");
+      signalPassFailure();
       return;
+    }
+    if (llvm::is_contained(unrollFactors, 0)) {
+      emitError(UnknownLoc::get(&getContext()),
+                "unroll factors must be non-zero");
+      signalPassFailure();
+      return;
+    }
 
     SmallVector<scf::ParallelOp, 4> loops;
     getOperation()->walk([&](scf::ParallelOp parLoop) {

>From 0574d68a4338ea8c79f25d524e040e20d2d8818f Mon Sep 17 00:00:00 2001
From: Purnima Shrivastava <purnimashrivastava05 at .com>
Date: Mon, 14 Sep 2026 14:19:17 +0530
Subject: [PATCH 4/4] [mlir][scf] Use verify-diagnostics for parallel unroll
 errors

---
 .../Dialect/SCF/parallel-loop-unroll.mlir     | 24 ++++++++++++-------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
index 9dbee774197bf..c9e9b1eb5b119 100644
--- a/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
+++ b/mlir/test/Dialect/SCF/parallel-loop-unroll.mlir
@@ -1,8 +1,19 @@
-// RUN: not mlir-opt %s -test-parallel-loop-unrolling -split-input-file 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-FACTORS
-// RUN: not mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,0' -split-input-file 2>&1 | FileCheck %s --check-prefix=CHECK-ZERO-FACTOR
-// RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2' -split-input-file | FileCheck %s
-// RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=1,2 loop-depth=1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-INNER
-// RUN: mlir-opt %s -test-parallel-loop-unrolling='unroll-factors=3,1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-BY-3
+// RUN: split-file %s %t
+// RUN: mlir-opt %t/missing-factors.mlir -test-parallel-loop-unrolling -verify-diagnostics
+// RUN: mlir-opt %t/zero-factor.mlir -test-parallel-loop-unrolling='unroll-factors=1,0' -verify-diagnostics
+// RUN: mlir-opt %t/valid.mlir -test-parallel-loop-unrolling='unroll-factors=1,2' -split-input-file | FileCheck %s
+// RUN: mlir-opt %t/valid.mlir -test-parallel-loop-unrolling='unroll-factors=1,2 loop-depth=1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-INNER
+// RUN: mlir-opt %t/valid.mlir -test-parallel-loop-unrolling='unroll-factors=3,1' -split-input-file | FileCheck %s --check-prefix CHECK-UNROLL-BY-3
+
+//--- missing-factors.mlir
+// expected-error at unknown {{missing `unroll-factors` pass option}}
+module {}
+
+//--- zero-factor.mlir
+// expected-error at unknown {{unroll factors must be non-zero}}
+module {}
+
+//--- valid.mlir
 
 func.func @unroll_simple_parallel_loop(%src: memref<1x16x12xf32>, %dst: memref<1x16x12xf32>) {
   %c12 = arith.constant 12 : index
@@ -17,9 +28,6 @@ func.func @unroll_simple_parallel_loop(%src: memref<1x16x12xf32>, %dst: memref<1
   return
 }
 
-// CHECK-MISSING-FACTORS: error: missing `unroll-factors` pass option
-// CHECK-ZERO-FACTOR: error: unroll factors must be non-zero
-
 // CHECK-LABEL:   func @unroll_simple_parallel_loop
 // CHECK-SAME:     ([[ARG0:%.*]]: memref<1x16x12xf32>, [[ARG1:%.*]]: memref<1x16x12xf32>)
 // CHECK-DAG:      [[C0:%.*]] = arith.constant 0 : index



More information about the Mlir-commits mailing list