diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -264,6 +264,16 @@ "$_builder.getI32IntegerAttr($_self)">; } +def TestPropOp : TEST_Op<"prop">, + Arguments<(ins Variadic:$upperInits, + I32ElementsAttr:$transforms)>, + Results<(outs Variadic:$results)> { + DerivedAttr upperLen = DerivedAttr<"uint32_t", [{ + return getUpperInits().size() / getTransforms().size(); + }], [{ $_builder.getI32IntegerAttr($_self) }]>; +} + + def StringElementsAttrOp : TEST_Op<"string_elements_attr"> { let arguments = (ins StringElementsAttr:$scalar_string_attr 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 @@ -875,10 +875,12 @@ if (useProperties) { for (const std::pair &it : emitHelper.getAttrMetadata()) { + const AttributeMetadata &metadata = it.second; + if (metadata.constraint && metadata.constraint->isDerivedAttr()) + continue; body << formatv( "auto tblgen_{0} = getProperties().{0}; (void)tblgen_{0};\n", it.first); - const AttributeMetadata &metadata = it.second; if (metadata.isRequired) body << formatv( "if (!tblgen_{0}) return {1}\"requires attribute '{0}'\");\n",