Correctly handle global-argument aliases induced in main
authorChris Lattner <sabre@nondot.org>
Mon, 25 Apr 2005 19:16:31 +0000 (19:16 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 25 Apr 2005 19:16:31 +0000 (19:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21537 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/BottomUpClosure.cpp

index aa5144437d8380fc3bd25c61a96298e0773a4b73..21ca2dc0370a083b08258106c31caffe19079bf6 100644 (file)
@@ -434,14 +434,42 @@ DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) {
 
 
 void BUDataStructures::calculateGraph(DSGraph &Graph) {
+  // If this graph contains the main function, clone the globals graph into this
+  // graph before we inline callees and other fun stuff.
+  bool ContainsMain = false;
+  DSGraph::ReturnNodesTy &ReturnNodes = Graph.getReturnNodes();
+
+  for (DSGraph::ReturnNodesTy::iterator I = ReturnNodes.begin(),
+         E = ReturnNodes.end(); I != E; ++I)
+    if (I->first->hasExternalLinkage() && I->first->getName() == "main") {
+      ContainsMain = true;
+      break;
+    }
+
+  // If this graph contains main, copy the contents of the globals graph over.
+  // Note that this is *required* for correctness.  If a callee contains a use
+  // of a global, we have to make sure to link up nodes due to global-argument
+  // bindings.
+  if (ContainsMain) {
+    const DSGraph &GG = *Graph.getGlobalsGraph();
+    ReachabilityCloner RC(Graph, 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<GlobalVariable>(*I))
+        RC.getClonedNH(GG.getNodeForValue(*I));
+  }
+
+
   // Move our call site list into TempFCs so that inline call sites go into the
   // new call site list and doesn't invalidate our iterators!
   std::list<DSCallSite> TempFCs;
   std::list<DSCallSite> &AuxCallsList = Graph.getAuxFunctionCalls();
   TempFCs.swap(AuxCallsList);
 
-  DSGraph::ReturnNodesTy &ReturnNodes = Graph.getReturnNodes();
-
   bool Printed = false;
   std::vector<Function*> CalledFuncs;
   while (!TempFCs.empty()) {