LLVM: include/llvm/ADT/PostOrderIterator.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef LLVM_ADT_POSTORDERITERATOR_H
17#define LLVM_ADT_POSTORDERITERATOR_H
18
23#include
24#include
25#include
26#include <type_traits>
27#include
28
29namespace llvm {
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58template<class SetType, bool External>
60 SetType Visited;
61
62public:
63
64 template
65 bool insertEdge(std::optional From, NodeRef To) {
66 return Visited.insert(To).second;
67 }
68
69
71};
72
73
74template
76 SetType &Visited;
77
78public:
81
82
83
84
85 template
86 bool insertEdge(std::optional From, NodeRef To) {
87 return Visited.insert(To).second;
88 }
89
90
92};
93
94template <class GraphT,
95 class SetType = SmallPtrSet<typename GraphTraits::NodeRef, 8>,
96 bool ExtStorage = false, class GT = GraphTraits>
98public:
99
101 std::conditional_t<ExtStorage, std::input_iterator_tag,
102 std::forward_iterator_tag>;
107
108private:
109 using NodeRef = typename GT::NodeRef;
110 using ChildItTy = typename GT::ChildIteratorType;
111
112
113
114
116
117 po_iterator(NodeRef BB) {
118 this->insertEdge(std::optional(), BB);
119 VisitStack.emplace_back(BB, GT::child_begin(BB), GT::child_end(BB));
120 traverseChild();
121 }
122
123 po_iterator() = default;
124
127 if (this->insertEdge(std::optional(), BB)) {
128 VisitStack.emplace_back(BB, GT::child_begin(BB), GT::child_end(BB));
129 traverseChild();
130 }
131 }
132
133 po_iterator(SetType &S)
134 : po_iterator_storage<SetType, ExtStorage>(S) {
135 }
136
137 void traverseChild() {
138 while (true) {
139 auto &Entry = VisitStack.back();
140 if (std::get<1>(Entry) == std::get<2>(Entry))
141 break;
142 NodeRef BB = *std::get<1>(Entry)++;
143 if (this->insertEdge(std::optional(std::get<0>(Entry)), BB)) {
144
145 VisitStack.emplace_back(BB, GT::child_begin(BB), GT::child_end(BB));
146 }
147 }
148 }
149
150public:
151
152 static po_iterator begin(const GraphT &G) {
153 return po_iterator(GT::getEntryNode(G));
154 }
155 static po_iterator end(const GraphT &G) { return po_iterator(); }
156
157 static po_iterator begin(const GraphT &G, SetType &S) {
158 return po_iterator(GT::getEntryNode(G), S);
159 }
160 static po_iterator end(const GraphT &G, SetType &S) { return po_iterator(S); }
161
163 return VisitStack == x.VisitStack;
164 }
165 bool operator!=(const po_iterator &x) const { return !(*this == x); }
166
168
169
170
171
172
174
177 VisitStack.pop_back();
178 if (!VisitStack.empty())
179 traverseChild();
180 return *this;
181 }
182
184 po_iterator tmp = *this;
185 ++*this;
186 return tmp;
187 }
188};
189
190
191
192template
194template
196
200
201
202template <class T, class SetType = std::set<typename GraphTraits::NodeRef>>
205 po_iterator<T, SetType, true>(V) {}
206};
207
208template<class T, class SetType>
212
213template<class T, class SetType>
217
218template <class T, class SetType>
222
223
224template <class T, class SetType = std::set<typename GraphTraits::NodeRef>,
225 bool External = false>
226struct ipo_iterator : po_iterator<Inverse, SetType, External> {
228 po_iterator<Inverse<T>, SetType, External> (V) {}
229};
230
231template
235
236template
240
241template
245
246
247template <class T, class SetType = std::set<typename GraphTraits::NodeRef>>
254
255template <class T, class SetType>
259
260template <class T, class SetType>
264
265template <class T, class SetType>
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298template<class GraphT, class GT = GraphTraits>
300 using NodeRef = typename GT::NodeRef;
301
303 VecTy Blocks;
304
305 void Initialize(const GraphT &G) {
306 std::copy(po_begin(G), po_end(G), std::back_inserter(Blocks));
307 }
308
309public:
312
314
315
320};
321
322}
323
324#endif
This file defines the little GraphTraits template class that should be specialized by classes that...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
const_rpo_iterator end() const
Definition PostOrderIterator.h:319
const_rpo_iterator begin() const
Definition PostOrderIterator.h:317
ReversePostOrderTraversal(const GraphT &G)
Definition PostOrderIterator.h:313
typename VecTy::reverse_iterator rpo_iterator
Definition PostOrderIterator.h:310
typename VecTy::const_reverse_iterator const_rpo_iterator
Definition PostOrderIterator.h:311
rpo_iterator begin()
Definition PostOrderIterator.h:316
rpo_iterator end()
Definition PostOrderIterator.h:318
reference emplace_back(ArgTypes &&... Args)
std::reverse_iterator< const_iterator > const_reverse_iterator
std::reverse_iterator< iterator > reverse_iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A range adaptor for a pair of iterators.
void finishPostorder(NodeRef BB)
Definition PostOrderIterator.h:91
po_iterator_storage(const po_iterator_storage &S)
Definition PostOrderIterator.h:80
bool insertEdge(std::optional< NodeRef > From, NodeRef To)
Definition PostOrderIterator.h:86
po_iterator_storage(SetType &VSet)
Definition PostOrderIterator.h:79
Default po_iterator_storage implementation with an internal set object.
Definition PostOrderIterator.h:59
bool insertEdge(std::optional< NodeRef > From, NodeRef To)
Definition PostOrderIterator.h:65
void finishPostorder(NodeRef BB)
Definition PostOrderIterator.h:70
Definition PostOrderIterator.h:97
static po_iterator end(const GraphT &G, SetType &S)
Definition PostOrderIterator.h:160
reference operator*() const
Definition PostOrderIterator.h:167
std::ptrdiff_t difference_type
Definition PostOrderIterator.h:104
static po_iterator end(const GraphT &G)
Definition PostOrderIterator.h:155
value_type * pointer
Definition PostOrderIterator.h:105
const value_type & reference
Definition PostOrderIterator.h:106
NodeRef operator->() const
Definition PostOrderIterator.h:173
typename GT::NodeRef value_type
Definition PostOrderIterator.h:103
static po_iterator begin(const GraphT &G)
Definition PostOrderIterator.h:152
po_iterator & operator++()
Definition PostOrderIterator.h:175
po_iterator operator++(int)
Definition PostOrderIterator.h:183
std::conditional_t< ExtStorage, std::input_iterator_tag, std::forward_iterator_tag > iterator_category
Definition PostOrderIterator.h:100
bool operator==(const po_iterator &x) const
Definition PostOrderIterator.h:162
bool operator!=(const po_iterator &x) const
Definition PostOrderIterator.h:165
static po_iterator begin(const GraphT &G, SetType &S)
Definition PostOrderIterator.h:157
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
This is an optimization pass for GlobalISel generic memory operations.
ipo_iterator< T > ipo_end(const T &G)
Definition PostOrderIterator.h:237
iterator_range< po_ext_iterator< T, SetType > > post_order_ext(const T &G, SetType &S)
Definition PostOrderIterator.h:219
iterator_range< ipo_ext_iterator< T, SetType > > inverse_post_order_ext(const T &G, SetType &S)
Definition PostOrderIterator.h:267
ipo_ext_iterator< T, SetType > ipo_ext_begin(const T &G, SetType &S)
Definition PostOrderIterator.h:256
iterator_range< ipo_iterator< T > > inverse_post_order(const T &G)
Definition PostOrderIterator.h:242
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< po_iterator< T > > post_order(const T &G)
Definition PostOrderIterator.h:197
po_ext_iterator< T, SetType > po_ext_end(T G, SetType &S)
Definition PostOrderIterator.h:214
po_iterator< T > po_begin(const T &G)
Definition PostOrderIterator.h:193
ipo_ext_iterator< T, SetType > ipo_ext_end(const T &G, SetType &S)
Definition PostOrderIterator.h:261
ipo_iterator< T > ipo_begin(const T &G)
Definition PostOrderIterator.h:232
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
po_iterator< T > po_end(const T &G)
Definition PostOrderIterator.h:195
po_ext_iterator< T, SetType > po_ext_begin(T G, SetType &S)
Definition PostOrderIterator.h:209
ipo_ext_iterator(const ipo_iterator< T, SetType, true > &V)
Definition PostOrderIterator.h:249
ipo_ext_iterator(const po_iterator< Inverse< T >, SetType, true > &V)
Definition PostOrderIterator.h:251
ipo_iterator(const po_iterator< Inverse< T >, SetType, External > &V)
Definition PostOrderIterator.h:227
po_ext_iterator(const po_iterator< T, SetType, true > &V)
Definition PostOrderIterator.h:204