-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[mlir] Fix parsing of empty complex tensors #134322
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-mlir @llvm/pr-subscribers-mlir-core Author: Kevin Gleason (GleasonK) ChangesAfter #133220 we had some empty complex literals ( This was largely due to the ambiguity between Full diff: https://github.com/llvm/llvm-project/pull/134322.diff 2 Files Affected:
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
}
|
LGTM, thanks for the fix! |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/55/builds/9422 Here is the relevant piece of the build log for the reference
|
After #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.