[Mlir-commits] [mlir] [MLIR][SCF] Verify number of operands in scf.parallel reduce terminator (PR #171450)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Dec 9 06:37:42 PST 2025


https://github.com/Men-cotton created https://github.com/llvm/llvm-project/pull/171450

The `scf.parallel` operation expects the number of operands in its `scf.reduce` terminator to match the number of initial values provided to the loop. Previously, this mismatch was not verified, leading to assertion failures in downstream passes like `convert-scf-to-openmp`.

This patch adds a verification check to `ParallelOp::verify` to ensure that `reduceOp.getNumOperands()` equals `initValsSize`, raising a descriptive error if they differ.

Fixes: #118768

>From 26649106a111661c8ef12ca4aba3b1a57b1913a2 Mon Sep 17 00:00:00 2001
From: mencotton <mencotton0410 at gmail.com>
Date: Tue, 9 Dec 2025 23:32:38 +0900
Subject: [PATCH] [MLIR][SCF] Verify number of operands in scf.parallel reduce
 terminator

---
 mlir/lib/Dialect/SCF/IR/SCF.cpp    |  5 +++++
 mlir/test/Dialect/SCF/invalid.mlir | 14 ++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp
index c75528a76c999..bb18b2a1e5abc 100644
--- a/mlir/lib/Dialect/SCF/IR/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp
@@ -3152,6 +3152,11 @@ LogicalResult ParallelOp::verify() {
     return emitOpError() << "expects number of results: " << resultsSize
                          << " to be the same as number of initial values: "
                          << initValsSize;
+  if (reduceOp.getNumOperands() != initValsSize)
+    return emitOpError() << "expects number of operands in the terminator: "
+                         << reduceOp.getNumOperands()
+                         << " to be the same as number of initial values: "
+                         << initValsSize;
 
   // Check that the types of the results and reductions are the same.
   for (int64_t i = 0; i < static_cast<int64_t>(reductionsSize); ++i) {
diff --git a/mlir/test/Dialect/SCF/invalid.mlir b/mlir/test/Dialect/SCF/invalid.mlir
index 3f481ad5dbba7..e2edeb6805864 100644
--- a/mlir/test/Dialect/SCF/invalid.mlir
+++ b/mlir/test/Dialect/SCF/invalid.mlir
@@ -274,6 +274,20 @@ func.func @parallel_different_types_of_results_and_reduces(
 
 // -----
 
+// The scf.parallel operation requires the number of operands in the terminator
+// (scf.reduce) to match the number of initial values provided to the loop.
+func.func @invalid_parallel_reduce_operand_count() {
+  %c0 = arith.constant 0 : index
+  %c1 = arith.constant 1 : index
+  // expected-error @+1 {{expects number of operands in the terminator: 1 to be the same as number of initial values: 0}}
+  scf.parallel (%arg1) = (%c0) to (%c1) step (%c1) {
+    scf.reduce(%c1 : index)
+  }
+  return
+}
+
+// -----
+
 func.func @top_level_reduce(%arg0 : f32) {
   // expected-error at +1 {{expects parent op 'scf.parallel'}}
   scf.reduce(%arg0 : f32) {



More information about the Mlir-commits mailing list