From aa0b468f6d0e4d30d4f31d528d499e4c9a67c4f2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 9 Nov 2002 21:12:07 +0000 Subject: [PATCH] Add globals graphs to all three passes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4663 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/DataStructure.h | 10 ++++- .../Analysis/DataStructure/DataStructure.h | 10 ++++- .../DataStructure/BottomUpClosure.cpp | 26 +++++++----- lib/Analysis/DataStructure/Local.cpp | 20 +++++----- lib/Analysis/DataStructure/Printer.cpp | 10 +++++ lib/Analysis/DataStructure/TopDownClosure.cpp | 40 +++++++++++-------- 6 files changed, 76 insertions(+), 40 deletions(-) diff --git a/include/llvm/Analysis/DataStructure.h b/include/llvm/Analysis/DataStructure.h index 71bf5128eca..ea1c2ae1922 100644 --- a/include/llvm/Analysis/DataStructure.h +++ b/include/llvm/Analysis/DataStructure.h @@ -46,6 +46,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; @@ -66,6 +68,7 @@ public: class BUDataStructures : public Pass { // DSInfo, one graph for each function std::map DSInfo; + DSGraph *GlobalsGraph; public: ~BUDataStructures() { releaseMemory(); } @@ -78,7 +81,9 @@ public: return *I->second; } - // print - Print out the analysis results... + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; // If the pass pipeline is done with this pass, we can release our memory... @@ -101,6 +106,7 @@ class TDDataStructures : public Pass { // DSInfo, one graph for each function std::map DSInfo; std::set GraphDone; + DSGraph *GlobalsGraph; public: ~TDDataStructures() { releaseMemory(); } @@ -113,6 +119,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; diff --git a/include/llvm/Analysis/DataStructure/DataStructure.h b/include/llvm/Analysis/DataStructure/DataStructure.h index 71bf5128eca..ea1c2ae1922 100644 --- a/include/llvm/Analysis/DataStructure/DataStructure.h +++ b/include/llvm/Analysis/DataStructure/DataStructure.h @@ -46,6 +46,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; @@ -66,6 +68,7 @@ public: class BUDataStructures : public Pass { // DSInfo, one graph for each function std::map DSInfo; + DSGraph *GlobalsGraph; public: ~BUDataStructures() { releaseMemory(); } @@ -78,7 +81,9 @@ public: return *I->second; } - // print - Print out the analysis results... + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; // If the pass pipeline is done with this pass, we can release our memory... @@ -101,6 +106,7 @@ class TDDataStructures : public Pass { // DSInfo, one graph for each function std::map DSInfo; std::set GraphDone; + DSGraph *GlobalsGraph; public: ~TDDataStructures() { releaseMemory(); } @@ -113,6 +119,8 @@ public: return *I->second; } + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } + // print - Print out the analysis results... void print(std::ostream &O, const Module *M) const; diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp index d57b6186f86..ade6ca68a5c 100644 --- a/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -18,6 +18,18 @@ X("budatastructure", "Bottom-up Data Structure Analysis Closure"); using namespace DS; +// run - Calculate the bottom up data structure graphs for each function in the +// program. +// +bool BUDataStructures::run(Module &M) { + GlobalsGraph = new DSGraph(); + + // Simply calculate the graphs for each function... + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (!I->isExternal()) + calculateGraph(*I); + return false; +} // releaseMemory - If the pass pipeline is done with this pass, we can release // our memory... here... @@ -30,17 +42,8 @@ void BUDataStructures::releaseMemory() { // Empty map so next time memory is released, data structures are not // re-deleted. DSInfo.clear(); -} - -// run - Calculate the bottom up data structure graphs for each function in the -// program. -// -bool BUDataStructures::run(Module &M) { - // Simply calculate the graphs for each function... - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isExternal()) - calculateGraph(*I); - return false; + delete GlobalsGraph; + GlobalsGraph = 0; } DSGraph &BUDataStructures::calculateGraph(Function &F) { @@ -52,6 +55,7 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { // Copy the local version into DSInfo... Graph = new DSGraph(getAnalysis().getDSGraph(F)); + Graph->setGlobalsGraph(GlobalsGraph); #if 0 // Populate the GlobalsGraph with globals from this one. diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index e159a6087e8..311810644a4 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -409,6 +409,16 @@ void GraphBuilder::visitCastInst(CastInst &CI) { // LocalDataStructures Implementation //===----------------------------------------------------------------------===// +bool LocalDataStructures::run(Module &M) { + GlobalsGraph = new DSGraph(); + + // Calculate all of the graphs... + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (!I->isExternal()) + DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph))); + return false; +} + // releaseMemory - If the pass pipeline is done with this pass, we can release // our memory... here... // @@ -423,13 +433,3 @@ void LocalDataStructures::releaseMemory() { delete GlobalsGraph; GlobalsGraph = 0; } - -bool LocalDataStructures::run(Module &M) { - GlobalsGraph = new DSGraph(); - - // Calculate all of the graphs... - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isExternal()) - DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph))); - return false; -} diff --git a/lib/Analysis/DataStructure/Printer.cpp b/lib/Analysis/DataStructure/Printer.cpp index 962a0935e09..bbd9c2d18b2 100644 --- a/lib/Analysis/DataStructure/Printer.cpp +++ b/lib/Analysis/DataStructure/Printer.cpp @@ -181,6 +181,16 @@ static void printCollection(const Collection &C, std::ostream &O, } } + DSGraph &GG = C.getGlobalsGraph(); + TotalNumNodes += GG.getGraphSize(); + TotalCallNodes += GG.getFunctionCalls().size(); + if (OnlyPrintMain) { + GG.writeGraphToFile(O, Prefix+"GlobalsGraph"); + } else { + O << "Skipped Writing '" << Prefix << "GlobalsGraph.dot'... [" + << GG.getGraphSize() << "+" << GG.getFunctionCalls().size() << "]\n"; + } + O << "\nGraphs contain [" << TotalNumNodes << "+" << TotalCallNodes << "] nodes total" << std::endl; } diff --git a/lib/Analysis/DataStructure/TopDownClosure.cpp b/lib/Analysis/DataStructure/TopDownClosure.cpp index b4b43f77c59..1da43e5634f 100644 --- a/lib/Analysis/DataStructure/TopDownClosure.cpp +++ b/lib/Analysis/DataStructure/TopDownClosure.cpp @@ -16,6 +16,26 @@ static RegisterAnalysis Y("tddatastructure", "Top-down Data Structure Analysis Closure"); +// run - Calculate the top down data structure graphs for each function in the +// program. +// +bool TDDataStructures::run(Module &M) { + BUDataStructures &BU = getAnalysis(); + GlobalsGraph = new DSGraph(); + + // Calculate top-down from main... + if (Function *F = M.getMainFunction()) + calculateGraph(*F); + + // Next calculate the graphs for each function unreachable function... + for (Module::reverse_iterator I = M.rbegin(), E = M.rend(); I != E; ++I) + if (!I->isExternal()) + calculateGraph(*I); + + GraphDone.clear(); // Free temporary memory... + return false; +} + // releaseMemory - If the pass pipeline is done with this pass, we can release // our memory... here... // @@ -27,23 +47,8 @@ void TDDataStructures::releaseMemory() { // Empty map so next time memory is released, data structures are not // re-deleted. DSInfo.clear(); -} - -// run - Calculate the top down data structure graphs for each function in the -// program. -// -bool TDDataStructures::run(Module &M) { - BUDataStructures &BU = getAnalysis(); - - // Calculate top-down from main... - if (Function *F = M.getMainFunction()) - calculateGraph(*F); - - // Next calculate the graphs for each function unreachable function... - for (Module::reverse_iterator I = M.rbegin(), E = M.rend(); I != E; ++I) - if (!I->isExternal()) - calculateGraph(*I); - return false; + delete GlobalsGraph; + GlobalsGraph = 0; } /// ResolveCallSite - This method is used to link the actual arguments together @@ -77,6 +82,7 @@ DSGraph &TDDataStructures::getOrCreateDSGraph(Function &F) { if (G == 0) { // Not created yet? Clone BU graph... G = new DSGraph(getAnalysis().getDSGraph(F)); G->getAuxFunctionCalls().clear(); + G->setGlobalsGraph(GlobalsGraph); } return *G; }