diff options
Diffstat (limited to 'include/llvm/IR/Dominators.h')
-rw-r--r-- | include/llvm/IR/Dominators.h | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/include/llvm/IR/Dominators.h b/include/llvm/IR/Dominators.h index 7c733bac8da0f..cae03d33a7eed 100644 --- a/include/llvm/IR/Dominators.h +++ b/include/llvm/IR/Dominators.h @@ -16,17 +16,21 @@ #define LLVM_IR_DOMINATORS_H #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/GraphTraits.h" -#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/Hashing.h" +#include "llvm/IR/BasicBlock.h" #include "llvm/IR/CFG.h" #include "llvm/IR/PassManager.h" #include "llvm/Pass.h" #include "llvm/Support/GenericDomTree.h" +#include <utility> namespace llvm { class Function; -class BasicBlock; +class Instruction; +class Module; class raw_ostream; extern template class DomTreeNodeBase<BasicBlock>; @@ -43,24 +47,37 @@ typedef DomTreeNodeBase<BasicBlock> DomTreeNode; class BasicBlockEdge { const BasicBlock *Start; const BasicBlock *End; + public: BasicBlockEdge(const BasicBlock *Start_, const BasicBlock *End_) : - Start(Start_), End(End_) { } + Start(Start_), End(End_) {} + + BasicBlockEdge(const std::pair<BasicBlock *, BasicBlock *> &Pair) + : Start(Pair.first), End(Pair.second) {} + + BasicBlockEdge(const std::pair<const BasicBlock *, const BasicBlock *> &Pair) + : Start(Pair.first), End(Pair.second) {} + const BasicBlock *getStart() const { return Start; } + const BasicBlock *getEnd() const { return End; } + bool isSingleEdge() const; }; template <> struct DenseMapInfo<BasicBlockEdge> { - static unsigned getHashValue(const BasicBlockEdge *V); typedef DenseMapInfo<const BasicBlock *> BBInfo; + + static unsigned getHashValue(const BasicBlockEdge *V); + static inline BasicBlockEdge getEmptyKey() { return BasicBlockEdge(BBInfo::getEmptyKey(), BBInfo::getEmptyKey()); } + static inline BasicBlockEdge getTombstoneKey() { return BasicBlockEdge(BBInfo::getTombstoneKey(), BBInfo::getTombstoneKey()); } @@ -69,6 +86,7 @@ template <> struct DenseMapInfo<BasicBlockEdge> { return hash_combine(BBInfo::getHashValue(Edge.getStart()), BBInfo::getHashValue(Edge.getEnd())); } + static bool isEqual(const BasicBlockEdge &LHS, const BasicBlockEdge &RHS) { return BBInfo::isEqual(LHS.getStart(), RHS.getStart()) && BBInfo::isEqual(LHS.getEnd(), RHS.getEnd()); @@ -102,19 +120,17 @@ public: recalculate(F); } + /// Handle invalidation explicitly. + bool invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &); + /// \brief Returns *false* if the other dominator tree matches this dominator /// tree. inline bool compare(const DominatorTree &Other) const { const DomTreeNode *R = getRootNode(); const DomTreeNode *OtherR = Other.getRootNode(); - - if (!R || !OtherR || R->getBlock() != OtherR->getBlock()) - return true; - - if (Base::compare(Other)) - return true; - - return false; + return !R || !OtherR || R->getBlock() != OtherR->getBlock() || + Base::compare(Other); } // Ensure base-class overloads are visible. @@ -205,6 +221,7 @@ class DominatorTreePrinterPass public: explicit DominatorTreePrinterPass(raw_ostream &OS); + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; @@ -240,6 +257,6 @@ public: void print(raw_ostream &OS, const Module *M = nullptr) const override; }; -} // End llvm namespace +} // end namespace llvm -#endif +#endif // LLVM_IR_DOMINATORS_H |