[Mlir-commits] [mlir] 713d95e - [mlir][SPIR-V] Fix crash on empty composite in replicated constants pass (#206647)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Jul 1 02:24:41 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-07-01T11:24:37+02:00
New Revision: 713d95e8f30ddca93c0eb737a0f6b2ad0f492a2c
URL: https://github.com/llvm/llvm-project/commit/713d95e8f30ddca93c0eb737a0f6b2ad0f492a2c
DIFF: https://github.com/llvm/llvm-project/commit/713d95e8f30ddca93c0eb737a0f6b2ad0f492a2c.diff
LOG: [mlir][SPIR-V] Fix crash on empty composite in replicated constants pass (#206647)
Added:
Modified:
mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp
mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp b/mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp
index 2f5588c7f8cc7..739c3092d36a7 100644
--- a/mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp
+++ b/mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp
@@ -28,6 +28,8 @@ static Type getArrayElemType(Attribute attr) {
}
if (auto arrayAttr = dyn_cast<ArrayAttr>(attr)) {
+ if (arrayAttr.empty())
+ return nullptr;
return ArrayType::get(getArrayElemType(arrayAttr[0]), arrayAttr.size());
}
@@ -45,7 +47,7 @@ getSplatAttrAndNumElements(Attribute valueAttr, Type valueType) {
}
if (auto arrayAttr = dyn_cast<ArrayAttr>(valueAttr)) {
- if (llvm::all_equal(arrayAttr)) {
+ if (!arrayAttr.empty() && llvm::all_equal(arrayAttr)) {
Attribute attr = arrayAttr[0];
uint32_t numElements = arrayAttr.size();
@@ -94,9 +96,9 @@ struct SpecConstantCompositeOpConversion final
return rewriter.notifyMatchFailure(op, "not a composite constant");
ArrayAttr constituents = op.getConstituents();
- if (constituents.size() == 1)
- return rewriter.notifyMatchFailure(op,
- "composite has only one consituent");
+ if (constituents.size() <= 1)
+ return rewriter.notifyMatchFailure(
+ op, "composite has zero or one consituent");
if (!llvm::all_equal(constituents))
return rewriter.notifyMatchFailure(op, "composite is not splat");
diff --git a/mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir b/mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir
index 0a413e5036be9..f0c0248bf694d 100644
--- a/mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir
+++ b/mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir
@@ -186,6 +186,12 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, ReplicatedCompos
%0 = spirv.Constant [[dense<[1, 2]> : vector<2xi32>]] : !spirv.array<1 x !spirv.array<1 x vector<2xi32>>>
spirv.ReturnValue %0 : !spirv.array<1 x !spirv.array<1 x vector<2xi32>>>
}
+
+ spirv.func @empty_struct() -> (!spirv.struct<()>) "None" {
+ // CHECK-NOT: spirv.EXT.ConstantCompositeReplicate
+ %0 = spirv.Constant [] : !spirv.struct<()>
+ spirv.ReturnValue %0 : !spirv.struct<()>
+ }
}
// -----
More information about the Mlir-commits
mailing list