diff options
author | Sean Fertile <sfertile@ca.ibm.com> | 2018-06-29 17:48:58 +0000 |
---|---|---|
committer | Sean Fertile <sfertile@ca.ibm.com> | 2018-06-29 17:48:58 +0000 |
commit | cd0d7634f63a2df9acd7280531e9e8acf6213483 (patch) | |
tree | a44b183e0e0b09b9f20db4b321dea725638fafa0 /llvm/lib/Analysis/CFGPrinter.cpp | |
parent | f5be3ad7f86c31a0e185250581f53f50c220a524 (diff) | |
download | bcm5719-llvm-cd0d7634f63a2df9acd7280531e9e8acf6213483.tar.gz bcm5719-llvm-cd0d7634f63a2df9acd7280531e9e8acf6213483.zip |
Revert "Extend CFGPrinter and CallPrinter with Heat Colors"
This reverts r335996 which broke graph printing in Polly.
llvm-svn: 336000
Diffstat (limited to 'llvm/lib/Analysis/CFGPrinter.cpp')
-rw-r--r-- | llvm/lib/Analysis/CFGPrinter.cpp | 250 |
1 files changed, 51 insertions, 199 deletions
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp index 10be4e4bb95..fb261755e5d 100644 --- a/llvm/lib/Analysis/CFGPrinter.cpp +++ b/llvm/lib/Analysis/CFGPrinter.cpp @@ -22,170 +22,53 @@ #include "llvm/Support/FileSystem.h" using namespace llvm; -static cl::opt<bool> CFGHeatPerFunction("cfg-heat-per-function", - cl::init(false), cl::Hidden, - cl::desc("Heat CFG per function")); - -static cl::opt<bool> ShowHeatColors("cfg-heat-colors", cl::init(true), - cl::Hidden, - cl::desc("Show heat colors in CFG")); - -static cl::opt<bool> UseRawEdgeWeight("cfg-raw-weights", cl::init(false), - cl::Hidden, - cl::desc("Use raw weights for labels. " - "Use percentages as default.")); - -static cl::opt<bool> ShowEdgeWeight("cfg-weights", cl::init(true), cl::Hidden, - cl::desc("Show edges labeled with weights")); - -static void writeHeatCFGToDotFile(Function &F, BlockFrequencyInfo *BFI, - BranchProbabilityInfo *BPI, uint64_t MaxFreq, - bool UseHeuristic, bool isSimple) { - std::string Filename = ("cfg." + F.getName() + ".dot").str(); - errs() << "Writing '" << Filename << "'..."; - - std::error_code EC; - raw_fd_ostream File(Filename, EC, sys::fs::F_Text); - - CFGDOTInfo CFGInfo(&F, BFI, BPI, MaxFreq); - CFGInfo.setHeuristic(UseHeuristic); - CFGInfo.setHeatColors(ShowHeatColors); - CFGInfo.setEdgeWeights(ShowEdgeWeight); - CFGInfo.setRawEdgeWeights(UseRawEdgeWeight); - - if (!EC) - WriteGraph(File, &CFGInfo, isSimple); - else - errs() << " error opening file for writing!"; - errs() << "\n"; -} - -static void writeAllCFGsToDotFile(Module &M, - function_ref<BlockFrequencyInfo *(Function &)> LookupBFI, - function_ref<BranchProbabilityInfo *(Function &)> LookupBPI, - bool isSimple) { - bool UseHeuristic = true; - uint64_t MaxFreq = 0; - if (!CFGHeatPerFunction) - MaxFreq = getMaxFreq(M, LookupBFI, UseHeuristic); - - for (auto &F : M) { - if (F.isDeclaration()) continue; - auto *BFI = LookupBFI(F); - auto *BPI = LookupBPI(F); - if (CFGHeatPerFunction) - MaxFreq = getMaxFreq(F, BFI, UseHeuristic); - writeHeatCFGToDotFile(F, BFI, BPI, MaxFreq, UseHeuristic, isSimple); - } - -} - -static void viewHeatCFG(Function &F, BlockFrequencyInfo *BFI, - BranchProbabilityInfo *BPI, uint64_t MaxFreq, - bool UseHeuristic, bool isSimple) { - CFGDOTInfo CFGInfo(&F, BFI, BPI, MaxFreq); - CFGInfo.setHeuristic(UseHeuristic); - CFGInfo.setHeatColors(ShowHeatColors); - CFGInfo.setEdgeWeights(ShowEdgeWeight); - CFGInfo.setRawEdgeWeights(UseRawEdgeWeight); - - ViewGraph(&CFGInfo, "cfg." + F.getName(), isSimple); -} - -static void viewAllCFGs(Module &M, - function_ref<BlockFrequencyInfo *(Function &)> LookupBFI, - function_ref<BranchProbabilityInfo *(Function &)> LookupBPI, - bool isSimple) { - bool UseHeuristic = true; - uint64_t MaxFreq = 0; - if (!CFGHeatPerFunction) - MaxFreq = getMaxFreq(M, LookupBFI, UseHeuristic); - - for (auto &F : M) { - if (F.isDeclaration()) continue; - auto *BFI = LookupBFI(F); - auto *BPI = LookupBPI(F); - if (CFGHeatPerFunction) - MaxFreq = getMaxFreq(F, BFI, UseHeuristic); - viewHeatCFG(F, BFI, BPI, MaxFreq, UseHeuristic, isSimple); - } - -} - namespace { - struct CFGViewerLegacyPass : public ModulePass { + struct CFGViewerLegacyPass : public FunctionPass { static char ID; // Pass identifcation, replacement for typeid - CFGViewerLegacyPass() : ModulePass(ID) { + CFGViewerLegacyPass() : FunctionPass(ID) { initializeCFGViewerLegacyPassPass(*PassRegistry::getPassRegistry()); } - bool runOnModule(Module &M) override { - auto LookupBFI = [this](Function &F) { - return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); - }; - auto LookupBPI = [this](Function &F) { - return &this->getAnalysis<BranchProbabilityInfoWrapperPass>(F).getBPI(); - }; - viewAllCFGs(M, LookupBFI, LookupBPI, /*isSimple=*/false); + bool runOnFunction(Function &F) override { + F.viewCFG(); return false; } - void print(raw_ostream &OS, const Module * = nullptr) const override {} + void print(raw_ostream &OS, const Module* = nullptr) const override {} void getAnalysisUsage(AnalysisUsage &AU) const override { - ModulePass::getAnalysisUsage(AU); - AU.addRequired<BlockFrequencyInfoWrapperPass>(); - AU.addRequired<BranchProbabilityInfoWrapperPass>(); AU.setPreservesAll(); } - }; } char CFGViewerLegacyPass::ID = 0; INITIALIZE_PASS(CFGViewerLegacyPass, "view-cfg", "View CFG of function", false, true) -PreservedAnalyses CFGViewerPass::run(Module &M, - ModuleAnalysisManager &AM) { - auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); - auto LookupBFI = [&FAM](Function &F) { - return &FAM.getResult<BlockFrequencyAnalysis>(F); - }; - auto LookupBPI = [&FAM](Function &F) { - return &FAM.getResult<BranchProbabilityAnalysis>(F); - }; - viewAllCFGs(M, LookupBFI, LookupBPI, /*isSimple=*/false); +PreservedAnalyses CFGViewerPass::run(Function &F, + FunctionAnalysisManager &AM) { + F.viewCFG(); return PreservedAnalyses::all(); } namespace { - struct CFGOnlyViewerLegacyPass : public ModulePass { + struct CFGOnlyViewerLegacyPass : public FunctionPass { static char ID; // Pass identifcation, replacement for typeid - CFGOnlyViewerLegacyPass() : ModulePass(ID) { + CFGOnlyViewerLegacyPass() : FunctionPass(ID) { initializeCFGOnlyViewerLegacyPassPass(*PassRegistry::getPassRegistry()); } - bool runOnModule(Module &M) override { - auto LookupBFI = [this](Function &F) { - return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); - }; - auto LookupBPI = [this](Function &F) { - return &this->getAnalysis<BranchProbabilityInfoWrapperPass>(F).getBPI(); - }; - viewAllCFGs(M, LookupBFI, LookupBPI, /*isSimple=*/true); + bool runOnFunction(Function &F) override { + F.viewCFGOnly(); return false; } - void print(raw_ostream &OS, const Module * = nullptr) const override {} + void print(raw_ostream &OS, const Module* = nullptr) const override {} void getAnalysisUsage(AnalysisUsage &AU) const override { - ModulePass::getAnalysisUsage(AU); - AU.addRequired<BlockFrequencyInfoWrapperPass>(); - AU.addRequired<BranchProbabilityInfoWrapperPass>(); AU.setPreservesAll(); } - }; } @@ -193,46 +76,43 @@ char CFGOnlyViewerLegacyPass::ID = 0; INITIALIZE_PASS(CFGOnlyViewerLegacyPass, "view-cfg-only", "View CFG of function (with no function bodies)", false, true) -PreservedAnalyses CFGOnlyViewerPass::run(Module &M, - ModuleAnalysisManager &AM) { - auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); - auto LookupBFI = [&FAM](Function &F) { - return &FAM.getResult<BlockFrequencyAnalysis>(F); - }; - auto LookupBPI = [&FAM](Function &F) { - return &FAM.getResult<BranchProbabilityAnalysis>(F); - }; - viewAllCFGs(M, LookupBFI, LookupBPI, /*isSimple=*/true); +PreservedAnalyses CFGOnlyViewerPass::run(Function &F, + FunctionAnalysisManager &AM) { + F.viewCFGOnly(); return PreservedAnalyses::all(); } +static void writeCFGToDotFile(Function &F, bool CFGOnly = false) { + std::string Filename = ("cfg." + F.getName() + ".dot").str(); + errs() << "Writing '" << Filename << "'..."; + + std::error_code EC; + raw_fd_ostream File(Filename, EC, sys::fs::F_Text); + + if (!EC) + WriteGraph(File, (const Function*)&F, CFGOnly); + else + errs() << " error opening file for writing!"; + errs() << "\n"; +} + namespace { - struct CFGPrinterLegacyPass : public ModulePass { + struct CFGPrinterLegacyPass : public FunctionPass { static char ID; // Pass identification, replacement for typeid - CFGPrinterLegacyPass() : ModulePass(ID) { + CFGPrinterLegacyPass() : FunctionPass(ID) { initializeCFGPrinterLegacyPassPass(*PassRegistry::getPassRegistry()); } - bool runOnModule(Module &M) override { - auto LookupBFI = [this](Function &F) { - return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); - }; - auto LookupBPI = [this](Function &F) { - return &this->getAnalysis<BranchProbabilityInfoWrapperPass>(F).getBPI(); - }; - writeAllCFGsToDotFile(M, LookupBFI, LookupBPI, /*isSimple=*/false); + bool runOnFunction(Function &F) override { + writeCFGToDotFile(F); return false; } - void print(raw_ostream &OS, const Module * = nullptr) const override {} + void print(raw_ostream &OS, const Module* = nullptr) const override {} void getAnalysisUsage(AnalysisUsage &AU) const override { - ModulePass::getAnalysisUsage(AU); - AU.addRequired<BlockFrequencyInfoWrapperPass>(); - AU.addRequired<BranchProbabilityInfoWrapperPass>(); AU.setPreservesAll(); } - }; } @@ -240,46 +120,28 @@ char CFGPrinterLegacyPass::ID = 0; INITIALIZE_PASS(CFGPrinterLegacyPass, "dot-cfg", "Print CFG of function to 'dot' file", false, true) -PreservedAnalyses CFGPrinterPass::run(Module &M, - ModuleAnalysisManager &AM) { - auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); - auto LookupBFI = [&FAM](Function &F) { - return &FAM.getResult<BlockFrequencyAnalysis>(F); - }; - auto LookupBPI = [&FAM](Function &F) { - return &FAM.getResult<BranchProbabilityAnalysis>(F); - }; - writeAllCFGsToDotFile(M, LookupBFI, LookupBPI, /*isSimple=*/false); +PreservedAnalyses CFGPrinterPass::run(Function &F, + FunctionAnalysisManager &AM) { + writeCFGToDotFile(F); return PreservedAnalyses::all(); } namespace { - struct CFGOnlyPrinterLegacyPass : public ModulePass { + struct CFGOnlyPrinterLegacyPass : public FunctionPass { static char ID; // Pass identification, replacement for typeid - CFGOnlyPrinterLegacyPass() : ModulePass(ID) { + CFGOnlyPrinterLegacyPass() : FunctionPass(ID) { initializeCFGOnlyPrinterLegacyPassPass(*PassRegistry::getPassRegistry()); } - bool runOnModule(Module &M) override { - auto LookupBFI = [this](Function &F) { - return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); - }; - auto LookupBPI = [this](Function &F) { - return &this->getAnalysis<BranchProbabilityInfoWrapperPass>(F).getBPI(); - }; - writeAllCFGsToDotFile(M, LookupBFI, LookupBPI, /*isSimple=*/true); + bool runOnFunction(Function &F) override { + writeCFGToDotFile(F, /*CFGOnly=*/true); return false; } - - void print(raw_ostream &OS, const Module * = nullptr) const override {} + void print(raw_ostream &OS, const Module* = nullptr) const override {} void getAnalysisUsage(AnalysisUsage &AU) const override { - ModulePass::getAnalysisUsage(AU); - AU.addRequired<BlockFrequencyInfoWrapperPass>(); - AU.addRequired<BranchProbabilityInfoWrapperPass>(); AU.setPreservesAll(); } - }; } @@ -288,16 +150,9 @@ INITIALIZE_PASS(CFGOnlyPrinterLegacyPass, "dot-cfg-only", "Print CFG of function to 'dot' file (with no function bodies)", false, true) -PreservedAnalyses CFGOnlyPrinterPass::run(Module &M, - ModuleAnalysisManager &AM) { - auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); - auto LookupBFI = [&FAM](Function &F) { - return &FAM.getResult<BlockFrequencyAnalysis>(F); - }; - auto LookupBPI = [&FAM](Function &F) { - return &FAM.getResult<BranchProbabilityAnalysis>(F); - }; - writeAllCFGsToDotFile(M, LookupBFI, LookupBPI, /*isSimple=*/true); +PreservedAnalyses CFGOnlyPrinterPass::run(Function &F, + FunctionAnalysisManager &AM) { + writeCFGToDotFile(F, /*CFGOnly=*/true); return PreservedAnalyses::all(); } @@ -307,9 +162,7 @@ PreservedAnalyses CFGOnlyPrinterPass::run(Module &M, /// being a 'dot' and 'gv' program in your path. /// void Function::viewCFG() const { - - CFGDOTInfo CFGInfo(this); - ViewGraph(&CFGInfo, "cfg" + getName()); + ViewGraph(this, "cfg" + getName()); } /// viewCFGOnly - This function is meant for use from the debugger. It works @@ -318,15 +171,14 @@ void Function::viewCFG() const { /// this can make the graph smaller. /// void Function::viewCFGOnly() const { - - CFGDOTInfo CFGInfo(this); - ViewGraph(&CFGInfo, "cfg" + getName(), true); + ViewGraph(this, "cfg" + getName(), true); } -ModulePass *llvm::createCFGPrinterLegacyPassPass() { +FunctionPass *llvm::createCFGPrinterLegacyPassPass () { return new CFGPrinterLegacyPass(); } -ModulePass *llvm::createCFGOnlyPrinterLegacyPassPass() { +FunctionPass *llvm::createCFGOnlyPrinterLegacyPassPass () { return new CFGOnlyPrinterLegacyPass(); } + |