[Mlir-commits] [mlir] 1bedb23 - [mlir][ods] Add query for derived attribute

Jacques Pienaar llvmlistbot at llvm.org
Tue Mar 3 12:04:42 PST 2020


Author: Jacques Pienaar
Date: 2020-03-03T12:04:16-08:00
New Revision: 1bedb2340774099fd3faa6610a78119a4f802955

URL: https://github.com/llvm/llvm-project/commit/1bedb2340774099fd3faa6610a78119a4f802955
DIFF: https://github.com/llvm/llvm-project/commit/1bedb2340774099fd3faa6610a78119a4f802955.diff

LOG: [mlir][ods] Add query for derived attribute

For ODS generated operations enable querying whether there is a derived
attribute with a given name.

Rollforward of commit 5aa57c2 without using llvm::is_contained.

Added: 
    

Modified: 
    mlir/test/mlir-tblgen/op-attribute.td
    mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/test/mlir-tblgen/op-attribute.td b/mlir/test/mlir-tblgen/op-attribute.td
index 44c9a72340f3..cb85149d885e 100644
--- a/mlir/test/mlir-tblgen/op-attribute.td
+++ b/mlir/test/mlir-tblgen/op-attribute.td
@@ -201,6 +201,18 @@ def DOp : NS_Op<"d_op", []> {
 // DEF: odsState.addAttribute("str_attr", (*odsBuilder).getStringAttr(str_attr));
 // DEF: odsState.addAttribute("dv_str_attr", (*odsBuilder).getStringAttr(dv_str_attr));
 
+// Test derived type attr.
+// ---
+def DerivedTypeAttrOp : NS_Op<"derived_type_attr_op", []> {
+  let results = (outs AnyTensor:$output);
+  DerivedTypeAttr element_dtype = DerivedTypeAttr<"return output().getType();">;
+}
+
+// DECL: bool isDerivedAttribute
+// DEF: bool DerivedTypeAttrOp::isDerivedAttribute(StringRef name) {
+// DEF:   if (name == "element_dtype") return true;
+// DEF:   return false;
+// DEF: }
 
 // Test that only default valued attributes at the end of the arguments
 // list get default values in the builder signature

diff  --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index f4d114aaab8f..8c6ba60b11f4 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -391,6 +391,20 @@ void OpEmitter::genAttrGetters() {
       emitAttrWithReturnType(name, attr);
     }
   }
+
+  // Generate helper method to query whether a named attribute is a derived
+  // attribute. This enables, for example, avoiding adding an attribute that
+  // overlaps with a derived attribute.
+  auto &method =
+      opClass.newMethod("bool", "isDerivedAttribute", "StringRef name");
+  auto &body = method.body();
+  auto derivedAttr = make_filter_range(op.getAttributes(),
+                                       [](const NamedAttribute &namedAttr) {
+                                         return namedAttr.attr.isDerivedAttr();
+                                       });
+  for (auto namedAttr : derivedAttr)
+    body << "    if (name == \"" << namedAttr.name << "\") return true;\n";
+  body << " return false;";
 }
 
 void OpEmitter::genAttrSetters() {


        


More information about the Mlir-commits mailing list