[Mlir-commits] [mlir] [mlir][affine] Verify `map` of affineMaxMinOp has at least one result (PR #108699)

Longsheng Mou llvmlistbot at llvm.org
Sat Sep 14 06:22:52 PDT 2024


https://github.com/CoTinker created https://github.com/llvm/llvm-project/pull/108699

This PR fixes a bug in `verifyAffineMinMaxOp` that allowed `map` of `affine.max` and `affine.min` to have an empty result. Fixes #108368.

>From 6e6002938b789adba02f2cbef7d0f6e5a1e6099d Mon Sep 17 00:00:00 2001
From: Longsheng Mou <moulongsheng at huawei.com>
Date: Sat, 14 Sep 2024 21:11:29 +0800
Subject: [PATCH] [mlir][affine] Verify `map` of affineMaxMinOp has at least
 one result

This PR fixes a bug in `verifyAffineMinMaxOp` that allowed `map` of
`affine.max` and `affine.min` to have an empty result.
---
 mlir/lib/Dialect/Affine/IR/AffineOps.cpp |  3 +++
 mlir/test/Dialect/Affine/invalid.mlir    | 32 ++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index 11b6b7cf5fd5a7..b89888e6aa83f7 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -3214,6 +3214,9 @@ static LogicalResult verifyAffineMinMaxOp(T op) {
       op.getMap().getNumDims() + op.getMap().getNumSymbols())
     return op.emitOpError(
         "operand count and affine map dimension and symbol count must match");
+
+  if (op.getMap().getNumResults() == 0)
+    return op.emitOpError("affine map expect at least one result");
   return success();
 }
 
diff --git a/mlir/test/Dialect/Affine/invalid.mlir b/mlir/test/Dialect/Affine/invalid.mlir
index 60f13102f55156..869ea712bb3690 100644
--- a/mlir/test/Dialect/Affine/invalid.mlir
+++ b/mlir/test/Dialect/Affine/invalid.mlir
@@ -178,6 +178,22 @@ func.func @affine_min(%arg0 : index, %arg1 : index, %arg2 : index) {
 
 // -----
 
+func.func @affine_min() {
+  // expected-error at +1 {{'affine.min' op affine map expect at least one result}}
+  %0 = affine.min affine_map<() -> ()> ()
+  return
+}
+
+// -----
+
+func.func @affine_min(%arg0 : index) {
+  // expected-error at +1 {{'affine.min' op affine map expect at least one result}}
+  %0 = affine.min affine_map<(d0) -> ()> (%arg0)
+  return
+}
+
+// -----
+
 func.func @affine_max(%arg0 : index, %arg1 : index, %arg2 : index) {
   // expected-error at +1 {{operand count and affine map dimension and symbol count must match}}
   %0 = affine.max affine_map<(d0) -> (d0)> (%arg0, %arg1)
@@ -205,6 +221,22 @@ func.func @affine_max(%arg0 : index, %arg1 : index, %arg2 : index) {
 
 // -----
 
+func.func @affine_max() {
+  // expected-error at +1 {{'affine.max' op affine map expect at least one result}}
+  %0 = affine.max affine_map<() -> ()> ()
+  return
+}
+
+// -----
+
+func.func @affine_max(%arg0 : index) {
+  // expected-error at +1 {{'affine.max' op affine map expect at least one result}}
+  %0 = affine.max affine_map<(d0) -> ()> (%arg0)
+  return
+}
+
+// -----
+
 func.func @affine_parallel(%arg0 : index, %arg1 : index, %arg2 : index) {
   // expected-error at +1 {{the number of region arguments (1) and the number of map groups for lower (2) and upper bound (2), and the number of steps (2) must all match}}
   affine.parallel (%i) = (0, 0) to (100, 100) step (10, 10) {



More information about the Mlir-commits mailing list