11 #ifndef LLVM_ANALYSIS_REGIONITERATOR_H
12 #define LLVM_ANALYSIS_REGIONITERATOR_H
33 template<
class NodeType>
37 typedef std::iterator<std::forward_iterator_tag, NodeType, ptrdiff_t> super;
57 void advanceRegionSucc() {
58 assert(Node.
getInt() == ItRgBegin &&
"Cannot advance region successor!");
65 bool isRegionMode()
const {
return Node.
getInt() != ItBB; }
71 succ = getNode()->getParent()->getNode(BB);
72 assert(succ &&
"BB not in Region or entered subregion!");
78 assert(Node.
getInt() == ItRgBegin &&
"Cannot get the region successor!");
79 return getNode()->template getNodeAs<Region>()->getExit();
84 return getNode()->getParent()->getExit() == BB;
93 : Node(node, node->isSubRegion() ? ItRgBegin : ItBB),
99 while (
succ_end(node->getEntry()) != BItor && isExit(*BItor))
102 if (isRegionMode() && isExit(getRegionSucc()))
108 : Node(node, node->isSubRegion() ? ItRgEnd : ItBB),
109 BItor(
succ_end(node->getEntry())) {}
112 assert(isRegionMode() == x.isRegionMode() &&
"Broken iterator!");
116 return BItor == x.BItor;
122 BasicBlock* BB = isRegionMode() ? getRegionSucc() : *BItor;
123 assert(!isExit(BB) &&
"Iterator out of range!");
135 while (BItor !=
succ_end(getNode()->getEntry())
149 assert(getNode()->
getParent() == I.getNode()->getParent()
150 &&
"Cannot assign iterators of two different regions!");
165 template<
class NodeType>
167 :
public std::iterator<std::forward_iterator_tag, NodeType, ptrdiff_t>
169 typedef std::iterator<std::forward_iterator_tag, NodeType, ptrdiff_t> super;
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 (
succ_end(Node->getEntry()) != Itor
189 && Node->getParent()->getExit() == *Itor)
195 assert(!Node->isSubRegion()
196 &&
"Subregion node not allowed in flat iterating mode!");
200 assert(Node->getParent() == x.Node->getParent()
201 &&
"Cannot compare iterators of different regions!");
203 return Itor == x.Itor && Node == x.Node;
212 Region* Parent = Node->getParent();
216 assert(Parent->
getExit() != BB &&
"iterator out of range!");
225 while (Itor !=
succ_end(Node->getEntry())
226 && Node->getParent()->getExit() == *Itor);
239 assert(Node->getParent() == I.Node->getParent()
240 &&
"Cannot assign iterators to two different regions!");
248 template<
class NodeType>
253 template<
class NodeType>
265 #define RegionNodeGraphTraits(NodeT) \
266 template<> struct GraphTraits<NodeT*> { \
267 typedef NodeT NodeType; \
268 typedef RNSuccIterator<NodeType> ChildIteratorType; \
269 static NodeType *getEntryNode(NodeType* N) { return N; } \
270 static inline ChildIteratorType child_begin(NodeType *N) { \
271 return RNSuccIterator<NodeType>(N); \
273 static inline ChildIteratorType child_end(NodeType *N) { \
274 return RNSuccIterator<NodeType>(N, true); \
277 template<> struct GraphTraits<FlatIt<NodeT*> > { \
278 typedef NodeT NodeType; \
279 typedef RNSuccIterator<FlatIt<NodeT> > ChildIteratorType; \
280 static NodeType *getEntryNode(NodeType* N) { return N; } \
281 static inline ChildIteratorType child_begin(NodeType *N) { \
282 return RNSuccIterator<FlatIt<NodeType> >(N); \
284 static inline ChildIteratorType child_end(NodeType *N) { \
285 return RNSuccIterator<FlatIt<NodeType> >(N, true); \
289 #define RegionGraphTraits(RegionT, NodeT) \
290 template<> struct GraphTraits<RegionT*> \
291 : public GraphTraits<NodeT*> { \
292 typedef df_iterator<NodeType*> nodes_iterator; \
293 static NodeType *getEntryNode(RegionT* R) { \
294 return R->getNode(R->getEntry()); \
296 static nodes_iterator nodes_begin(RegionT* R) { \
297 return nodes_iterator::begin(getEntryNode(R)); \
299 static nodes_iterator nodes_end(RegionT* R) { \
300 return nodes_iterator::end(getEntryNode(R)); \
303 template<> struct GraphTraits<FlatIt<RegionT*> > \
304 : public GraphTraits<FlatIt<NodeT*> > { \
305 typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false, \
306 GraphTraits<FlatIt<NodeType*> > > nodes_iterator; \
307 static NodeType *getEntryNode(RegionT* R) { \
308 return R->getBBNode(R->getEntry()); \
310 static nodes_iterator nodes_begin(RegionT* R) { \
311 return nodes_iterator::begin(getEntryNode(R)); \
313 static nodes_iterator nodes_end(RegionT* R) { \
314 return nodes_iterator::end(getEntryNode(R)); \
const_iterator end(StringRef path)
Get end iterator over path.
static NodeType * getEntryNode(RegionInfo *RI)
RegionNodeGraphTraits(RegionNode)
static nodes_iterator nodes_begin(RegionInfo *RI)
Hierarchical RegionNode successor iterator.
RNSuccIterator(NodeType *node)
Create begin iterator of a RegionNode.
const_iterator begin(StringRef path)
Get begin iterator over path.
A RegionNode represents a subregion or a BasicBlock that is part of a Region.
static nodes_iterator nodes_end(RegionInfo *RI)
Flat RegionNode iterator.
bool operator!=(const Self &x) const
bool operator==(const Self &x) const
Interval::succ_iterator succ_begin(Interval *I)
void setInt(IntType IntVal)
pointer operator*() const
Interval::succ_iterator succ_end(Interval *I)
RNSuccIterator(NodeType *node)
Create the iterator from a RegionNode.
bool operator==(const Self &x) const
bool operator!=(const Self &x) const
LLVM Basic Block Representation.
A single entry single exit Region.
RNSuccIterator(NodeType *node, bool)
Create an end iterator.
RNSuccIterator(NodeType *node, bool)
Create an end iterator.
BasicBlock * getExit() const
Get the exit BasicBlock of the Region.
RNSuccIterator< FlatIt< NodeType > > Self
PointerTy getPointer() const
FlatIt< RegionNode * >::UnknownGraphTypeError NodeType
RegionNode * getBBNode(BasicBlock *BB) const
Get the BasicBlock RegionNode for a BasicBlock.
Region * getTopLevelRegion() const
RegionGraphTraits(Region, RegionNode)
const Self & operator=(const Self &I)
RNSuccIterator< NodeType > Self
Marker class to iterate over the elements of a Region in flat mode.
pointer operator*() const
static const Function * getParent(const Value *V)
df_iterator< NodeType *, SmallPtrSet< NodeType *, 8 >, false, GraphTraits< FlatIt< NodeType * > > > nodes_iterator
const Self & operator=(const Self &I)
Analysis that detects all canonical Regions.