LLVM: include/llvm/CodeGen/MachineInstrBundleIterator.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLEITERATOR_H
14#define LLVM_CODEGEN_MACHINEINSTRBUNDLEITERATOR_H
15
18#include
19#include
20#include <type_traits>
21
22namespace llvm {
23
49
52
53 template static Iterator getBundleBegin(Iterator I) {
54 if (.isEnd())
55 while (I->isBundledWithPred())
56 --I;
57 return I;
58 }
59
60
61 template static Iterator getBundleFinal(Iterator I) {
62 if (.isEnd())
63 while (I->isBundledWithSucc())
64 ++I;
65 return I;
66 }
67
68
69 template static void increment(Iterator &I) {
71 }
72
73
74 template static void decrement(Iterator &I) {
76 }
77};
78
80
81 template static Iterator getBundleBegin(Iterator I) {
83 I.getReverse())
84 .getReverse();
85 }
86
87
88 template static Iterator getBundleFinal(Iterator I) {
90 I.getReverse())
91 .getReverse();
92 }
93
94
95 template static void increment(Iterator &I) {
97 }
98
99
100 template static void decrement(Iterator &I) {
102 }
103};
104
105
106
107template <typename Ty, bool IsReverse = false>
110 using instr_iterator = typename Traits::instr_iterator;
111
112 instr_iterator MII;
113
114public:
115 using value_type = typename instr_iterator::value_type;
117 using pointer = typename instr_iterator::pointer;
118 using reference = typename instr_iterator::reference;
119 using const_pointer = typename instr_iterator::const_pointer;
122
123private:
124 using nonconst_instr_iterator = typename Traits::nonconst_instr_iterator;
125 using const_instr_iterator = typename Traits::const_instr_iterator;
126 using nonconst_iterator =
128 IsReverse>;
130
131public:
133 assert((.getNodePtr() || MI.isEnd() ||
->isBundledWithPred()) &&
134 "It's not legal to initialize MachineInstrBundleIterator with a "
135 "bundled MI");
136 }
137
139 assert(.isBundledWithPred() && "It's not legal to initialize "
140 "MachineInstrBundleIterator with a "
141 "bundled MI");
142 }
143
145
146 assert(( ||
->isBundledWithPred()) && "It's not legal to initialize "
147 "MachineInstrBundleIterator "
148 "with a bundled MI");
149 }
150
151
152 template
155 std::enable_if_t<std::is_convertible<OtherTy *, Ty *>::value, void *> =
156 nullptr)
158
160
161
162
163
164
165
166
167
168
172
173
177
180
181
182 bool isValid() const { return MII.getNodePtr(); }
183
186 return L.MII == R.MII;
187 }
189 const const_instr_iterator &R) {
190 return L.MII == R;
191 }
192 friend bool operator==(const const_instr_iterator &L,
194 return L == R.MII;
195 }
197 const nonconst_instr_iterator &R) {
198 return L.MII == R;
199 }
200 friend bool operator==(const nonconst_instr_iterator &L,
202 return L == R.MII;
203 }
205 return L == const_instr_iterator(R);
206 }
208 return const_instr_iterator(L) == R;
209 }
212 return L == &R;
213 }
216 return &L == R;
217 }
218
221 return !(L == R);
222 }
224 const const_instr_iterator &R) {
225 return !(L == R);
226 }
227 friend bool operator!=(const const_instr_iterator &L,
229 return !(L == R);
230 }
232 const nonconst_instr_iterator &R) {
233 return !(L == R);
234 }
235 friend bool operator!=(const nonconst_instr_iterator &L,
237 return !(L == R);
238 }
240 return !(L == R);
241 }
243 return !(L == R);
244 }
247 return !(L == R);
248 }
251 return !(L == R);
252 }
253
254
265 --*this;
266 return Temp;
267 }
270 ++*this;
271 return Temp;
272 }
273
275
277
278
279
280
281
282
284};
285
286}
287
288#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
friend bool operator!=(const MachineInstrBundleIterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:219
friend bool operator!=(const MachineInstrBundleIterator &L, const const_instr_iterator &R)
Definition MachineInstrBundleIterator.h:223
friend bool operator==(const nonconst_instr_iterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:200
friend bool operator==(const const_instr_iterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:192
reverse_iterator getReverse() const
Definition MachineInstrBundleIterator.h:283
MachineInstrBundleIterator(pointer MI)
Definition MachineInstrBundleIterator.h:144
typename instr_iterator::difference_type difference_type
Definition MachineInstrBundleIterator.h:116
friend bool operator!=(const_reference L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:249
friend bool operator==(const MachineInstrBundleIterator &L, const nonconst_instr_iterator &R)
Definition MachineInstrBundleIterator.h:196
friend bool operator==(const MachineInstrBundleIterator &L, const_pointer R)
Definition MachineInstrBundleIterator.h:204
friend bool operator!=(const const_instr_iterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:227
friend bool operator!=(const_pointer L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:242
nonconst_iterator getNonConstIterator() const
Definition MachineInstrBundleIterator.h:276
MachineInstrBundleIterator(const MachineInstrBundleIterator< OtherTy, IsReverse > &I, std::enable_if_t< std::is_convertible< OtherTy *, Ty * >::value, void * >=nullptr)
Definition MachineInstrBundleIterator.h:153
friend bool operator==(const MachineInstrBundleIterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:184
friend bool operator==(const MachineInstrBundleIterator &L, const const_instr_iterator &R)
Definition MachineInstrBundleIterator.h:188
friend bool operator==(const MachineInstrBundleIterator &L, const_reference R)
Definition MachineInstrBundleIterator.h:210
typename instr_iterator::value_type value_type
Definition MachineInstrBundleIterator.h:115
MachineInstrBundleIterator & operator++()
Definition MachineInstrBundleIterator.h:259
friend bool operator!=(const MachineInstrBundleIterator &L, const nonconst_instr_iterator &R)
Definition MachineInstrBundleIterator.h:231
friend bool operator!=(const MachineInstrBundleIterator &L, const_pointer R)
Definition MachineInstrBundleIterator.h:239
typename instr_iterator::pointer pointer
Definition MachineInstrBundleIterator.h:117
MachineInstrBundleIterator & operator--()
Definition MachineInstrBundleIterator.h:255
friend bool operator==(const_reference L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:214
friend bool operator!=(const nonconst_instr_iterator &L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:235
instr_iterator getInstrIterator() const
Definition MachineInstrBundleIterator.h:274
MachineInstrBundleIterator(reference MI)
Definition MachineInstrBundleIterator.h:138
MachineInstrBundleIterator operator--(int)
Definition MachineInstrBundleIterator.h:263
std::bidirectional_iterator_tag iterator_category
Definition MachineInstrBundleIterator.h:121
friend bool operator!=(const MachineInstrBundleIterator &L, const_reference R)
Definition MachineInstrBundleIterator.h:245
typename instr_iterator::const_pointer const_pointer
Definition MachineInstrBundleIterator.h:119
static MachineInstrBundleIterator getAtBundleBegin(instr_iterator MI)
Get the bundle iterator for the given instruction's bundle.
Definition MachineInstrBundleIterator.h:174
MachineInstrBundleIterator(const MachineInstrBundleIterator< Ty, !IsReverse > &I)
Explicit conversion between forward/reverse iterators.
Definition MachineInstrBundleIterator.h:169
reference operator*() const
Definition MachineInstrBundleIterator.h:178
friend bool operator==(const_pointer L, const MachineInstrBundleIterator &R)
Definition MachineInstrBundleIterator.h:207
typename instr_iterator::reference reference
Definition MachineInstrBundleIterator.h:118
MachineInstrBundleIterator(instr_iterator MI)
Definition MachineInstrBundleIterator.h:132
MachineInstrBundleIterator()
Definition MachineInstrBundleIterator.h:159
typename instr_iterator::const_reference const_reference
Definition MachineInstrBundleIterator.h:120
MachineInstrBundleIterator operator++(int)
Definition MachineInstrBundleIterator.h:268
pointer operator->() const
Definition MachineInstrBundleIterator.h:179
bool isValid() const
Check for null.
Definition MachineInstrBundleIterator.h:182
A simple intrusive list implementation.
ilist_select_iterator_type< OptionsT, true, true > const_reverse_iterator
ilist_select_iterator_type< OptionsT, true, false > reverse_iterator
ilist_select_iterator_type< OptionsT, false, false > iterator
ilist_select_iterator_type< OptionsT, false, true > const_iterator
This file defines classes to implement an intrusive doubly linked list class (i.e.
This is an optimization pass for GlobalISel generic memory operations.
static Iterator getBundleBegin(Iterator I)
Get the beginning of the current bundle.
Definition MachineInstrBundleIterator.h:53
static void increment(Iterator &I)
Increment forward ilist iterator.
Definition MachineInstrBundleIterator.h:69
static Iterator getBundleFinal(Iterator I)
Get the final node of the current bundle.
Definition MachineInstrBundleIterator.h:61
static void decrement(Iterator &I)
Decrement forward ilist iterator.
Definition MachineInstrBundleIterator.h:74
static Iterator getBundleFinal(Iterator I)
Get the final node of the current bundle.
Definition MachineInstrBundleIterator.h:88
static Iterator getBundleBegin(Iterator I)
Get the beginning of the current bundle.
Definition MachineInstrBundleIterator.h:81
static void decrement(Iterator &I)
Decrement reverse ilist iterator.
Definition MachineInstrBundleIterator.h:100
static void increment(Iterator &I)
Increment reverse ilist iterator.
Definition MachineInstrBundleIterator.h:95
simple_ilist< T, ilist_sentinel_tracking< true > > list_type
Definition MachineInstrBundleIterator.h:26
typename list_type::iterator instr_iterator
Definition MachineInstrBundleIterator.h:27
typename list_type::iterator nonconst_instr_iterator
Definition MachineInstrBundleIterator.h:28
typename list_type::const_iterator const_instr_iterator
Definition MachineInstrBundleIterator.h:29
typename list_type::reverse_iterator nonconst_instr_iterator
Definition MachineInstrBundleIterator.h:34
typename list_type::const_reverse_iterator const_instr_iterator
Definition MachineInstrBundleIterator.h:35
simple_ilist< T, ilist_sentinel_tracking< true > > list_type
Definition MachineInstrBundleIterator.h:32
typename list_type::reverse_iterator instr_iterator
Definition MachineInstrBundleIterator.h:33
typename list_type::iterator nonconst_instr_iterator
Definition MachineInstrBundleIterator.h:40
typename list_type::const_iterator const_instr_iterator
Definition MachineInstrBundleIterator.h:41
simple_ilist< T, ilist_sentinel_tracking< true > > list_type
Definition MachineInstrBundleIterator.h:38
typename list_type::const_iterator instr_iterator
Definition MachineInstrBundleIterator.h:39
typename list_type::reverse_iterator nonconst_instr_iterator
Definition MachineInstrBundleIterator.h:46
simple_ilist< T, ilist_sentinel_tracking< true > > list_type
Definition MachineInstrBundleIterator.h:44
typename list_type::const_reverse_iterator instr_iterator
Definition MachineInstrBundleIterator.h:45
typename list_type::const_reverse_iterator const_instr_iterator
Definition MachineInstrBundleIterator.h:47