Jlm
Loading...
Searching...
No Matches
DomTreeTests.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#include <gtest/gtest.h>
7
8#include <jlm/llvm/ir/cfg.hpp>
11
12#include <unordered_set>
13
14template<size_t N>
15static void
17 const jlm::llvm::DominatorTreeNode * dnode,
19 const std::unordered_set<const jlm::llvm::ControlFlowGraphNode *> & children)
20{
21 EXPECT_EQ(dnode->node(), node);
22 EXPECT_EQ(dnode->nchildren(), N);
23 for (auto & child : *dnode)
24 EXPECT_NE(children.find(child->node()), children.end());
25}
26
29{
30 for (const auto & child : *root)
31 {
32 if (child->node() == node)
33 return child.get();
34 }
35
36 throw std::logic_error("Node does not exist in dominator tree");
37}
38
39TEST(DominatorTreeTests, test)
40{
41 using namespace jlm::llvm;
42
44
45 /* setup cfg */
46
47 ControlFlowGraph cfg(im);
48 auto bb1 = BasicBlock::create(cfg);
49 auto bb2 = BasicBlock::create(cfg);
50 auto bb3 = BasicBlock::create(cfg);
51 auto bb4 = BasicBlock::create(cfg);
52
53 cfg.exit()->divert_inedges(bb1);
54 bb1->add_outedge(bb2);
55 bb1->add_outedge(bb3);
56 bb2->add_outedge(bb3);
57 bb2->add_outedge(bb4);
58 bb3->add_outedge(bb4);
59 bb4->add_outedge(cfg.exit());
60
61 /* verify domtree */
62
63 auto root = domtree(cfg);
64 check<1>(root.get(), cfg.entry(), { bb1 });
65
66 auto dtbb1 = root->child(0);
67 check<3>(dtbb1, bb1, { bb2, bb3, bb4 });
68
69 auto dtbb2 = get_child(dtbb1, bb2);
70 check<0>(dtbb2, bb2, {});
71
72 auto dtbb3 = get_child(dtbb1, bb3);
73 check<0>(dtbb3, bb3, {});
74
75 auto dtbb4 = get_child(dtbb1, bb4);
76 check<1>(dtbb4, bb4, { cfg.exit() });
77
78 auto dtexit = dtbb4->child(0);
79 check<0>(dtexit, cfg.exit(), {});
80}
static const jlm::llvm::DominatorTreeNode * get_child(const jlm::llvm::DominatorTreeNode *root, const jlm::llvm::ControlFlowGraphNode *node)
static void check(const jlm::llvm::DominatorTreeNode *dnode, const jlm::llvm::ControlFlowGraphNode *node, const std::unordered_set< const jlm::llvm::ControlFlowGraphNode * > &children)
TEST(DominatorTreeTests, test)
void divert_inedges(llvm::ControlFlowGraphNode *new_successor)
Definition cfg-node.hpp:171
ExitNode * exit() const noexcept
Definition cfg.hpp:212
EntryNode * entry() const noexcept
Definition cfg.hpp:206
ControlFlowGraphNode * node() const noexcept
Definition domtree.hpp:70
size_t nchildren() const noexcept
Definition domtree.hpp:57
Global memory state passed between functions.