annotate mlir/unittests/Interfaces/ControlFlowInterfacesTest.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents
children 1f2b6ac9f198
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.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
40 void getSuccessorRegions(Optional<unsigned> index,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
41 ArrayRef<Attribute> operands,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
42 SmallVectorImpl<RegionSuccessor> &regions) {}
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
43 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
44
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
45 /// All regions of this op call each other in a large circle.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
46 struct LoopRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
47 : public Op<LoopRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
48 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
49 static const unsigned kNumRegions = 3;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
50
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
51 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
52
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
53 static StringRef getOperationName() { return "cftest.loop_regions_op"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
54
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
55 void getSuccessorRegions(Optional<unsigned> index,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
56 ArrayRef<Attribute> operands,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
57 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
58 if (index) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
59 if (*index == 1)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
60 // This region also branches back to the parent.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
61 regions.push_back(RegionSuccessor());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
62 regions.push_back(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
63 RegionSuccessor(&getOperation()->getRegion(*index % kNumRegions)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
64 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
65 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
66 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
67
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
68 /// Each region branches back it itself or the parent.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
69 struct DoubleLoopRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
70 : public Op<DoubleLoopRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
71 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
72
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
73 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
74
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
75 static StringRef getOperationName() {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
76 return "cftest.double_loop_regions_op";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
77 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
78
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
79 void getSuccessorRegions(Optional<unsigned> index,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
80 ArrayRef<Attribute> operands,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
81 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
82 if (index.has_value()) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
83 regions.push_back(RegionSuccessor());
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
84 regions.push_back(RegionSuccessor(&getOperation()->getRegion(*index)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
85 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
86 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
87 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
88
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
89 /// Regions are executed sequentially.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
90 struct SequentialRegionsOp
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
91 : public Op<SequentialRegionsOp, RegionBranchOpInterface::Trait> {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
92 using Op::Op;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
93 static ArrayRef<StringRef> getAttributeNames() { return {}; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
94
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
95 static StringRef getOperationName() { return "cftest.sequential_regions_op"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
96
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
97 // Region 0 has Region 1 as a successor.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
98 void getSuccessorRegions(Optional<unsigned> index,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
99 ArrayRef<Attribute> operands,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
100 SmallVectorImpl<RegionSuccessor> &regions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
101 if (index == 0u) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
102 Operation *thisOp = this->getOperation();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
103 regions.push_back(RegionSuccessor(&thisOp->getRegion(1)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
104 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
105 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
106 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
107
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
108 /// A dialect putting all the above together.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
109 struct CFTestDialect : Dialect {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
110 explicit CFTestDialect(MLIRContext *ctx)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
111 : Dialect(getDialectNamespace(), ctx, TypeID::get<CFTestDialect>()) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
112 addOperations<DummyOp, MutuallyExclusiveRegionsOp, LoopRegionsOp,
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
113 DoubleLoopRegionsOp, SequentialRegionsOp>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
114 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
115 static StringRef getDialectNamespace() { return "cftest"; }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
116 };
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
117
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
118 TEST(RegionBranchOpInterface, MutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
119 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
120 "cftest.mutually_exclusive_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
121 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
122 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
123 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
124 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
125
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
126 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
127 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
128 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
129
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
130 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
131 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
132 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
133 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
134
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
135 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
136 EXPECT_TRUE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
137 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
138
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
139 TEST(RegionBranchOpInterface, MutuallyExclusiveOps2) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
140 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
141 "cftest.double_loop_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
142 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
143 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
144 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
145 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
146
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
147 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
148 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
149 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
150
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
151 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
152 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
153 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
154 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
155
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
156 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
157 EXPECT_TRUE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
158 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
159
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
160 TEST(RegionBranchOpInterface, NotMutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
161 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
162 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
163 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
164 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
165 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
166 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
167
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
168 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
169 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
170 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
171
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
172 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
173 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
174 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
175 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
176
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
177 EXPECT_FALSE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
178 EXPECT_FALSE(insideMutuallyExclusiveRegions(op2, op1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
179 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
180
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
181 TEST(RegionBranchOpInterface, NestedMutuallyExclusiveOps) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
182 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
183 "cftest.mutually_exclusive_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
184 {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
185 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
186 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
187 {"cftest.dummy_op"() : () -> ()} // op3
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
188 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
189 "cftest.dummy_op"() : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
190 },
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
191 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
192 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
193 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
194
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
195 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
196 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
197 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
198
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
199 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
200 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
201 Operation *op1 =
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
202 &testOp->getRegion(0).front().front().getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
203 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
204 Operation *op3 =
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
205 &testOp->getRegion(0).front().front().getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
206
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
207 EXPECT_TRUE(insideMutuallyExclusiveRegions(op1, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
208 EXPECT_TRUE(insideMutuallyExclusiveRegions(op3, op2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
209 EXPECT_FALSE(insideMutuallyExclusiveRegions(op1, op3));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
210 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
211
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
212 TEST(RegionBranchOpInterface, RecursiveRegions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
213 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
214 "cftest.loop_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
215 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
216 {"cftest.dummy_op"() : () -> ()}, // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
217 {"cftest.dummy_op"() : () -> ()} // op3
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
218 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
219 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
220
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
221 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
222 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
223 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
224
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
225 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
226 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
227 auto regionOp = cast<RegionBranchOpInterface>(testOp);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
228 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
229 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
230 Operation *op3 = &testOp->getRegion(2).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
231
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
232 EXPECT_TRUE(regionOp.isRepetitiveRegion(0));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
233 EXPECT_TRUE(regionOp.isRepetitiveRegion(1));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
234 EXPECT_TRUE(regionOp.isRepetitiveRegion(2));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
235 EXPECT_NE(getEnclosingRepetitiveRegion(op1), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
236 EXPECT_NE(getEnclosingRepetitiveRegion(op2), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
237 EXPECT_NE(getEnclosingRepetitiveRegion(op3), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
238 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
239
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
240 TEST(RegionBranchOpInterface, NotRecursiveRegions) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
241 const char *ir = R"MLIR(
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
242 "cftest.sequential_regions_op"() (
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
243 {"cftest.dummy_op"() : () -> ()}, // op1
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
244 {"cftest.dummy_op"() : () -> ()} // op2
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
245 ) : () -> ()
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
246 )MLIR";
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
247
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
248 DialectRegistry registry;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
249 registry.insert<CFTestDialect>();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
250 MLIRContext ctx(registry);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
251
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
252 OwningOpRef<ModuleOp> module = parseSourceString<ModuleOp>(ir, &ctx);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
253 Operation *testOp = &module->getBody()->getOperations().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
254 Operation *op1 = &testOp->getRegion(0).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
255 Operation *op2 = &testOp->getRegion(1).front().front();
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
256
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
257 EXPECT_EQ(getEnclosingRepetitiveRegion(op1), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
258 EXPECT_EQ(getEnclosingRepetitiveRegion(op2), nullptr);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
259 }