[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