[Mlir-commits] [mlir] Fix parsing of empty complex tensors (PR #134322)
Kevin Gleason
llvmlistbot at llvm.org
Thu Apr 3 16:41:23 PDT 2025
https://github.com/GleasonK created https://github.com/llvm/llvm-project/pull/134322
After https://github.com/llvm/llvm-project/pull/133220 we had some empty complex literals (`tensor<0xcomplex<f32>>`) failing to parse.
This was largely due to the ambiguity between `shape.empty()` meaning splat (`dense<1>`) or empty literal (`dense<>`). Used type's numel to disambiguate during verification.
>From 5fcef4596c1f202fdc1e0c339edc94f147e05664 Mon Sep 17 00:00:00 2001
From: Kevin Gleason <gleasonk at google.com>
Date: Thu, 3 Apr 2025 23:38:49 +0000
Subject: [PATCH] Fix parsing of empty complex tensors
---
mlir/lib/AsmParser/AttributeParser.cpp | 6 ++++--
mlir/test/IR/parser.mlir | 4 ++++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/mlir/lib/AsmParser/AttributeParser.cpp b/mlir/lib/AsmParser/AttributeParser.cpp
index 93a24dee29ad2..2474e88373e04 100644
--- a/mlir/lib/AsmParser/AttributeParser.cpp
+++ b/mlir/lib/AsmParser/AttributeParser.cpp
@@ -566,8 +566,10 @@ DenseElementsAttr TensorLiteralParser::getAttr(SMLoc loc, ShapedType type) {
if (ComplexType complexTy = dyn_cast<ComplexType>(eltType)) {
eltType = complexTy.getElementType();
isComplex = true;
- // Complex types have 2 elements.
- if (shape.empty() && storage.size() != 2) {
+ // Complex types have N*2 elements or complex splat.
+ // Empty shape may mean a splat or empty literal, only validate splats.
+ bool isSplat = shape.empty() && type.getNumElements() != 0;
+ if (isSplat && storage.size() != 2) {
p.emitError(loc) << "parsed " << storage.size() << " elements, but type ("
<< complexTy << ") expected 2 elements";
return nullptr;
diff --git a/mlir/test/IR/parser.mlir b/mlir/test/IR/parser.mlir
index cace1fefa43d6..8b192ff11d573 100644
--- a/mlir/test/IR/parser.mlir
+++ b/mlir/test/IR/parser.mlir
@@ -730,6 +730,10 @@ func.func @densetensorattr() -> () {
"complex_attr"(){bar = dense<(1.000000e+00,0.000000e+00)> : tensor<complex<f32>>} : () -> ()
// CHECK: dense<[(1.000000e+00,0.000000e+00), (2.000000e+00,2.000000e+00)]> : tensor<2xcomplex<f32>>
"complex_attr"(){bar = dense<[(1.000000e+00,0.000000e+00), (2.000000e+00,2.000000e+00)]> : tensor<2xcomplex<f32>>} : () -> ()
+ // CHECK: dense<> : tensor<0xcomplex<i64>>
+ "complex_attr"(){bar = dense<> : tensor<0xcomplex<i64>>} : () -> ()
+ // CHECK: dense<> : tensor<2x0xcomplex<i64>>
+ "complex_attr"(){bar = dense<> : tensor<2x0xcomplex<i64>>} : () -> ()
return
}
More information about the Mlir-commits
mailing list