[llvm-branch-commits] [mlir] 7924fb3 - [mlir][OpFormatGen] Add support for optional enum attributes
River Riddle via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Dec 4 21:05:39 PST 2020
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;
}
More information about the llvm-branch-commits
mailing list