#include "llvm/Pass.h"
#include <set>
+
class Instruction;
template <typename GraphType> struct GraphTraits;
// DominatorTree GraphTraits specialization so the DominatorTree can be
// iterable by generic graph iterators.
-template <> struct GraphTraits<DominatorTree*> {
+template <> struct GraphTraits<DominatorTree::Node*> {
typedef DominatorTree::Node NodeType;
typedef NodeType::iterator ChildIteratorType;
- static NodeType *getEntryNode(DominatorTree *DT) {
- return DT->getNode(DT->getRoot());
+ static NodeType *getEntryNode(NodeType *N) {
+ return N;
}
static inline ChildIteratorType child_begin(NodeType* N) {
return N->begin();
}
};
+template <> struct GraphTraits<DominatorTree*>
+ : public GraphTraits<DominatorTree::Node*> {
+ static NodeType *getEntryNode(DominatorTree *DT) {
+ return DT->getNode(DT->getRoot());
+ }
+};
+
//===----------------------------------------------------------------------===//
//
// DominanceFrontier - Calculate the dominance frontiers for a function.
virtual void releaseMemory() { Frontiers.clear(); }
// Accessor interface:
+ typedef DomSetMapType::iterator iterator;
typedef DomSetMapType::const_iterator const_iterator;
+ iterator begin() { return Frontiers.begin(); }
const_iterator begin() const { return Frontiers.begin(); }
+ iterator end() { return Frontiers.end(); }
const_iterator end() const { return Frontiers.end(); }
- const_iterator find(BasicBlock* B) const { return Frontiers.find(B); }
+ iterator find(BasicBlock *B) { return Frontiers.find(B); }
+ const_iterator find(BasicBlock *B) const { return Frontiers.find(B); }
void addBasicBlock(BasicBlock *BB, const DomSetType &frontier) {
assert(find(BB) == end() && "Block already in DominanceFrontier!");
Frontiers.insert(std::make_pair(BB, frontier));
}
- void addToFrontier(BasicBlock *BB, BasicBlock *Node) {
- DomSetMapType::iterator I = Frontiers.find(BB);
+ void addToFrontier(iterator I, BasicBlock *Node) {
assert(I != end() && "BB is not in DominanceFrontier!");
I->second.insert(Node);
}
- void removeFromFrontier(BasicBlock *BB, BasicBlock *Node) {
- DomSetMapType::iterator I = Frontiers.find(BB);
+ void removeFromFrontier(iterator I, BasicBlock *Node) {
assert(I != end() && "BB is not in DominanceFrontier!");
assert(I->second.count(Node) && "Node is not in DominanceFrontier of BB");
I->second.erase(Node);