11 #include <unordered_map>
21 c->depth_ =
depth() + 1;
29 static std::unique_ptr<DominatorTreeNode>
31 std::unordered_map<ControlFlowGraphNode *, ControlFlowGraphNode *> & doms,
36 std::unordered_map<ControlFlowGraphNode *, DominatorTreeNode *> &)>
38 std::unordered_map<ControlFlowGraphNode *, DominatorTreeNode *> & map)
40 if (map.find(node) != map.end())
43 auto parent = build(doms[node], map);
49 auto & cfg = root->
cfg();
53 std::unordered_set<ControlFlowGraphNode *> nodes({ cfg.entry(), cfg.exit() });
54 for (
auto & node : cfg)
56 for (
auto & node : cfg)
57 nodes.erase(doms[&node]);
60 std::unordered_map<ControlFlowGraphNode *, DominatorTreeNode *> map;
62 map[root] = domroot.get();
63 for (
auto node : nodes)
69 static ControlFlowGraphNode *
73 const std::unordered_map<ControlFlowGraphNode *, size_t> & indices,
74 const std::unordered_map<ControlFlowGraphNode *, ControlFlowGraphNode *> & doms)
76 while (indices.at(b1) != indices.at(b2))
78 while (indices.at(b1) < indices.at(b2))
80 while (indices.at(b2) < indices.at(b1))
90 std::unique_ptr<DominatorTreeNode>
95 std::unordered_map<ControlFlowGraphNode *, ControlFlowGraphNode *> doms(
97 for (
auto & node : cfg)
98 doms[&node] =
nullptr;
100 size_t index = cfg.
nnodes() + 2;
102 std::unordered_map<ControlFlowGraphNode *, size_t> indices;
103 for (
auto & node : rporder)
104 indices[node] = index--;
111 for (
auto & node : rporder)
113 if (node == cfg.
entry())
118 for (
auto & inedge : node->InEdges())
120 auto p = inedge.source();
121 if (doms[p] !=
nullptr)
130 for (
auto & inedge : node->InEdges())
132 auto p = inedge.source();
136 if (doms[p] !=
nullptr)
137 newidom =
intersect(p, newidom, indices, doms);
140 if (doms[node] != newidom)
142 doms[node] = newidom;
148 doms[cfg.
entry()] =
nullptr;
ControlFlowGraph & cfg() const noexcept
EntryNode * entry() const noexcept
ExitNode * exit() const noexcept
size_t nnodes() const noexcept
static std::unique_ptr< DominatorTreeNode > create(ControlFlowGraphNode *node)
size_t depth() const noexcept
std::vector< std::unique_ptr< DominatorTreeNode > > children_
DominatorTreeNode * add_child(std::unique_ptr< DominatorTreeNode > child)
DominatorTreeNode * child(size_t index) const noexcept
Global memory state passed between functions.
static std::unique_ptr< DominatorTreeNode > build_domtree(std::unordered_map< ControlFlowGraphNode *, ControlFlowGraphNode * > &doms, ControlFlowGraphNode *root)
static ControlFlowGraphNode * intersect(ControlFlowGraphNode *b1, ControlFlowGraphNode *b2, const std::unordered_map< ControlFlowGraphNode *, size_t > &indices, const std::unordered_map< ControlFlowGraphNode *, ControlFlowGraphNode * > &doms)
std::unique_ptr< DominatorTreeNode > domtree(ControlFlowGraph &cfg)
bool is_closed(const ControlFlowGraph &cfg)
std::vector< ControlFlowGraphNode * > reverse_postorder(const ControlFlowGraph &cfg)