16TEST(RegionTests, IteratorRanges)
25 auto structuralNode = TestStructuralNode::create(&graph.
GetRootRegion(), 1);
26 auto & subregion = *structuralNode->subregion(0);
27 auto & constSubregion = *
static_cast<const jlm::rvsdg::Region *
>(structuralNode->subregion(0));
29 auto & argument0 = *structuralNode->addArguments(valueType).
argument[0];
30 auto & argument1 = *structuralNode->addArguments(valueType).argument[0];
32 auto topNode0 = TestOperation::createNode(&subregion, {}, { valueType });
33 auto node0 = TestOperation::createNode(&subregion, { &argument0 }, { valueType });
34 auto node1 = TestOperation::createNode(&subregion, { &argument1 }, { valueType });
36 TestOperation::createNode(&subregion, { &argument0, &argument1 }, { valueType });
38 const auto outputVar0 = structuralNode->addResults({ topNode0->output(0) });
39 const auto outputVar1 = structuralNode->addResults({ node0->output(0) });
40 const auto outputVar2 = structuralNode->addResults({ node1->output(0) });
43 auto numArguments = std::distance(subregion.Arguments().begin(), subregion.Arguments().end());
44 EXPECT_EQ(numArguments, 2u);
45 for (
auto & argument : constSubregion.Arguments())
47 EXPECT_TRUE(argument == &argument0 || argument == &argument1);
50 auto numTopNodes = std::distance(subregion.TopNodes().begin(), subregion.TopNodes().end());
51 EXPECT_EQ(numTopNodes, 1u);
52 for (
auto & topNode : constSubregion.TopNodes())
54 EXPECT_EQ(&topNode, topNode0);
57 auto numNodes = std::distance(subregion.Nodes().begin(), subregion.Nodes().end());
58 EXPECT_EQ(numNodes, 4u);
59 for (
auto & node : constSubregion.Nodes())
61 EXPECT_TRUE(&node == topNode0 || &node == node0 || &node == node1 || &node == bottomNode0);
65 std::distance(subregion.BottomNodes().begin(), subregion.BottomNodes().end());
66 EXPECT_EQ(numBottomNodes, 1u);
67 for (
auto & bottomNode : constSubregion.BottomNodes())
69 EXPECT_EQ(&bottomNode, bottomNode0);
72 auto numResults = std::distance(subregion.Results().begin(), subregion.Results().end());
73 EXPECT_EQ(numResults, 3u);
74 for (
auto & result : constSubregion.Results())
77 result == outputVar0.result[0] || result == outputVar1.result[0]
78 || result == outputVar2.result[0]);
154TEST(RegionTests, RemoveResults)
159 const auto valueType = TestType::createValueType();
165 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
166 auto & i1 = GraphImport::Create(rvsdg, valueType,
"i1");
167 auto & i2 = GraphImport::Create(rvsdg, valueType,
"i2");
168 auto & i3 = GraphImport::Create(rvsdg, valueType,
"i3");
169 auto & i4 = GraphImport::Create(rvsdg, valueType,
"i4");
170 auto & i5 = GraphImport::Create(rvsdg, valueType,
"i5");
171 auto & i6 = GraphImport::Create(rvsdg, valueType,
"i6");
172 auto & i7 = GraphImport::Create(rvsdg, valueType,
"i7");
173 auto & i8 = GraphImport::Create(rvsdg, valueType,
"i8");
174 auto & i9 = GraphImport::Create(rvsdg, valueType,
"i9");
176 GraphExport::Create(i0,
"x0");
177 GraphExport::Create(i1,
"x1");
178 GraphExport::Create(i2,
"x2");
179 GraphExport::Create(i3,
"x3");
180 GraphExport::Create(i4,
"x4");
181 GraphExport::Create(i5,
"x5");
182 GraphExport::Create(i6,
"x6");
183 GraphExport::Create(i7,
"x7");
184 GraphExport::Create(i8,
"x8");
185 GraphExport::Create(i9,
"x9");
191 size_t numRemovedResults = rootRegion.RemoveResults({ 0, 2, 4, 6, 8 });
192 EXPECT_EQ(numRemovedResults, 5u);
193 EXPECT_EQ(rootRegion.nresults(), 5u);
194 EXPECT_EQ(rootRegion.result(0)->origin(), &i1);
195 EXPECT_EQ(rootRegion.result(1)->origin(), &i3);
196 EXPECT_EQ(rootRegion.result(2)->origin(), &i5);
197 EXPECT_EQ(rootRegion.result(3)->origin(), &i7);
198 EXPECT_EQ(rootRegion.result(4)->origin(), &i9);
199 EXPECT_EQ(i0.nusers(), 0u);
200 EXPECT_EQ(i2.nusers(), 0u);
201 EXPECT_EQ(i4.nusers(), 0u);
202 EXPECT_EQ(i6.nusers(), 0u);
203 EXPECT_EQ(i8.nusers(), 0u);
207 numRemovedResults = rootRegion.RemoveResults({});
208 EXPECT_EQ(numRemovedResults, 0u);
209 EXPECT_EQ(rootRegion.nresults(), 5u);
213 numRemovedResults = rootRegion.RemoveResults({ 15 });
214 EXPECT_EQ(numRemovedResults, 0u);
215 EXPECT_EQ(rootRegion.nresults(), 5u);
219 numRemovedResults = rootRegion.RemoveResults({ 0, 1, 2, 3, 4 });
220 EXPECT_EQ(numRemovedResults, 5u);
221 EXPECT_EQ(rootRegion.nresults(), 0u);
222 EXPECT_EQ(i1.nusers(), 0u);
223 EXPECT_EQ(i3.nusers(), 0u);
224 EXPECT_EQ(i5.nusers(), 0u);
225 EXPECT_EQ(i7.nusers(), 0u);
226 EXPECT_EQ(i9.nusers(), 0u);
229 std::vector<size_t>({ 0, 2, 4, 6, 8, 0, 1, 2, 3, 4 }));
232TEST(RegionTests, RemoveArguments)
241 auto argument0 = &GraphImport::Create(rvsdg, valueType,
"argument0");
242 auto argument1 = &GraphImport::Create(rvsdg, valueType,
"argument1");
243 auto argument2 = &GraphImport::Create(rvsdg, valueType,
"argument2");
244 auto argument3 = &GraphImport::Create(rvsdg, valueType,
"argument3");
245 auto argument4 = &GraphImport::Create(rvsdg, valueType,
"argument4");
246 auto argument5 = &GraphImport::Create(rvsdg, valueType,
"argument5");
247 auto argument6 = &GraphImport::Create(rvsdg, valueType,
"argument6");
248 auto argument7 = &GraphImport::Create(rvsdg, valueType,
"argument7");
249 auto argument8 = &GraphImport::Create(rvsdg, valueType,
"argument8");
250 auto argument9 = &GraphImport::Create(rvsdg, valueType,
"argument9");
252 auto node = TestOperation::createNode(
254 { argument2, argument4, argument6 },
258 EXPECT_EQ(rootRegion.narguments(), 10u);
259 EXPECT_EQ(argument0->index(), 0u);
260 EXPECT_EQ(argument1->index(), 1u);
261 EXPECT_EQ(argument2->index(), 2u);
262 EXPECT_EQ(argument3->index(), 3u);
263 EXPECT_EQ(argument4->index(), 4u);
264 EXPECT_EQ(argument5->index(), 5u);
265 EXPECT_EQ(argument6->index(), 6u);
266 EXPECT_EQ(argument7->index(), 7u);
267 EXPECT_EQ(argument8->index(), 8u);
268 EXPECT_EQ(argument9->index(), 9u);
271 size_t numRemovedArguments = rootRegion.RemoveArguments({ 0, 2, 4, 6, 8 });
274 EXPECT_EQ(numRemovedArguments, 2u);
275 EXPECT_EQ(rootRegion.narguments(), 8u);
276 EXPECT_EQ(argument1->index(), 0u);
277 EXPECT_EQ(argument2->index(), 1u);
278 EXPECT_EQ(argument3->index(), 2u);
279 EXPECT_EQ(argument4->index(), 3u);
280 EXPECT_EQ(argument5->index(), 4u);
281 EXPECT_EQ(argument6->index(), 5u);
282 EXPECT_EQ(argument7->index(), 6u);
283 EXPECT_EQ(argument9->index(), 7u);
286 argument0 = argument1;
287 argument1 = argument2;
288 argument2 = argument3;
289 argument3 = argument4;
290 argument4 = argument5;
291 argument5 = argument6;
292 argument6 = argument7;
293 argument7 = argument9;
296 rootRegion.removeNode(node);
299 numRemovedArguments = rootRegion.RemoveArguments({ 0, 2, 4, 6 });
301 EXPECT_EQ(numRemovedArguments, 4u);
302 EXPECT_EQ(rootRegion.narguments(), 4u);
303 EXPECT_EQ(argument1->index(), 0u);
304 EXPECT_EQ(argument3->index(), 1u);
305 EXPECT_EQ(argument5->index(), 2u);
306 EXPECT_EQ(argument7->index(), 3u);
309 argument0 = argument1;
310 argument1 = argument3;
311 argument2 = argument5;
312 argument3 = argument7;
315 numRemovedArguments = rootRegion.RemoveArguments({});
316 EXPECT_EQ(numRemovedArguments, 0u);
317 EXPECT_EQ(rootRegion.narguments(), 4u);
318 EXPECT_EQ(argument0->index(), 0u);
319 EXPECT_EQ(argument1->index(), 1u);
320 EXPECT_EQ(argument2->index(), 2u);
321 EXPECT_EQ(argument3->index(), 3u);
324 numRemovedArguments = rootRegion.RemoveArguments({ 15 });
325 EXPECT_EQ(numRemovedArguments, 0u);
326 EXPECT_EQ(rootRegion.narguments(), 4u);
329 numRemovedArguments = rootRegion.RemoveArguments({ 0, 1, 2, 3 });
330 EXPECT_EQ(numRemovedArguments, 4u);
331 EXPECT_EQ(rootRegion.narguments(), 0u);
334TEST(RegionTests, PruneArguments)
339 auto valueType = TestType::createValueType();
342 auto structuralNode = TestStructuralNode::create(&rvsdg.
GetRootRegion(), 1);
344 auto & argument0 = *structuralNode->addArguments(valueType).argument[0];
345 structuralNode->addArguments(valueType);
346 auto & argument2 = *structuralNode->addArguments(valueType).argument[0];
348 auto node = TestOperation::createNode(
349 structuralNode->subregion(0),
350 { &argument0, &argument2 },
354 EXPECT_EQ(structuralNode->subregion(0)->narguments(), 3u);
356 size_t numRemovedArguments = structuralNode->subregion(0)->PruneArguments();
357 EXPECT_EQ(numRemovedArguments, 1u);
358 EXPECT_EQ(structuralNode->subregion(0)->narguments(), 2u);
359 EXPECT_EQ(argument0.index(), 0u);
360 EXPECT_EQ(argument2.index(), 1u);
362 structuralNode->subregion(0)->removeNode(node);
363 numRemovedArguments = structuralNode->subregion(0)->PruneArguments();
364 EXPECT_EQ(numRemovedArguments, 2u);
365 EXPECT_EQ(structuralNode->subregion(0)->narguments(), 0u);
591TEST(RegionTests, computeDepthMap)
596 auto valueType = TestType::createValueType();
600 auto & i0 = GraphImport::Create(rvsdg, valueType,
"i0");
601 auto & i1 = GraphImport::Create(rvsdg, valueType,
"i1");
603 auto node0 = TestOperation::createNode(&rvsdg.
GetRootRegion(), {}, { valueType });
605 TestOperation::createNode(&rvsdg.
GetRootRegion(), { node0->output(0), &i0 }, { valueType });
606 auto node2 = TestOperation::createNode(&rvsdg.
GetRootRegion(), { &i1 }, { valueType });
607 auto node3 = TestOperation::createNode(
609 { node1->output(0), node2->output(0) },
612 GraphExport::Create(*node3->output(0),
"x0");
615 const auto depthMap = computeDepthMap(rvsdg.
GetRootRegion());
618 EXPECT_EQ(depthMap.size(), 4u);
619 EXPECT_EQ(depthMap.at(node0), 0u);
620 EXPECT_EQ(depthMap.at(node1), 1u);
621 EXPECT_EQ(depthMap.at(node2), 0u);
622 EXPECT_EQ(depthMap.at(node3), 2u);
632 auto structuralNode1 = TestStructuralNode::create(&graph.
GetRootRegion(), 1);
633 auto structuralNode2 = TestStructuralNode::create(&graph.
GetRootRegion(), 1);
634 auto structuralNode3 = TestStructuralNode::create(structuralNode1->subregion(0), 1);
635 auto structuralNode4 = TestStructuralNode::create(structuralNode3->subregion(0), 1);
639 EXPECT_TRUE(Region::isAncestor(*structuralNode1->subregion(0), graph.
GetRootRegion()));
640 EXPECT_TRUE(Region::isAncestor(*structuralNode2->subregion(0), graph.
GetRootRegion()));
641 EXPECT_TRUE(Region::isAncestor(*structuralNode3->subregion(0), graph.
GetRootRegion()));
642 EXPECT_TRUE(Region::isAncestor(*structuralNode4->subregion(0), graph.
GetRootRegion()));
645 EXPECT_FALSE(Region::isAncestor(*structuralNode1->subregion(0), *structuralNode1->subregion(0)));
648 EXPECT_FALSE(Region::isAncestor(*structuralNode1->subregion(0), *structuralNode2->subregion(0)));
651 EXPECT_TRUE(Region::isAncestor(*structuralNode3->subregion(0), *structuralNode1->subregion(0)));
652 EXPECT_TRUE(Region::isAncestor(*structuralNode4->subregion(0), *structuralNode1->subregion(0)));
655 EXPECT_FALSE(Region::isAncestor(*structuralNode1->subregion(0), *structuralNode3->subregion(0)));
656 EXPECT_FALSE(Region::isAncestor(*structuralNode1->subregion(0), *structuralNode4->subregion(0)));