diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-07-18 16:13:52 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-07-18 16:13:52 +0000 |
commit | 94c8e5da4194fa483b0fb25705144cc61f6a90e4 (patch) | |
tree | d9d8b77026135baeb0a3d931435e7ded0895fc5f /llvm/lib/Analysis | |
parent | 4eac78e6607fc90c9afacb4fa750ee361bdc81ce (diff) | |
download | bcm5719-llvm-94c8e5da4194fa483b0fb25705144cc61f6a90e4.tar.gz bcm5719-llvm-94c8e5da4194fa483b0fb25705144cc61f6a90e4.zip |
Add support for a top-down propagation pass:
-- Save a copy of the original call nodes in DSGraph before inlining bottom-up.
-- Also, save a list of the callers of each function in DSGraph.
llvm-svn: 2966
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp index ed468e31430..841dd50f43d 100644 --- a/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -89,6 +89,9 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { // Copy the local version into DSInfo... Graph = new DSGraph(getAnalysis<LocalDataStructures>().getDSGraph(F)); + // Save a copy of the original call nodes for the top-down pass + Graph->saveOrigFunctionCalls(); + // Start resolving calls... std::vector<std::vector<DSNodeHandle> > &FCs = Graph->getFunctionCalls(); @@ -129,7 +132,7 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { } else if (!FI.isExternal()) { DEBUG(std::cerr << "In " << F.getName() << " inlining: " << FI.getName() << "\n"); - + // Get the data structure graph for the called function, closing it // if possible (which is only impossible in the case of mutual // recursion... @@ -139,15 +142,19 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) { DEBUG(cerr << "Got graph for " << FI.getName() << " in: " << F.getName() << "\n"); + // Remember the callers for each callee for use in the top-down + // pass so we don't have to compute this again + GI.addCaller(F); - - // Clone the called function's graph into the current graph, keeping - // track of where scalars in the old graph _used_ to point... - map<Value*, DSNodeHandle> OldValMap; + // Clone the callee's graph into the current graph, keeping + // track of where scalars in the old graph _used_ to point + // and of the new nodes matching nodes of the old graph ... + std::map<Value*, DSNodeHandle> OldValMap; + std::map<const DSNode*, DSNode*> OldNodeMap; // unused // The clone call may invalidate any of the vectors in the data // structure graph. - DSNode *RetVal = Graph->cloneInto(GI, OldValMap); + DSNode *RetVal = Graph->cloneInto(GI, OldValMap, OldNodeMap); ResolveArguments(Call, FI, OldValMap); |