From 0bd07652524ebacdee166eb609fef48c50769b09 Mon Sep 17 00:00:00 2001 From: Matthias Gehre Date: Fri, 17 Jan 2025 09:06:04 +0100 Subject: [PATCH] EmitC: Allow arrays of size zero (#123292) This is allowed as a GCC extension, see https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html. --- mlir/docs/Dialects/emitc.md | 2 ++ mlir/lib/Dialect/EmitC/IR/EmitC.cpp | 4 ++-- mlir/test/Dialect/EmitC/invalid_types.mlir | 8 -------- mlir/test/Dialect/EmitC/types.mlir | 4 +++- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/mlir/docs/Dialects/emitc.md b/mlir/docs/Dialects/emitc.md index 743d70959f3d..e2288f518dae 100644 --- a/mlir/docs/Dialects/emitc.md +++ b/mlir/docs/Dialects/emitc.md @@ -16,6 +16,8 @@ The following convention is followed: floating types. * If `__bf16` is used, the code requires a compiler that supports it, such as GCC or Clang. +* If `emitc.array` with a dimension of size zero is used, then the code + requires [a GCC extension](https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html). * Else the generated code is compatible with C99. These restrictions are neither inherent to the EmitC dialect itself nor to the diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp index fdc21d6c6e24..c818dd18a3d2 100644 --- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp +++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp @@ -971,8 +971,8 @@ LogicalResult emitc::ArrayType::verify( return emitError() << "shape must not be empty"; for (int64_t dim : shape) { - if (dim <= 0) - return emitError() << "dimensions must have positive size"; + if (dim < 0) + return emitError() << "dimensions must have non-negative size"; } if (!elementType) diff --git a/mlir/test/Dialect/EmitC/invalid_types.mlir b/mlir/test/Dialect/EmitC/invalid_types.mlir index 302a345c7c4f..c39a881ff26a 100644 --- a/mlir/test/Dialect/EmitC/invalid_types.mlir +++ b/mlir/test/Dialect/EmitC/invalid_types.mlir @@ -36,14 +36,6 @@ func.func @illegal_array_missing_x( // ----- -func.func @illegal_array_non_positive_dimenson( - // expected-error @+1 {{dimensions must have positive size}} - %arg0: !emitc.array<0xi32> -) { -} - -// ----- - func.func @illegal_array_missing_type( // expected-error @+1 {{expected non-function type}} %arg0: !emitc.array<10x> diff --git a/mlir/test/Dialect/EmitC/types.mlir b/mlir/test/Dialect/EmitC/types.mlir index e3462bffc5b0..d4dd94457f39 100644 --- a/mlir/test/Dialect/EmitC/types.mlir +++ b/mlir/test/Dialect/EmitC/types.mlir @@ -17,7 +17,9 @@ func.func @array_types( // CHECK-SAME: !emitc.array<30x!emitc.ssize_t> %arg5: !emitc.array<30x!emitc.ssize_t>, // CHECK-SAME: !emitc.array<30x!emitc.ptrdiff_t> - %arg6: !emitc.array<30x!emitc.ptrdiff_t> + %arg6: !emitc.array<30x!emitc.ptrdiff_t>, + // CHECK-SAME: !emitc.array<0xi64> + %arg7: !emitc.array<0xi64> ) { return }