From 15b76e6ca0a0788206fcaac7a1df0f39113c4bd8 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 25 Mar 2021 15:02:41 +0300 Subject: [PATCH] [mlir][ODS] Fix `VariadicRegion` code generation for `NoTerminator` Ops The issue was introduced in D98468. The `{0}Regions` is an array of `std::unique_ptr` objects, so it should be processed accordingly. Reviewed By: mehdi_amini Differential Revision: https://reviews.llvm.org/D99332 --- mlir/test/IR/region.mlir | 20 ++++++++++++++++++++ mlir/test/lib/Dialect/Test/TestOps.td | 16 ++++++++++++++++ mlir/tools/mlir-tblgen/OpFormatGen.cpp | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/mlir/test/IR/region.mlir b/mlir/test/IR/region.mlir index 8f9d707..fc0f2da 100644 --- a/mlir/test/IR/region.mlir +++ b/mlir/test/IR/region.mlir @@ -81,3 +81,23 @@ func @named_region_has_wrong_number_of_blocks() { "test.unregistered_without_terminator"() ( { ^bb0: // no predecessors }) : () -> () + +// ----- + +// CHECK: test.single_no_terminator_op +"test.single_no_terminator_op"() ( + { + func @foo1() { return } + func @foo2() { return } + } +) : () -> () + +// CHECK: test.variadic_no_terminator_op +"test.variadic_no_terminator_op"() ( + { + func @foo1() { return } + }, + { + func @foo2() { return } + } +) : () -> () diff --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td index be53ee23..25cd7f2 100644 --- a/mlir/test/lib/Dialect/Test/TestOps.td +++ b/mlir/test/lib/Dialect/Test/TestOps.td @@ -334,6 +334,22 @@ def SizedRegionOp : TEST_Op<"sized_region_op", []> { } //===----------------------------------------------------------------------===// +// NoTerminator Operation +//===----------------------------------------------------------------------===// + +def SingleNoTerminatorOp : TEST_Op<"single_no_terminator_op", GraphRegionNoTerminator.traits> { + let regions = (region SizedRegion<1>:$my_region); + + let assemblyFormat = "attr-dict `:` $my_region"; +} + +def VariadicNoTerminatorOp : TEST_Op<"variadic_no_terminator_op", GraphRegionNoTerminator.traits> { + let regions = (region VariadicRegion>:$my_regions); + + let assemblyFormat = "attr-dict `:` $my_regions"; +} + +//===----------------------------------------------------------------------===// // Test Call Interfaces //===----------------------------------------------------------------------===// diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp index e5d8db9..93d2155 100644 --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -695,7 +695,7 @@ const char *regionListEnsureTerminatorParserCode = R"( /// {0}: The name of the region list. const char *regionListEnsureSingleBlockParserCode = R"( for (auto ®ion : {0}Regions) - if (region.empty()) *{0}Region.emplaceBlock(); + if (region->empty()) region->emplaceBlock(); )"; /// The code snippet used to generate a parser call for an optional region. -- 2.7.4