When building local graphs, clone the initializer for constant globals into each
authorChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:31:02 +0000 (23:31 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 25 Feb 2004 23:31:02 +0000 (23:31 +0000)
local graph that uses the global.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11850 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/Local.cpp

index c6575132ab61f566829eab55b6d2b1b9d508315e..6f9bc73510f7e766f5815a31b39c9dcbc060e10d 100644 (file)
@@ -177,6 +177,18 @@ DSGraph::DSGraph(const TargetData &td, Function &F, DSGraph *GG)
     else
       ++I;
 
+  // If there are any constant globals referenced in this function, merge their
+  // initializers into the local graph from the globals graph.
+  if (ScalarMap.global_begin() != ScalarMap.global_end()) {
+    ReachabilityCloner RC(*this, *GG, 0);
+    
+    for (DSScalarMap::global_iterator I = ScalarMap.global_begin();
+         I != ScalarMap.global_end(); ++I)
+      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(*I))
+        if (GV->isConstant())
+          RC.merge(ScalarMap[GV], GG->ScalarMap[GV]);
+  }
+
   markIncompleteNodes(DSGraph::MarkFormalArgs);
 
   // Remove any nodes made dead due to merging...
@@ -894,18 +906,20 @@ bool LocalDataStructures::run(Module &M) {
 
   const TargetData &TD = getAnalysis<TargetData>();
 
+  {
+    GraphBuilder GGB(*GlobalsGraph);
+    
+    // Add initializers for all of the globals to the globals graph...
+    for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
+      if (!I->isExternal())
+        GGB.mergeInGlobalInitializer(I);
+  }
+
   // 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(TD, *I, GlobalsGraph)));
 
-  GraphBuilder GGB(*GlobalsGraph);
-
-  // Add initializers for all of the globals to the globals graph...
-  for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
-    if (!I->isExternal())
-      GGB.mergeInGlobalInitializer(I);
-
   GlobalsGraph->removeTriviallyDeadNodes();
   GlobalsGraph->markIncompleteNodes(DSGraph::MarkFormalArgs);
   return false;