Jlm
Loading...
Searching...
No Matches
cfg-node.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2014 Helge Bahmann <hcb@chaoticmind.net>
3 * Copyright 2013 2014 2015 Nico Reißmann <nico.reissmann@gmail.com>
4 * See COPYING for terms of redistribution.
5 */
6
9
10namespace jlm::llvm
11{
12
14 ControlFlowGraphNode * source,
16 size_t index) noexcept
17 : source_(source),
18 sink_(sink),
19 index_(index)
20{}
21
22void
24{
25 if (sink_ == new_sink)
26 return;
27
28 sink_->inedges_.erase(this);
29 sink_ = new_sink;
30 new_sink->inedges_.insert(this);
31}
32
35{
36 auto sink = sink_;
37 auto bb = BasicBlock::create(source_->cfg());
38 divert(bb);
39 bb->add_outedge(sink);
40 return bb;
41}
42
44
45size_t
46ControlFlowGraphNode::NumOutEdges() const noexcept
47{
48 return outedges_.size();
49}
50
51void
53{
54 while (inedges_.size() != 0)
55 {
56 ControlFlowGraphEdge * edge = *inedges_.begin();
57 JLM_ASSERT(edge->sink() == this);
58 edge->source()->remove_outedge(edge->index());
59 }
60}
61
62size_t
64{
65 return inedges_.size();
66}
67
68bool
70{
71 return NumInEdges() == 0;
72}
73
74bool
76{
77 if (NumInEdges() == 0)
78 return false;
79
80 for (auto i = inedges_.begin(); i != inedges_.end(); i++)
81 {
82 JLM_ASSERT((*i)->sink() == this);
83 if ((*i)->source() != (*inedges_.begin())->source())
84 return false;
85 }
86
87 return true;
88}
89
90bool
92{
93 return NumOutEdges() == 0;
94}
95
96bool
98{
99 if (NumOutEdges() == 0)
100 return false;
101
102 for (auto & edge : OutEdges())
103 {
104 JLM_ASSERT(edge.source() == this);
105 if (edge.sink() != OutEdge(0)->sink())
106 return false;
107 }
108
109 return true;
110}
111
112bool
114{
115 for (auto & edge : OutEdges())
116 {
117 if (edge.is_selfloop())
118 return true;
119 }
120
121 return false;
122}
123
124}
static BasicBlock * create(ControlFlowGraph &cfg)
size_t index() const noexcept
Definition cfg-node.hpp:66
ControlFlowGraphEdge(ControlFlowGraphNode *source, ControlFlowGraphNode *sink, size_t index) noexcept
Definition cfg-node.cpp:13
ControlFlowGraphNode * sink_
Definition cfg-node.hpp:79
ControlFlowGraphNode * source() const noexcept
Definition cfg-node.hpp:51
ControlFlowGraphNode * source_
Definition cfg-node.hpp:78
ControlFlowGraphNode * sink() const noexcept
Definition cfg-node.hpp:57
void divert(ControlFlowGraphNode *new_sink)
Definition cfg-node.cpp:23
bool single_successor() const noexcept
Definition cfg-node.cpp:97
bool single_predecessor() const noexcept
Definition cfg-node.cpp:75
ControlFlowGraph & cfg() const noexcept
Definition cfg-node.hpp:106
std::unordered_set< ControlFlowGraphEdge * > inedges_
Definition cfg-node.hpp:207
bool has_selfloop_edge() const noexcept
Definition cfg-node.cpp:113
size_t NumInEdges() const noexcept
Definition cfg-node.cpp:63
virtual ~ControlFlowGraphNode() noexcept
bool no_predecessor() const noexcept
Definition cfg-node.cpp:69
ControlFlowGraphEdge * OutEdge(size_t n) const
Definition cfg-node.hpp:115
outedge_iterator_range OutEdges() const
Definition cfg-node.hpp:122
bool no_successor() const noexcept
Definition cfg-node.cpp:91
size_t NumOutEdges() const noexcept
Definition cfg-node.cpp:46
#define JLM_ASSERT(x)
Definition common.hpp:16
Global memory state passed between functions.