From 50291c28136183ed985c8c76e3a5ff801ff5ffe9 Mon Sep 17 00:00:00 2001 From: Uday Bondhugula Date: Tue, 18 Feb 2025 15:46:19 +0530 Subject: [PATCH] [MLIR][Affine] Fix affine.parallel op verifier Fix affine.parallel op verifier for missing check on zero result lower or upper bound maps. lb/ub maps should have at least one result. Fixes: https://github.com/llvm/llvm-project/issues/120186 --- mlir/lib/Dialect/Affine/IR/AffineOps.cpp | 18 ++++++++++++++---- mlir/test/Dialect/Affine/invalid.mlir | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp index 147f5dd7a24b6..cfc51ad2a1524 100644 --- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp +++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp @@ -3918,14 +3918,24 @@ LogicalResult AffineParallelOp::verify() { } unsigned expectedNumLBResults = 0; - for (APInt v : getLowerBoundsGroups()) - expectedNumLBResults += v.getZExtValue(); + for (APInt v : getLowerBoundsGroups()) { + unsigned results = v.getZExtValue(); + if (results == 0) + return emitOpError() + << "expected lower bound map to have at least one result"; + expectedNumLBResults += results; + } if (expectedNumLBResults != getLowerBoundsMap().getNumResults()) return emitOpError() << "expected lower bounds map to have " << expectedNumLBResults << " results"; unsigned expectedNumUBResults = 0; - for (APInt v : getUpperBoundsGroups()) - expectedNumUBResults += v.getZExtValue(); + for (APInt v : getUpperBoundsGroups()) { + unsigned results = v.getZExtValue(); + if (results == 0) + return emitOpError() + << "expected upper bound map to have at least one result"; + expectedNumUBResults += results; + } if (expectedNumUBResults != getUpperBoundsMap().getNumResults()) return emitOpError() << "expected upper bounds map to have " << expectedNumUBResults << " results"; diff --git a/mlir/test/Dialect/Affine/invalid.mlir b/mlir/test/Dialect/Affine/invalid.mlir index 44e484b9ba598..da2913e3fec28 100644 --- a/mlir/test/Dialect/Affine/invalid.mlir +++ b/mlir/test/Dialect/Affine/invalid.mlir @@ -297,6 +297,24 @@ func.func @affine_parallel(%arg0 : index, %arg1 : index, %arg2 : index) { // ----- +func.func @no_upper_bound_affine_parallel() { + // expected-error@+1 {{expected lower bound map to have at least one result}} + affine.parallel (%arg2) = (max()) to (1) { + } + return +} + +// ----- + +func.func @no_upper_bound_affine_parallel() { + // expected-error@+1 {{expected upper bound map to have at least one result}} + affine.parallel (%arg3) = (0) to (min()) { + } + return +} + +// ----- + func.func @vector_load_invalid_vector_type() { %0 = memref.alloc() : memref<100xf32> affine.for %i0 = 0 to 16 step 8 {