11 #ifndef LLVM_ANALYSIS_REGIONITERATOR_H
12 #define LLVM_ANALYSIS_REGIONITERATOR_H
33 template <
class NodeRef,
class BlockT,
class RegionT>
35 :
public std::iterator<std::forward_iterator_tag, NodeRef> {
36 typedef std::iterator<std::forward_iterator_tag, NodeRef> super;
39 typedef typename BlockTraits::ChildIteratorType SuccIterTy;
52 static_assert(std::is_pointer<NodeRef>::value,
53 "FIXME: Currently RNSuccIterator only supports NodeRef as "
54 "pointers due to the use of pointer-specific data structures "
55 "(e.g. PointerIntPair and SmallPtrSet) internally. Generalize "
56 "it to support non-pointer types");
66 void advanceRegionSucc() {
67 assert(Node.
getInt() == ItRgBegin &&
"Cannot advance region successor!");
71 NodeRef getNode()
const {
return Node.
getPointer(); }
74 bool isRegionMode()
const {
return Node.
getInt() != ItBB; }
78 NodeRef getISucc(BlockT *BB)
const {
80 succ = getNode()->getParent()->getNode(BB);
81 assert(succ &&
"BB not in Region or entered subregion!");
86 inline BlockT* getRegionSucc()
const {
87 assert(Node.
getInt() == ItRgBegin &&
"Cannot get the region successor!");
88 return getNode()->template getNodeAs<RegionT>()->getExit();
92 inline bool isExit(BlockT* BB)
const {
93 return getNode()->getParent()->getExit() == BB;
102 : Node(node, node->isSubRegion() ? ItRgBegin : ItBB),
103 BItor(
BlockTraits::child_begin(node->getEntry())) {
107 while (BlockTraits::child_end(node->getEntry()) != BItor && isExit(*BItor))
110 if (isRegionMode() && isExit(getRegionSucc()))
116 : Node(node, node->isSubRegion() ? ItRgEnd : ItBB),
120 assert(isRegionMode() == x.isRegionMode() &&
"Broken iterator!");
124 return BItor == x.BItor;
130 BlockT *BB = isRegionMode() ? getRegionSucc() : *BItor;
131 assert(!isExit(BB) &&
"Iterator out of range!");
143 while (BItor != BlockTraits::child_end(getNode()->getEntry())
163 template <
class NodeRef,
class BlockT,
class RegionT>
165 :
public std::iterator<std::forward_iterator_tag, NodeRef> {
166 typedef std::iterator<std::forward_iterator_tag, NodeRef> super;
168 typedef typename BlockTraits::ChildIteratorType SuccIterTy;
182 : Node(node), Itor(
BlockTraits::child_begin(node->getEntry())) {
183 assert(!Node->isSubRegion() &&
184 "Subregion node not allowed in flat iterating mode!");
185 assert(Node->getParent() &&
"A BB node must have a parent!");
188 while (BlockTraits::child_end(Node->getEntry()) != Itor &&
189 Node->getParent()->getExit() == *Itor)
195 : Node(node), Itor(
BlockTraits::child_end(node->getEntry())) {
196 assert(!Node->isSubRegion() &&
197 "Subregion node not allowed in flat iterating mode!");
201 assert(Node->getParent() == x.Node->getParent()
202 &&
"Cannot compare iterators of different regions!");
204 return Itor == x.Itor && Node == x.Node;
213 RegionT *Parent = Node->getParent();
217 assert(Parent->getExit() != BB &&
"iterator out of range!");
219 return Parent->getBBNode(BB);
226 while (Itor !=
succ_end(Node->getEntry())
227 && Node->getParent()->getExit() == *Itor);
239 template <
class NodeRef,
class BlockT,
class RegionT>
244 template <
class NodeRef,
class BlockT,
class RegionT>
256 #define RegionNodeGraphTraits(NodeT, BlockT, RegionT) \
257 template <> struct GraphTraits<NodeT *> { \
258 typedef NodeT *NodeRef; \
259 typedef RNSuccIterator<NodeRef, BlockT, RegionT> ChildIteratorType; \
260 static NodeRef getEntryNode(NodeRef N) { return N; } \
261 static inline ChildIteratorType child_begin(NodeRef N) { \
262 return RNSuccIterator<NodeRef, BlockT, RegionT>(N); \
264 static inline ChildIteratorType child_end(NodeRef N) { \
265 return RNSuccIterator<NodeRef, BlockT, RegionT>(N, true); \
268 template <> struct GraphTraits<FlatIt<NodeT *>> { \
269 typedef NodeT *NodeRef; \
270 typedef RNSuccIterator<FlatIt<NodeRef>, BlockT, RegionT> \
272 static NodeRef getEntryNode(NodeRef N) { return N; } \
273 static inline ChildIteratorType child_begin(NodeRef N) { \
274 return RNSuccIterator<FlatIt<NodeRef>, BlockT, RegionT>(N); \
276 static inline ChildIteratorType child_end(NodeRef N) { \
277 return RNSuccIterator<FlatIt<NodeRef>, BlockT, RegionT>(N, true); \
281 #define RegionGraphTraits(RegionT, NodeT) \
282 template <> struct GraphTraits<RegionT *> : public GraphTraits<NodeT *> { \
283 typedef df_iterator<NodeRef> nodes_iterator; \
284 static NodeRef getEntryNode(RegionT *R) { \
285 return R->getNode(R->getEntry()); \
287 static nodes_iterator nodes_begin(RegionT *R) { \
288 return nodes_iterator::begin(getEntryNode(R)); \
290 static nodes_iterator nodes_end(RegionT *R) { \
291 return nodes_iterator::end(getEntryNode(R)); \
295 struct GraphTraits<FlatIt<RegionT *>> \
296 : public GraphTraits<FlatIt<NodeT *>> { \
297 typedef df_iterator<NodeRef, df_iterator_default_set<NodeRef>, false, \
298 GraphTraits<FlatIt<NodeRef>>> \
300 static NodeRef getEntryNode(RegionT *R) { \
301 return R->getBBNode(R->getEntry()); \
303 static nodes_iterator nodes_begin(RegionT *R) { \
304 return nodes_iterator::begin(getEntryNode(R)); \
306 static nodes_iterator nodes_end(RegionT *R) { \
307 return nodes_iterator::end(getEntryNode(R)); \
const_iterator end(StringRef path)
Get end iterator over path.
void setInt(IntType IntVal)
static nodes_iterator nodes_begin(RegionInfo *RI)
Hierarchical RegionNode successor iterator.
Flat RegionNode iterator.
super::value_type value_type
RNSuccIterator< NodeRef, BlockT, RegionT > Self
RNSuccIterator(NodeRef node)
Create the iterator from a RegionNode.
df_iterator< NodeRef, df_iterator_default_set< NodeRef >, false, GraphTraits< FlatIt< NodeRef > > > nodes_iterator
const_iterator begin(StringRef path)
Get begin iterator over path.
RegionT * getTopLevelRegion() const
static nodes_iterator nodes_end(RegionInfo *RI)
RNSuccIterator(NodeRef node, bool)
Create an end iterator.
RegionInfo & getRegionInfo()
bool operator==(const Self &x) const
static nodes_iterator nodes_begin(RegionInfoPass *RI)
super::value_type value_type
Interval::succ_iterator succ_begin(Interval *I)
succ_begin/succ_end - define methods so that Intervals may be used just like BasicBlocks can with the...
PointerTy getPointer() const
RNSuccIterator(NodeRef node, bool)
Create an end iterator.
RegionNodeGraphTraits(RegionNode, BasicBlock, Region)
Interval::succ_iterator succ_end(Interval *I)
bool operator!=(const Self &x) const
FlatIt< RegionNode * >::UnknownGraphTypeError NodeRef
df_iterator< NodeRef, df_iterator_default_set< NodeRef >, false, GraphTraits< FlatIt< NodeRef > > > nodes_iterator
static NodeRef getEntryNode(RegionInfoPass *RI)
static NodeRef getEntryNode(RegionInfo *RI)
RNSuccIterator(NodeRef node)
Create begin iterator of a RegionNode.
value_type operator*() const
RegionGraphTraits(Region, RegionNode)
value_type operator*() const
bool operator!=(const Self &x) const
Marker class to iterate over the elements of a Region in flat mode.
static nodes_iterator nodes_end(RegionInfoPass *RI)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool operator==(const Self &x) const
RNSuccIterator< FlatIt< NodeRef >, BlockT, RegionT > Self