Jlm
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 
10 namespace jlm::llvm
11 {
12 
14  ControlFlowGraphNode * source,
15  ControlFlowGraphNode * sink,
16  size_t index) noexcept
17  : source_(source),
18  sink_(sink),
19  index_(index)
20 {}
21 
22 void
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 
33 BasicBlock *
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 
45 size_t
46 ControlFlowGraphNode::NumOutEdges() const noexcept
47 {
48  return outedges_.size();
49 }
50 
51 void
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 
62 size_t
64 {
65  return inedges_.size();
66 }
67 
68 bool
70 {
71  return NumInEdges() == 0;
72 }
73 
74 bool
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 
90 bool
92 {
93  return NumOutEdges() == 0;
94 }
95 
96 bool
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 
112 bool
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)
Definition: basic-block.cpp:37
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 * sink() const noexcept
Definition: cfg-node.hpp:57
ControlFlowGraphNode * source_
Definition: cfg-node.hpp:78
void divert(ControlFlowGraphNode *new_sink)
Definition: cfg-node.cpp:23
ControlFlowGraphNode * source() const noexcept
Definition: cfg-node.hpp:51
bool single_successor() const noexcept
Definition: cfg-node.cpp:97
bool single_predecessor() const noexcept
Definition: cfg-node.cpp:75
ControlFlowGraphEdge * OutEdge(size_t n) const
Definition: cfg-node.hpp:115
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
ControlFlowGraph & cfg() const noexcept
Definition: cfg-node.hpp:106
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.