[Mlir-commits] [mlir] [mlir][spirv] Add basic support for SPV_EXT_replicated_composites (PR #147067)

Mohammadreza Ameri Mahabadian llvmlistbot at llvm.org
Fri Jul 11 03:55:27 PDT 2025


================
@@ -798,15 +798,21 @@ LogicalResult spirv::EXTConstantCompositeReplicateOp::verify() {
   Type valueType = dyn_cast<TypedAttr>(getValue()).getType();
   Type compositeElementType =
       dyn_cast<spirv::CompositeType>(getType()).getElementType(0);
-  while (compositeElementType != valueType &&
-         isa<spirv::CompositeType>(compositeElementType)) {
-    compositeElementType =
-        dyn_cast<spirv::CompositeType>(compositeElementType).getElementType(0);
-  }
-
-  if (compositeElementType != valueType)
+  SmallVector<Type, 3> possibleTypes = {compositeElementType};
+  while (auto type = dyn_cast<spirv::CompositeType>(compositeElementType)) {
+    compositeElementType = type.getElementType(0);
+    possibleTypes.push_back(compositeElementType);
+  }
+
+  if (!is_contained(possibleTypes, valueType)) {
+    std::string strTypes;
+    llvm::raw_string_ostream os(strTypes);
+    interleave(
+        possibleTypes, os, [&](Type type) { os << "'" << type << "'"; },
+        " or ");
     return emitError("expected value attribute type ")
-           << compositeElementType << ", but got: " << valueType;
+           << strTypes << ", but got: " << valueType;
----------------
mahabadm wrote:

Thank you. I ended up using `interleaved(possibleTypes, " or ")` which is concise and addresses your point and also that I didn't want the `[` and `]` which interleaved_array creates.

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


More information about the Mlir-commits mailing list