Skip to content

Conversation

joker-eph
Copy link
Collaborator

No description provided.

@joker-eph joker-eph requested a review from jpienaar November 26, 2024 14:59
@llvmbot llvmbot added mlir:core MLIR Core Infrastructure mlir labels Nov 26, 2024
@llvmbot
Copy link
Member

llvmbot commented Nov 26, 2024

@llvm/pr-subscribers-mlir

Author: Mehdi Amini (joker-eph)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/117719.diff

3 Files Affected:

  • (modified) mlir/test/lib/Dialect/Test/TestAttrDefs.td (+6)
  • (modified) mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir (+7-1)
  • (modified) mlir/tools/mlir-tblgen/EnumsGen.cpp (+21)
diff --git a/mlir/test/lib/Dialect/Test/TestAttrDefs.td b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
index 907184b2e1ce4c..0fd272f85d39bd 100644
--- a/mlir/test/lib/Dialect/Test/TestAttrDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
@@ -226,6 +226,12 @@ def TestAttrWithOptionalUnsigned : Test_Attr<"TestAttrWithOptionalUnsigned"> {
   let mnemonic = "attr_with_optional_unsigned";
 }
 
+def TestAttrWithOptionalEnum : Test_Attr<"TestAttrWithOptionalEnum"> {
+  let parameters = (ins OptionalParameter<"std::optional<SimpleEnum>">:$value);
+  let assemblyFormat = "`<` $value `>`";
+  let mnemonic = "attr_with_optional_enum";
+}
+
 def TestAttrUgly : Test_Attr<"TestAttrUgly"> {
   let parameters = (ins "::mlir::Attribute":$attr);
 
diff --git a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
index f0d1571d583877..77b94698a278e9 100644
--- a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
+++ b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
@@ -26,7 +26,13 @@ attributes {
   // CHECK: #test.attr_with_optional_signed<-9223372036854775808>
   attr9 = #test.attr_with_optional_signed<-9223372036854775808>,
   // CHECK: #test.attr_with_optional_unsigned<18446744073709551615>
-  attr_10 = #test.attr_with_optional_unsigned<18446744073709551615>
+  attr_10 = #test.attr_with_optional_unsigned<18446744073709551615>,
+  // CHECK: #test.attr_with_optional_enum<>
+  attr_11 = #test.attr_with_optional_enum<>,
+  // CHECK: #test.attr_with_optional_enum<a>
+  attr_12 = #test.attr_with_optional_enum<a>,
+  // CHECK: #test.attr_with_optional_enum<b>
+  attr_13 = #test.attr_with_optional_enum<b>
 }
 
 // CHECK-LABEL: @test_roundtrip_default_parsers_struct
diff --git a/mlir/tools/mlir-tblgen/EnumsGen.cpp b/mlir/tools/mlir-tblgen/EnumsGen.cpp
index 47ffd291cae687..d11aa9b27c2d86 100644
--- a/mlir/tools/mlir-tblgen/EnumsGen.cpp
+++ b/mlir/tools/mlir-tblgen/EnumsGen.cpp
@@ -101,6 +101,27 @@ struct FieldParser<{0}, {0}> {{
     return parser.emitError(loc, "invalid {2} specification: ") << enumKeyword;
   }
 };
+
+/// Support for std::optional, useful in attribute/type definition where the enum is
+/// used as:
+///
+///    let parameters = (ins OptionalParameter<"std::optional<TheEnumName>">:$value);
+template<>
+struct FieldParser<std::optional<{0}>, std::optional<{0}>> {{
+  template <typename ParserT>
+  static FailureOr<std::optional<{0}>> parse(ParserT &parser) {{
+    // Parse the keyword/string containing the enum.
+    std::string enumKeyword;
+    auto loc = parser.getCurrentLocation();
+    if (failed(parser.parseOptionalKeywordOrString(&enumKeyword)))
+      return std::optional<{0}>{{};
+
+    // Symbolize the keyword.
+    if (::std::optional<{0}> attr = {1}::symbolizeEnum<{0}>(enumKeyword))
+      return attr;
+    return parser.emitError(loc, "invalid {2} specification: ") << enumKeyword;
+  }
+};
 } // namespace mlir
 
 namespace llvm {

@llvmbot
Copy link
Member

llvmbot commented Nov 26, 2024

@llvm/pr-subscribers-mlir-core

Author: Mehdi Amini (joker-eph)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/117719.diff

3 Files Affected:

  • (modified) mlir/test/lib/Dialect/Test/TestAttrDefs.td (+6)
  • (modified) mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir (+7-1)
  • (modified) mlir/tools/mlir-tblgen/EnumsGen.cpp (+21)
diff --git a/mlir/test/lib/Dialect/Test/TestAttrDefs.td b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
index 907184b2e1ce4c..0fd272f85d39bd 100644
--- a/mlir/test/lib/Dialect/Test/TestAttrDefs.td
+++ b/mlir/test/lib/Dialect/Test/TestAttrDefs.td
@@ -226,6 +226,12 @@ def TestAttrWithOptionalUnsigned : Test_Attr<"TestAttrWithOptionalUnsigned"> {
   let mnemonic = "attr_with_optional_unsigned";
 }
 
+def TestAttrWithOptionalEnum : Test_Attr<"TestAttrWithOptionalEnum"> {
+  let parameters = (ins OptionalParameter<"std::optional<SimpleEnum>">:$value);
+  let assemblyFormat = "`<` $value `>`";
+  let mnemonic = "attr_with_optional_enum";
+}
+
 def TestAttrUgly : Test_Attr<"TestAttrUgly"> {
   let parameters = (ins "::mlir::Attribute":$attr);
 
diff --git a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
index f0d1571d583877..77b94698a278e9 100644
--- a/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
+++ b/mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
@@ -26,7 +26,13 @@ attributes {
   // CHECK: #test.attr_with_optional_signed<-9223372036854775808>
   attr9 = #test.attr_with_optional_signed<-9223372036854775808>,
   // CHECK: #test.attr_with_optional_unsigned<18446744073709551615>
-  attr_10 = #test.attr_with_optional_unsigned<18446744073709551615>
+  attr_10 = #test.attr_with_optional_unsigned<18446744073709551615>,
+  // CHECK: #test.attr_with_optional_enum<>
+  attr_11 = #test.attr_with_optional_enum<>,
+  // CHECK: #test.attr_with_optional_enum<a>
+  attr_12 = #test.attr_with_optional_enum<a>,
+  // CHECK: #test.attr_with_optional_enum<b>
+  attr_13 = #test.attr_with_optional_enum<b>
 }
 
 // CHECK-LABEL: @test_roundtrip_default_parsers_struct
diff --git a/mlir/tools/mlir-tblgen/EnumsGen.cpp b/mlir/tools/mlir-tblgen/EnumsGen.cpp
index 47ffd291cae687..d11aa9b27c2d86 100644
--- a/mlir/tools/mlir-tblgen/EnumsGen.cpp
+++ b/mlir/tools/mlir-tblgen/EnumsGen.cpp
@@ -101,6 +101,27 @@ struct FieldParser<{0}, {0}> {{
     return parser.emitError(loc, "invalid {2} specification: ") << enumKeyword;
   }
 };
+
+/// Support for std::optional, useful in attribute/type definition where the enum is
+/// used as:
+///
+///    let parameters = (ins OptionalParameter<"std::optional<TheEnumName>">:$value);
+template<>
+struct FieldParser<std::optional<{0}>, std::optional<{0}>> {{
+  template <typename ParserT>
+  static FailureOr<std::optional<{0}>> parse(ParserT &parser) {{
+    // Parse the keyword/string containing the enum.
+    std::string enumKeyword;
+    auto loc = parser.getCurrentLocation();
+    if (failed(parser.parseOptionalKeywordOrString(&enumKeyword)))
+      return std::optional<{0}>{{};
+
+    // Symbolize the keyword.
+    if (::std::optional<{0}> attr = {1}::symbolizeEnum<{0}>(enumKeyword))
+      return attr;
+    return parser.emitError(loc, "invalid {2} specification: ") << enumKeyword;
+  }
+};
 } // namespace mlir
 
 namespace llvm {

@joker-eph joker-eph requested a review from Mogball November 27, 2024 12:06
@joker-eph joker-eph merged commit db273c6 into llvm:main Nov 28, 2024
11 checks passed
@joker-eph joker-eph deleted the ods_optional_enum branch November 28, 2024 02:59
kuhar added a commit to iree-org/iree that referenced this pull request Nov 28, 2024
…19334)

Still carrying a revert for 1004865f1ca41a9581da8747f34b29862d3ebc3d and
a cherry pick for llvm/llvm-project#116650.

Removed `FieldParser`s for optional enums that get autogenerated as of
llvm/llvm-project#117719.
giacs-epic pushed a commit to giacs-epic/iree that referenced this pull request Dec 4, 2024
…ree-org#19334)

Still carrying a revert for 1004865f1ca41a9581da8747f34b29862d3ebc3d and
a cherry pick for llvm/llvm-project#116650.

Removed `FieldParser`s for optional enums that get autogenerated as of
llvm/llvm-project#117719.

Signed-off-by: Giacomo Serafini <179146510+giacs-epic@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mlir:core MLIR Core Infrastructure mlir
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants