From 2eff970892e495019a0996c0aa8784450697cd2a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 13 Mar 2005 20:15:06 +0000 Subject: After finishing BU analysis, move all global variables from the globals graph into main and mark them complete. llvm-svn: 20583 --- .../Analysis/DataStructure/CompleteBottomUp.cpp | 29 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp') diff --git a/llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp b/llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp index 1c9e3299d02..77a5f32fa59 100644 --- a/llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp +++ b/llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp @@ -76,9 +76,10 @@ bool CompleteBUDataStructures::runOnModule(Module &M) { hash_map ValMap; unsigned NextID = 1; - if (Function *Main = M.getMainFunction()) { - if (!Main->isExternal()) - calculateSCCGraphs(getOrCreateGraph(*Main), Stack, NextID, ValMap); + Function *MainFunc = M.getMainFunction(); + if (MainFunc) { + if (!MainFunc->isExternal()) + calculateSCCGraphs(getOrCreateGraph(*MainFunc), Stack, NextID, ValMap); } else { std::cerr << "CBU-DSA: No 'main' function found!\n"; } @@ -88,6 +89,28 @@ bool CompleteBUDataStructures::runOnModule(Module &M) { calculateSCCGraphs(getOrCreateGraph(*I), Stack, NextID, ValMap); GlobalsGraph->removeTriviallyDeadNodes(); + + + // Merge the globals variables (not the calls) from the globals graph back + // into the main function's graph so that the main function contains all of + // the information about global pools and GV usage in the program. + if (MainFunc) { + DSGraph &MainGraph = getOrCreateGraph(*MainFunc); + const DSGraph &GG = *MainGraph.getGlobalsGraph(); + ReachabilityCloner RC(MainGraph, GG, + DSGraph::DontCloneCallNodes | + DSGraph::DontCloneAuxCallNodes); + + // Clone the global nodes into this graph. + for (DSScalarMap::global_iterator I = GG.getScalarMap().global_begin(), + E = GG.getScalarMap().global_end(); I != E; ++I) + if (isa(*I)) + RC.getClonedNH(GG.getNodeForValue(*I)); + + MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | + DSGraph::IgnoreGlobals); + } + return false; } -- cgit v1.2.3