[llvm-branch-commits] [mlir] 7f8ae54 - [mlir][assemblyFormat] Fix bug when using AttrSizedOperandSegments trait with non-buildable operand types only

Jean-Michel Gorius via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Apr 28 09:20:45 PDT 2020


Author: Martin Erhart
Date: 2020-04-28T18:20:15+02:00
New Revision: 7f8ae5405a93a6041bd0969da7ccb288a4f7ec22

URL: https://github.com/llvm/llvm-project/commit/7f8ae5405a93a6041bd0969da7ccb288a4f7ec22
DIFF: https://github.com/llvm/llvm-project/commit/7f8ae5405a93a6041bd0969da7ccb288a4f7ec22.diff

LOG: [mlir][assemblyFormat] Fix bug when using AttrSizedOperandSegments trait with non-buildable operand types only

Summary:
When creating an operation with
* the `AttrSizedOperandSegments` trait
* variadic operands of only non-buildable types
* assemblyFormat to automatically generate the parser
a local `builder` variable is used, but never declared.
This adds a fix as well as a test for this case, as existing ones use buildable
types only.

Reviewers: rriddle, Kayjukh, grosser

Reviewed By: Kayjukh

Subscribers: mehdi_amini, jpienaar, shauheen, antiagainst, nicolasvasilache, arpith-jacob, mgester, lucyrfox, liufengdb, Joonsoo, grosul1, frgossen, llvm-commits

Tags: #mlir, #llvm

Differential Revision: https://reviews.llvm.org/D79004

Added: 
    

Modified: 
    mlir/test/lib/Dialect/Test/TestOps.td
    mlir/tools/mlir-tblgen/OpFormatGen.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td
index 57b0c36505ca..1da2e71fbbd4 100644
--- a/mlir/test/lib/Dialect/Test/TestOps.td
+++ b/mlir/test/lib/Dialect/Test/TestOps.td
@@ -1258,6 +1258,16 @@ def FormatOptionalOperandResultBOp : FormatOptionalOperandResultOpBase<"b", [{
   (`[` $variadic^ `]`)? attr-dict
 }]>;
 
+def FormatTwoVariadicOperandsNoBuildableTypeOp
+    : TEST_Op<"format_two_variadic_operands_no_buildable_type_op",
+              [AttrSizedOperandSegments]> {
+  let arguments = (ins Variadic<AnyType>:$a,
+                       Variadic<AnyType>:$b);
+  let assemblyFormat = [{
+    `(` $a `:` type($a) `)` `->` `(` $b `:` type($b) `)`  attr-dict
+  }];
+}
+
 //===----------------------------------------------------------------------===//
 // Test SideEffects
 //===----------------------------------------------------------------------===//

diff  --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
index a8116e4290b4..47c145df29e0 100644
--- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp
@@ -741,10 +741,8 @@ void OperationFormat::genParserTypeResolution(Operator &op,
 
   // Initialize the set of buildable types.
   if (!buildableTypes.empty()) {
-    body << "  Builder &builder = parser.getBuilder();\n";
-
     FmtContext typeBuilderCtx;
-    typeBuilderCtx.withBuilder("builder");
+    typeBuilderCtx.withBuilder("parser.getBuilder()");
     for (auto &it : buildableTypes)
       body << "  Type odsBuildableType" << it.second << " = "
            << tgfmt(it.first, &typeBuilderCtx) << ";\n";
@@ -867,7 +865,7 @@ void OperationFormat::genParserVariadicSegmentResolution(Operator &op,
                                                          OpMethodBody &body) {
   if (!allOperands && op.getTrait("OpTrait::AttrSizedOperandSegments")) {
     body << "  result.addAttribute(\"operand_segment_sizes\", "
-         << "builder.getI32VectorAttr({";
+         << "parser.getBuilder().getI32VectorAttr({";
     auto interleaveFn = [&](const NamedTypeConstraint &operand) {
       // If the operand is variadic emit the parsed size.
       if (operand.isVariableLength())


        


More information about the llvm-branch-commits mailing list