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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2966 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp
index ed468e31..841dd50 100644
--- a/lib/Analysis/DataStructure/BottomUpClosure.cpp
+++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp
@@ -89,6 +89,9 @@
   // 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 @@
           } 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 @@
             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);