33 #ifndef LLVM_ANALYSIS_INTERVALITERATOR_H
34 #define LLVM_ANALYSIS_INTERVALITERATOR_H
69 Int->
Nodes.push_back(BB);
88 template<
class NodeTy,
class OrigContainer_t,
class GT = GraphTraits<NodeTy*>,
89 class IGT = GraphTraits<Inverse<NodeTy*> > >
91 std::vector<std::pair<Interval*, typename Interval::succ_iterator> > IntStack;
92 std::set<BasicBlock*> Visited;
93 OrigContainer_t *OrigContainer;
103 if (!ProcessInterval(&M->
front())) {
117 while (!IntStack.empty()) {
132 assert(!IntStack.empty() &&
"Attempting to use interval iterator at end!");
137 EndIt =
succ_end(IntStack.back().first);
138 while (SuccIt != EndIt) {
141 if (Done)
return *
this;
145 if (IOwnMem)
delete IntStack.back().first;
149 }
while (!IntStack.empty());
154 _Self tmp = *
this; ++*
this;
return tmp;
166 bool ProcessInterval(NodeTy *Node) {
168 if (Visited.count(Header))
return false;
171 Visited.insert(Header);
174 for (
typename GT::ChildIteratorType
I = GT::child_begin(Node),
175 E = GT::child_end(Node);
I != E; ++
I)
178 IntStack.push_back(std::make_pair(Int,
succ_begin(Int)));
191 void ProcessNode(Interval *Int, NodeTy *Node) {
192 assert(Int &&
"Null interval == bad!");
193 assert(Node &&
"Null Node == bad!");
197 if (Visited.count(NodeHeader)) {
198 if (Int->contains(NodeHeader)) {
201 if (!Int->isSuccessor(NodeHeader))
202 Int->Successors.push_back(NodeHeader);
205 for (
typename IGT::ChildIteratorType
I = IGT::child_begin(Node),
206 E = IGT::child_end(Node);
I != E; ++
I) {
207 if (!Int->contains(*
I)) {
208 if (!Int->isSuccessor(NodeHeader))
209 Int->Successors.push_back(NodeHeader);
217 Visited.insert(NodeHeader);
219 if (Int->isSuccessor(NodeHeader)) {
221 Int->Successors.erase(
std::remove(Int->Successors.begin(),
222 Int->Successors.end(), NodeHeader),
223 Int->Successors.end());
228 for (
typename GT::ChildIteratorType It = GT::child_begin(Node),
229 End = GT::child_end(Node); It != End; ++It)
241 bool DeleteInts =
true) {
function_interval_iterator intervals_end(Function *)
const Interval * operator->() const
int remove(const char *path);
bool operator!=(const _Self &x) const
BasicBlock * getNodeHeader(BasicBlock *BB)
IntervalIterator< Interval, IntervalPartition > interval_part_interval_iterator
#define llvm_unreachable(msg)
Interval::succ_iterator succ_begin(Interval *I)
function_interval_iterator intervals_begin(Function *F, bool DeleteInts=true)
void addNodeToInterval(Interval *Int, BasicBlock *BB)
Interval::succ_iterator succ_end(Interval *I)
LLVM Basic Block Representation.
const Interval * operator*() const
std::vector< BasicBlock * > Nodes
BasicBlock * getSourceGraphNode(Function *, BasicBlock *BB)
IntervalIterator< BasicBlock, Function > function_interval_iterator
IntervalIterator(Function *M, bool OwnMemory)
Interval * getRootInterval()
BasicBlock * getHeaderNode() const
bool operator==(const _Self &x) const
const BasicBlock & front() const
IntervalIterator(IntervalPartition &IP, bool OwnMemory)
std::vector< BasicBlock * >::iterator succ_iterator
IntervalIterator< NodeTy, OrigContainer_t > _Self
std::forward_iterator_tag iterator_category
Interval * getBlockInterval(BasicBlock *BB)