Jlm
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 
14 template<size_t N>
15 static 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 
27 static const jlm::llvm::DominatorTreeNode *
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 
39 TEST(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 void check(const jlm::llvm::DominatorTreeNode *dnode, const jlm::llvm::ControlFlowGraphNode *node, const std::unordered_set< const jlm::llvm::ControlFlowGraphNode * > &children)
TEST(DominatorTreeTests, test)
static const jlm::llvm::DominatorTreeNode * get_child(const jlm::llvm::DominatorTreeNode *root, const jlm::llvm::ControlFlowGraphNode *node)
static BasicBlock * create(ControlFlowGraph &cfg)
Definition: basic-block.cpp:37
void divert_inedges(llvm::ControlFlowGraphNode *new_successor)
Definition: cfg-node.hpp:171
EntryNode * entry() const noexcept
Definition: cfg.hpp:206
ExitNode * exit() const noexcept
Definition: cfg.hpp:212
ControlFlowGraphNode * node() const noexcept
Definition: domtree.hpp:70
size_t nchildren() const noexcept
Definition: domtree.hpp:57
Global memory state passed between functions.
std::unique_ptr< DominatorTreeNode > domtree(ControlFlowGraph &cfg)
Definition: domtree.cpp:91