diff --git a/mlir/test/Target/llvmir.mlir b/mlir/test/Target/llvmir.mlir --- a/mlir/test/Target/llvmir.mlir +++ b/mlir/test/Target/llvmir.mlir @@ -1350,7 +1350,7 @@ %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 --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -1592,6 +1592,11 @@ let assemblyFormat = "($is_optional^)? attr-dict"; } +def FormatOptionalEnumAttr : TEST_Op<"format_optional_enum_attr"> { + let arguments = (ins OptionalAttr:$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 --- a/mlir/test/mlir-tblgen/op-format.mlir +++ b/mlir/test/mlir-tblgen/op-format.mlir @@ -185,6 +185,13 @@ // 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 --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -462,7 +462,8 @@ /// 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(&attr->attr); + Attribute baseAttr = attr->attr.getBaseAttr(); + const EnumAttr *enumAttr = dyn_cast(&baseAttr); if (!enumAttr) return false; @@ -1104,7 +1105,8 @@ // Check to see if we can parse this as an enum attribute. if (canFormatEnumAttr(var)) { - const EnumAttr &enumAttr = cast(var->attr); + Attribute baseAttr = var->attr.getBaseAttr(); + const EnumAttr &enumAttr = cast(baseAttr); // Generate the code for building an attribute for this enum. std::string attrBuilderStr; @@ -1679,9 +1681,11 @@ // If we are formatting as an enum, symbolize the attribute as a string. if (canFormatEnumAttr(var)) { - const EnumAttr &enumAttr = cast(var->attr); + Attribute baseAttr = var->attr.getBaseAttr(); + const EnumAttr &enumAttr = cast(baseAttr); body << " p << '\"' << " << enumAttr.getSymbolToStringFnName() << "(" - << var->name << "()) << '\"';\n"; + << (var->attr.isOptional() ? "*" : "") << var->name + << "()) << '\"';\n"; return; }