Author: River Riddle Date: 2020-12-04T21:00:44-08:00 New Revision: 7924fb34f33a76fd3c36f5635dd40990ecd79741
URL: https://github.com/llvm/llvm-project/commit/7924fb34f33a76fd3c36f5635dd40990ecd79741 DIFF: https://github.com/llvm/llvm-project/commit/7924fb34f33a76fd3c36f5635dd40990ecd79741.diff LOG: [mlir][OpFormatGen] Add support for optional enum attributes The check for formatting enum attributes was missing a call to get the base attribute, which is necessary to strip off the top-level OptionalAttr<> wrapper. Differential Revision: https://reviews.llvm.org/D92713 Added: Modified: mlir/test/Target/llvmir.mlir mlir/test/lib/Dialect/Test/TestOps.td mlir/test/mlir-tblgen/op-format.mlir mlir/tools/mlir-tblgen/OpFormatGen.cpp Removed: ################################################################################ diff --git a/mlir/test/Target/llvmir.mlir b/mlir/test/Target/llvmir.mlir index 473e54025ab6..9f8a37198558 100644 --- a/mlir/test/Target/llvmir.mlir +++ b/mlir/test/Target/llvmir.mlir @@ -1350,7 +1350,7 @@ llvm.func @useInlineAsm(%arg0: !llvm.i32) { %3 = llvm.inline_asm is_align_stack "foo", "=r,r,r" %arg0, %arg0 : (!llvm.i32, !llvm.i32) -> !llvm.i8 // CHECK-NEXT: call i8 asm inteldialect "foo", "=r,r,r"(i32 {{.*}}, i32 {{.*}}), !dbg !13 - %4 = llvm.inline_asm asm_dialect = 1 "foo", "=r,r,r" %arg0, %arg0 : (!llvm.i32, !llvm.i32) -> !llvm.i8 + %4 = llvm.inline_asm asm_dialect = "intel" "foo", "=r,r,r" %arg0, %arg0 : (!llvm.i32, !llvm.i32) -> !llvm.i8 // CHECK-NEXT: call { i8, i8 } asm "foo", "=r,=r,r"(i32 {{.*}}), !dbg !14 %5 = llvm.inline_asm "foo", "=r,=r,r" %arg0 : (!llvm.i32) -> !llvm.struct<(i8, i8)> diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td index 7d9274fbddee..7547500b2835 100644 --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -1592,6 +1592,11 @@ def FormatOptionalUnitAttrNoElide let assemblyFormat = "($is_optional^)? attr-dict"; } +def FormatOptionalEnumAttr : TEST_Op<"format_optional_enum_attr"> { + let arguments = (ins OptionalAttr<SomeI64Enum>:$attr); + let assemblyFormat = "($attr^)? attr-dict"; +} + //===----------------------------------------------------------------------===// // Custom Directives diff --git a/mlir/test/mlir-tblgen/op-format.mlir b/mlir/test/mlir-tblgen/op-format.mlir index d19d569729aa..6286f7655146 100644 --- a/mlir/test/mlir-tblgen/op-format.mlir +++ b/mlir/test/mlir-tblgen/op-format.mlir @@ -185,6 +185,13 @@ test.format_optional_unit_attribute // CHECK: test.format_optional_unit_attribute_no_elide unit test.format_optional_unit_attribute_no_elide unit +// CHECK: test.format_optional_enum_attr "case5" +test.format_optional_enum_attr "case5" + +// CHECK: test.format_optional_enum_attr +// CHECK-NOT: "case5" +test.format_optional_enum_attr + //===----------------------------------------------------------------------===// // Format optional operands and results //===----------------------------------------------------------------------===// diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp index e5775c09ab25..4b53c18b7717 100644 --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -462,7 +462,8 @@ struct OperationFormat { /// Returns true if we can format the given attribute as an EnumAttr in the /// parser format. static bool canFormatEnumAttr(const NamedAttribute *attr) { - const EnumAttr *enumAttr = dyn_cast<EnumAttr>(&attr->attr); + Attribute baseAttr = attr->attr.getBaseAttr(); + const EnumAttr *enumAttr = dyn_cast<EnumAttr>(&baseAttr); if (!enumAttr) return false; @@ -1107,7 +1108,8 @@ void OperationFormat::genElementParser(Element *element, OpMethodBody &body, // Check to see if we can parse this as an enum attribute. if (canFormatEnumAttr(var)) { - const EnumAttr &enumAttr = cast<EnumAttr>(var->attr); + Attribute baseAttr = var->attr.getBaseAttr(); + const EnumAttr &enumAttr = cast<EnumAttr>(baseAttr); // Generate the code for building an attribute for this enum. std::string attrBuilderStr; @@ -1682,9 +1684,11 @@ void OperationFormat::genElementPrinter(Element *element, OpMethodBody &body, // If we are formatting as an enum, symbolize the attribute as a string. if (canFormatEnumAttr(var)) { - const EnumAttr &enumAttr = cast<EnumAttr>(var->attr); + Attribute baseAttr = var->attr.getBaseAttr(); + const EnumAttr &enumAttr = cast<EnumAttr>(baseAttr); body << " p << '\"' << " << enumAttr.getSymbolToStringFnName() << "(" - << var->name << "()) << '\"';\n"; + << (var->attr.isOptional() ? "*" : "") << var->name + << "()) << '\"';\n"; return; } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits