annotate mlir/unittests/Interfaces/ControlFlowInterfacesTest.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
1 //===- ControlFlowInterfacesTest.cpp - Unit Tests for Control Flow Interf. ===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
2 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
6 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
8
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
9 #include "mlir/Interfaces/ControlFlowInterfaces.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
10 #include "mlir/IR/BuiltinOps.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
11 #include "mlir/IR/Dialect.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
12 #include "mlir/IR/DialectImplementation.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
13 #include "mlir/IR/OpDefinition.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
14 #include "mlir/IR/OpImplementation.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
15 #include "mlir/Parser/Parser.h"
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
16
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
17 #include <gtest/gtest.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
18
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
19 using namespace mlir;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
20
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
21 /// A dummy op that is also a terminator.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
22 struct DummyOp : public Op<DummyOp, OpTrait::IsTerminator> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
23 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
24 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
25
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
26 static StringRef getOperationName() { return "cftest.dummy_op"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
27 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
28
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
29 /// All regions of this op are mutually exclusive.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
30 struct MutuallyExclusiveRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
31 : public Op<MutuallyExclusiveRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
32 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
33 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
34
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
35 static StringRef getOperationName() {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
36 return "cftest.mutually_exclusive_regions_op";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
37 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
38
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
39 // Regions have no successors.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
40 void getSuccessorRegions(std::optional<unsigned> index,
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
41 SmallVectorImpl<RegionSuccessor> &regions) {}
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
42 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
43
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
44 /// All regions of this op call each other in a large circle.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
45 struct LoopRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
46 : public Op<LoopRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
47 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
48 static const unsigned kNumRegions = 3;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
49
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
50 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
51
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
52 static StringRef getOperationName() { return "cftest.loop_regions_op"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
53
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
54 void getSuccessorRegions(std::optional<unsigned> index,
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
55 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
56 if (index) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
57 if (*index == 1)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
58 // This region also branches back to the parent.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
59 regions.push_back(RegionSuccessor());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
60 regions.push_back(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
61 RegionSuccessor(&getOperation()->getRegion(*index % kNumRegions)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
62 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
63 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
64 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
65
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
66 /// Each region branches back it itself or the parent.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
67 struct DoubleLoopRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
68 : public Op<DoubleLoopRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
69 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
70
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
71 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
72
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
73 static StringRef getOperationName() {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
74 return "cftest.double_loop_regions_op";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
75 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
76
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
77 void getSuccessorRegions(std::optional<unsigned> index,
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
78 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
79 if (index.has_value()) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
80 regions.push_back(RegionSuccessor());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
81 regions.push_back(RegionSuccessor(&getOperation()->getRegion(*index)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
82 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
83 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
84 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
85
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
86 /// Regions are executed sequentially.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
87 struct SequentialRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
88 : public Op<SequentialRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
89 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
90 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
91
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
92 static StringRef getOperationName() { return "cftest.sequential_regions_op"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
93
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
94 // Region 0 has Region 1 as a successor.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
95 void getSuccessorRegions(std::optional<unsigned> index,
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
96 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
97 if (index == 0u) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
98 Operation *thisOp = this->getOperation();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
99 regions.push_back(RegionSuccessor(&thisOp->getRegion(1)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
100 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
101 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
102 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
103
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
104 /// A dialect putting all the above together.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
105 struct CFTestDialect : Dialect {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
106 explicit CFTestDialect(MLIRContext *ctx)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
107 : Dialect(getDialectNamespace(), ctx, TypeID::get<CFTestDialect>()) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
108 addOperations<DummyOp, MutuallyExclusiveRegionsOp, LoopRegionsOp,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
109 DoubleLoopRegionsOp, SequentialRegionsOp>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
110 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
111 static StringRef getDialectNamespace() { return "cftest"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
112 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
113
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
114 TEST(RegionBranchOpInterface, MutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
115 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
116 "cftest.mutually_exclusive_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
117 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
118 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
119 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
120 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
121
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
122 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
123 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
124 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
125
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
126 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
127 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
128 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
129 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
130
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
131 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
132 EXPECT_TRUE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
133 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
134
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
135 TEST(RegionBranchOpInterface, MutuallyExclusiveOps2) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
136 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
137 "cftest.double_loop_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
138 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
139 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
140 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
141 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
142
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
143 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
144 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
145 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
146
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
147 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
148 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
149 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
150 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
151
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
152 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
153 EXPECT_TRUE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
154 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
155
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
156 TEST(RegionBranchOpInterface, NotMutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
157 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
158 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
159 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
160 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
161 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
162 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
163
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
164 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
165 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
166 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
167
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
168 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
169 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
170 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
171 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
172
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
173 EXPECT_FALSE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
174 EXPECT_FALSE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
175 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
176
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
177 TEST(RegionBranchOpInterface, NestedMutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
178 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
179 "cftest.mutually_exclusive_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
180 {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
181 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
182 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
183 {"cftest.dummy_op"() : () -> ()} // op3
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
184 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
185 "cftest.dummy_op"() : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
186 },
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
187 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
188 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
189 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
190
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
191 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
192 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
193 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
194
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
195 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
196 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
197 Operation *op1 =
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
198 &testOp->getRegion(0).front().front().getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
199 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
200 Operation *op3 =
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
201 &testOp->getRegion(0).front().front().getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
202
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
203 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
204 EXPECT_TRUE(insideMutuallyExclusiveRegions(op3, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
205 EXPECT_FALSE(insideMutuallyExclusiveRegions(op1, op3));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
206 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
207
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
208 TEST(RegionBranchOpInterface, RecursiveRegions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
209 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
210 "cftest.loop_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
211 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
212 {"cftest.dummy_op"() : () -> ()}, // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
213 {"cftest.dummy_op"() : () -> ()} // op3
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
214 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
215 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
216
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
217 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
218 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
219 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
220
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
221 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
222 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
223 auto regionOp = cast<RegionBranchOpInterface>(testOp);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
224 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
225 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
226 Operation *op3 = &testOp->getRegion(2).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
227
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
228 EXPECT_TRUE(regionOp.isRepetitiveRegion(0));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
229 EXPECT_TRUE(regionOp.isRepetitiveRegion(1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
230 EXPECT_TRUE(regionOp.isRepetitiveRegion(2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
231 EXPECT_NE(getEnclosingRepetitiveRegion(op1), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
232 EXPECT_NE(getEnclosingRepetitiveRegion(op2), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
233 EXPECT_NE(getEnclosingRepetitiveRegion(op3), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
234 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
235
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
236 TEST(RegionBranchOpInterface, NotRecursiveRegions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
237 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
238 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
239 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
240 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
241 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
242 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
243
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
244 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
245 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
246 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
247
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
248 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
249 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
250 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
251 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
252
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
253 EXPECT_EQ(getEnclosingRepetitiveRegion(op1), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
254 EXPECT_EQ(getEnclosingRepetitiveRegion(op2), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
255 }