diff options
Diffstat (limited to 'lib/Analysis/ProfileInfoLoaderPass.cpp')
-rw-r--r-- | lib/Analysis/ProfileInfoLoaderPass.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/Analysis/ProfileInfoLoaderPass.cpp b/lib/Analysis/ProfileInfoLoaderPass.cpp index 854cc3c6d5..be95669879 100644 --- a/lib/Analysis/ProfileInfoLoaderPass.cpp +++ b/lib/Analysis/ProfileInfoLoaderPass.cpp @@ -15,14 +15,22 @@ #include "llvm/Pass.h" #include "llvm/Analysis/ProfileInfo.h" #include "llvm/Analysis/ProfileInfoLoader.h" +#include "Support/CommandLine.h" using namespace llvm; namespace { + cl::opt<std::string> + ProfileInfoFilename("profile-info-file", cl::init("llvmprof.out"), + cl::desc("")); + class LoaderPass : public Pass, public ProfileInfo { std::string Filename; + std::map<BasicBlock*, unsigned> ExecutionCounts; public: - LoaderPass(const std::string &filename = "llvmprof.out") - : Filename(filename) {} + LoaderPass(const std::string &filename = "") + : Filename(filename) { + if (filename.empty()) Filename = ProfileInfoFilename; + } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); @@ -35,7 +43,10 @@ namespace { /// run - Load the profile information from the specified file. virtual bool run(Module &M); - unsigned getExecutionCount(BasicBlock *BB) { return 0; } + virtual unsigned getExecutionCount(BasicBlock *BB) { + std::map<BasicBlock*, unsigned>::iterator I = ExecutionCounts.find(BB); + return I != ExecutionCounts.end() ? I->second : 0; + } }; RegisterOpt<LoaderPass> @@ -53,6 +64,11 @@ Pass *llvm::createProfileLoaderPass(const std::string &Filename) { } bool LoaderPass::run(Module &M) { - + ProfileInfoLoader PIL("opt", Filename, M); + if (PIL.hasAccurateBlockCounts()) { + std::vector<std::pair<BasicBlock*, unsigned> > Counts; + PIL.getBlockCounts(Counts); + ExecutionCounts.insert(Counts.begin(), Counts.end()); + } return false; } |