6 #include <gtest/gtest.h>
15 return jlm::llvm::is<jlm::llvm::EntryAggregationNode>(node) && node->
nchildren() == 0;
21 return jlm::llvm::is<jlm::llvm::ExitAggregationNode>(node) && node->
nchildren() == 0;
27 return jlm::llvm::is<jlm::llvm::BasicBlockAggregationNode>(node) && node->
nchildren() == 0;
33 if (!jlm::llvm::is<jlm::llvm::LinearAggregationNode>(node))
39 for (
auto & child : *node)
41 if (child.parent() != node)
51 return jlm::llvm::is<jlm::llvm::LoopAggregationNode>(node) && node->
nchildren() == 1
58 if (!jlm::llvm::is<jlm::llvm::BranchAggregationNode>(node))
64 for (
auto & child : *node)
66 if (child.parent() != node)
73 TEST(ViewTests, test_linear_reduction)
82 cfg->exit()->divert_inedges(bb);
83 bb->add_outedge(cfg->exit());
92 EXPECT_TRUE(
is_entry(root.child(0)));
93 EXPECT_TRUE(
is_block(root.child(1)));
94 EXPECT_TRUE(
is_exit(root.child(2)));
99 auto cfg = setup_cfg(module);
105 verify_aggtree(*root);
108 TEST(ViewTests, test_loop_reduction)
119 cfg->exit()->divert_inedges(bb1);
120 bb1->add_outedge(bb2);
121 bb2->add_outedge(cfg->exit());
122 bb2->add_outedge(bb1);
131 EXPECT_TRUE(
is_entry(root.child(0)));
133 auto loop = root.child(1);
136 auto linear = loop->child(0);
139 EXPECT_TRUE(
is_block(linear->child(0)));
140 EXPECT_TRUE(
is_block(linear->child(1)));
144 EXPECT_TRUE(
is_exit(root.child(2)));
149 auto cfg = setup_cfg(module);
155 verify_aggtree(*root);
158 TEST(ViewTests, test_branch_reduction)
173 cfg->exit()->divert_inedges(split);
174 split->add_outedge(bb1);
175 split->add_outedge(bb3);
176 bb1->add_outedge(bb2);
177 bb2->add_outedge(join);
178 bb3->add_outedge(bb4);
179 bb4->add_outedge(join);
180 join->add_outedge(cfg->exit());
189 EXPECT_TRUE(
is_entry(root.child(0)));
190 EXPECT_TRUE(
is_block(root.child(1)));
192 auto branch = root.child(2);
195 auto linear = branch->child(0);
198 EXPECT_TRUE(
is_block(linear->child(0)));
199 EXPECT_TRUE(
is_block(linear->child(1)));
202 linear = branch->child(1);
205 EXPECT_TRUE(
is_block(linear->child(0)));
206 EXPECT_TRUE(
is_block(linear->child(1)));
210 EXPECT_TRUE(
is_block(root.child(3)));
211 EXPECT_TRUE(
is_exit(root.child(4)));
216 auto cfg = setup_cfg(module);
222 verify_aggtree(*root);
225 TEST(ViewTests, test_branch_loop_reduction)
239 cfg->exit()->divert_inedges(split);
240 split->add_outedge(bb1);
241 split->add_outedge(bb3);
242 bb1->add_outedge(bb2);
243 bb2->add_outedge(join);
244 bb2->add_outedge(bb1);
245 bb3->add_outedge(bb4);
246 bb4->add_outedge(join);
247 bb4->add_outedge(bb3);
248 join->add_outedge(cfg->exit());
257 EXPECT_TRUE(
is_entry(root.child(0)));
258 EXPECT_TRUE(
is_block(root.child(1)));
260 auto branch = root.child(2);
263 auto loop = branch->child(0);
266 auto linear = loop->child(0);
269 EXPECT_TRUE(
is_block(linear->child(0)));
270 EXPECT_TRUE(
is_block(linear->child(1)));
274 loop = branch->child(1);
277 auto linear = loop->child(0);
280 EXPECT_TRUE(
is_block(linear->child(0)));
281 EXPECT_TRUE(
is_block(linear->child(1)));
286 EXPECT_TRUE(
is_block(root.child(3)));
287 EXPECT_TRUE(
is_exit(root.child(4)));
292 auto cfg = setup_cfg(module);
298 verify_aggtree(*root);
301 TEST(ViewTests, test_loop_branch_reduction)
315 cfg->exit()->divert_inedges(split);
316 split->add_outedge(bb1);
317 split->add_outedge(bb2);
318 bb1->add_outedge(join);
319 bb2->add_outedge(join);
320 join->add_outedge(bb3);
321 bb3->add_outedge(cfg->exit());
322 bb3->add_outedge(split);
331 EXPECT_TRUE(
is_entry(root.child(0)));
333 auto loop = root.child(1);
336 auto linear = loop->child(0);
339 EXPECT_TRUE(
is_block(linear->child(0)));
341 auto branch = linear->child(1);
344 EXPECT_TRUE(
is_block(branch->child(0)));
345 EXPECT_TRUE(
is_block(branch->child(1)));
348 EXPECT_TRUE(
is_block(linear->child(2)));
349 EXPECT_TRUE(
is_block(linear->child(3)));
353 EXPECT_TRUE(
is_exit(root.child(2)));
358 auto cfg = setup_cfg(module);
364 verify_aggtree(*root);
367 TEST(ViewTests, test_ifthen_reduction)
381 cfg->exit()->divert_inedges(split);
382 split->add_outedge(bb3);
383 split->add_outedge(bb1);
384 bb1->add_outedge(bb2);
385 bb2->add_outedge(join);
386 bb3->add_outedge(join);
387 join->add_outedge(cfg->exit());
396 EXPECT_TRUE(
is_entry(root.child(0)));
397 EXPECT_TRUE(
is_block(root.child(1)));
399 auto branch = root.child(2);
402 EXPECT_TRUE(
is_block(branch->child(0)));
404 auto linear = branch->child(1);
407 EXPECT_TRUE(
is_block(linear->child(0)));
408 EXPECT_TRUE(
is_block(linear->child(1)));
412 EXPECT_TRUE(
is_block(root.child(3)));
413 EXPECT_TRUE(
is_exit(root.child(4)));
418 auto cfg = setup_cfg(module);
424 verify_aggtree(*root);
427 TEST(AggregationTests, test_branch_and_loop)
440 cfg->exit()->divert_inedges(split);
441 split->add_outedge(bb1);
442 split->add_outedge(bb2);
443 bb1->add_outedge(loop);
444 bb2->add_outedge(loop);
445 loop->add_outedge(cfg->exit());
446 loop->add_outedge(loop);
455 EXPECT_TRUE(
is_entry(root.child(0)));
456 EXPECT_TRUE(
is_block(root.child(1)));
458 auto branch = root.child(2);
461 EXPECT_TRUE(
is_block(branch->child(0)));
462 EXPECT_TRUE(
is_block(branch->child(1)));
465 auto loop = root.child(3);
468 EXPECT_TRUE(
is_block(loop->child(0)));
471 EXPECT_TRUE(
is_exit(root.child(4)));
476 auto cfg = setup_cfg(module);
482 verify_aggtree(*root);
static bool is_block(const jlm::llvm::AggregationNode *node)
static bool is_linear(const jlm::llvm::AggregationNode *node, size_t nchildren)
static bool is_loop(const jlm::llvm::AggregationNode *node)
static bool is_entry(const jlm::llvm::AggregationNode *node)
TEST(ViewTests, test_linear_reduction)
static bool is_branch(const jlm::llvm::AggregationNode *node, size_t nchildren)
static bool is_exit(const jlm::llvm::AggregationNode *node)
size_t nchildren() const noexcept
static void normalize(AggregationNode &node)
AggregationNode * parent() noexcept
AggregationNode * child(size_t n) const noexcept
static BasicBlock * create(ControlFlowGraph &cfg)
static std::unique_ptr< ControlFlowGraph > create(InterProceduralGraphModule &im)
Global memory state passed between functions.
static ControlFlowGraphNode * aggregate(ControlFlowGraphNode *, ControlFlowGraphNode *, AggregationMap &)
static bool is_loop(const jlm::llvm::ControlFlowGraphNode *node) noexcept
static bool is_linear(const ControlFlowGraphNode *node) noexcept
void print(const AggregationNode &n, const AnnotationMap &dm, FILE *out)
static bool is_branch(const ControlFlowGraphNode *split) noexcept