From: Cong Hou Date: Thu, 16 Jul 2015 23:23:35 +0000 (+0000) Subject: Add new constructors for LoopInfo/DominatorTree/BFI/BPI X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1dd3d83c5e56370acb4736182382db4deb70738e;hp=650d9427f075becaa35a675af8169f60eeb8e756;p=oota-llvm.git Add new constructors for LoopInfo/DominatorTree/BFI/BPI Those new constructors make it more natural to construct an object for a function. For example, previously to build a LoopInfo for a function, we need four statements: DominatorTree DT; LoopInfo LI; DT.recalculate(F); LI.analyze(DT); Now we only need one statement: LoopInfo LI(DominatorTree(F)); http://reviews.llvm.org/D11274 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242486 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/BlockFrequencyInfo.h b/include/llvm/Analysis/BlockFrequencyInfo.h index 3dc34c54373..2b6b16a3fb9 100644 --- a/include/llvm/Analysis/BlockFrequencyInfo.h +++ b/include/llvm/Analysis/BlockFrequencyInfo.h @@ -31,6 +31,10 @@ class BlockFrequencyInfo { std::unique_ptr BFI; public: + BlockFrequencyInfo(); + BlockFrequencyInfo(const Function &F, const BranchProbabilityInfo &BPI, + const LoopInfo &LI); + const Function *getFunction() const; void view() const; diff --git a/include/llvm/Analysis/BranchProbabilityInfo.h b/include/llvm/Analysis/BranchProbabilityInfo.h index 91ce72e8eed..a6e721a388e 100644 --- a/include/llvm/Analysis/BranchProbabilityInfo.h +++ b/include/llvm/Analysis/BranchProbabilityInfo.h @@ -39,6 +39,9 @@ class raw_ostream; /// value 10. class BranchProbabilityInfo { public: + BranchProbabilityInfo() {} + BranchProbabilityInfo(Function &F, const LoopInfo &LI) { calculate(F, LI); } + void releaseMemory(); void print(raw_ostream &OS) const; diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h index 292a8b2b6d2..841c002a5c6 100644 --- a/include/llvm/Analysis/LoopInfo.h +++ b/include/llvm/Analysis/LoopInfo.h @@ -642,6 +642,7 @@ class LoopInfo : public LoopInfoBase { LoopInfo(const LoopInfo &) = delete; public: LoopInfo() {} + explicit LoopInfo(const DominatorTreeBase &DomTree); LoopInfo(LoopInfo &&Arg) : BaseT(std::move(static_cast(Arg))) {} LoopInfo &operator=(LoopInfo &&RHS) { diff --git a/include/llvm/IR/Dominators.h b/include/llvm/IR/Dominators.h index 8080ae7c122..52c2a8e2fc4 100644 --- a/include/llvm/IR/Dominators.h +++ b/include/llvm/IR/Dominators.h @@ -69,6 +69,9 @@ public: typedef DominatorTreeBase Base; DominatorTree() : DominatorTreeBase(false) {} + explicit DominatorTree(Function &F) : DominatorTreeBase(false) { + recalculate(F); + } DominatorTree(DominatorTree &&Arg) : Base(std::move(static_cast(Arg))) {} diff --git a/lib/Analysis/BlockFrequencyInfo.cpp b/lib/Analysis/BlockFrequencyInfo.cpp index 46095ffd1d0..edd5ad9d5b7 100644 --- a/lib/Analysis/BlockFrequencyInfo.cpp +++ b/lib/Analysis/BlockFrequencyInfo.cpp @@ -105,6 +105,14 @@ struct DOTGraphTraits : public DefaultDOTGraphTraits { } // end namespace llvm #endif +BlockFrequencyInfo::BlockFrequencyInfo() {} + +BlockFrequencyInfo::BlockFrequencyInfo(const Function &F, + const BranchProbabilityInfo &BPI, + const LoopInfo &LI) { + calculate(F, BPI, LI); +} + void BlockFrequencyInfo::calculate(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI) { diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index 7ca811067d4..bd0686075a9 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -602,6 +602,10 @@ Loop *UnloopUpdater::getNearestLoop(BasicBlock *BB, Loop *BBLoop) { return NearLoop; } +LoopInfo::LoopInfo(const DominatorTreeBase &DomTree) { + analyze(DomTree); +} + /// updateUnloop - The last backedge has been removed from a loop--now the /// "unloop". Find a new parent for the blocks contained within unloop and /// update the loop tree. We don't necessarily have valid dominators at this