diff --git a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp --- a/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp +++ b/mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp @@ -1357,8 +1357,8 @@ MLIRContext *context, std::optional location, ValueRange operands, DictionaryAttr attributes, OpaqueProperties properties, RegionRange regions, SmallVectorImpl &inferredReturnTypes) { - ExtractStridedMetadataOpAdaptor extractAdaptor( - operands, attributes, *properties.as(), regions); + ExtractStridedMetadataOpAdaptor extractAdaptor(operands, attributes, + properties); auto sourceType = extractAdaptor.getSource().getType().dyn_cast(); if (!sourceType) return failure(); diff --git a/mlir/test/mlir-tblgen/op-decl-and-defs.td b/mlir/test/mlir-tblgen/op-decl-and-defs.td --- a/mlir/test/mlir-tblgen/op-decl-and-defs.td +++ b/mlir/test/mlir-tblgen/op-decl-and-defs.td @@ -126,7 +126,7 @@ // DEFS-LABEL: NS::AOp definitions -// DEFS: AOpGenericAdaptorBase::AOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, ::mlir::EmptyProperties properties, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) +// DEFS: AOpGenericAdaptorBase::AOpGenericAdaptorBase(::mlir::DictionaryAttr attrs, const ::mlir::EmptyProperties &properties, ::mlir::RegionRange regions) : odsAttrs(attrs), odsRegions(regions) // DEFS: ::mlir::RegionRange AOpGenericAdaptorBase::getSomeRegions() // DEFS-NEXT: return odsRegions.drop_front(1); // DEFS: ::mlir::RegionRange AOpGenericAdaptorBase::getRegions() diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp --- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp +++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp @@ -3539,7 +3539,8 @@ if (useProperties) paramList.emplace_back("const Properties &", "properties", "{}"); else - paramList.emplace_back("::mlir::EmptyProperties", "properties", "{}"); + paramList.emplace_back("const ::mlir::EmptyProperties &", "properties", + "{}"); paramList.emplace_back("::mlir::RegionRange", "regions", "{}"); auto *baseConstructor = genericAdaptorBase.addConstructor(paramList); baseConstructor->addMemberInitializer("odsAttrs", "attrs"); @@ -3554,9 +3555,33 @@ op.getOperationName()); paramList.insert(paramList.begin(), MethodParameter("RangeT", "values")); - auto *constructor = genericAdaptor.addConstructor(std::move(paramList)); + auto *constructor = genericAdaptor.addConstructor(paramList); constructor->addMemberInitializer("Base", "attrs, properties, regions"); constructor->addMemberInitializer("odsOperands", "values"); + + // Add a forwarding constructor to the previous one that accepts + // OpaqueProperties instead and check for null and perform the cast to the + // actual properties type. + paramList[1] = MethodParameter("::mlir::DictionaryAttr", "attrs"); + paramList[2] = MethodParameter("::mlir::OpaqueProperties", "properties"); + auto *opaquePropertiesConstructor = + genericAdaptor.addConstructor(std::move(paramList)); + if (useProperties) { + opaquePropertiesConstructor->addMemberInitializer( + genericAdaptor.getClassName(), + "values, " + "attrs, " + "(properties ? *properties.as() : Properties{}), " + "regions"); + } else { + opaquePropertiesConstructor->addMemberInitializer( + genericAdaptor.getClassName(), + "values, " + "attrs, " + "(properties ? *properties.as<::mlir::EmptyProperties *>() : " + "::mlir::EmptyProperties{}), " + "regions"); + } } std::string sizeAttrInit;