[Mlir-commits] [mlir] [mlir][SPIR-V] Fix crash on empty composite in replicated constants pass (PR #206647)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Jun 29 22:14:35 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/206647.diff


2 Files Affected:

- (modified) mlir/lib/Dialect/SPIRV/Transforms/ConvertToReplicatedConstantCompositePass.cpp (+6-4) 
- (modified) mlir/test/Dialect/SPIRV/Transforms/replicated-const-composites.mlir (+6) 


``````````diff
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<()>
+  }
 }
 
 // -----

``````````

</details>


https://github.com/llvm/llvm-project/pull/206647


More information about the Mlir-commits mailing list