* Eliminate boolean arguments in favor of using enums
authorChris Lattner <sabre@nondot.org>
Thu, 23 Jan 2003 22:05:33 +0000 (22:05 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 Jan 2003 22:05:33 +0000 (22:05 +0000)
* T-D pass now eliminates unreachable globals

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

lib/Analysis/DataStructure/BottomUpClosure.cpp
lib/Analysis/DataStructure/DataStructure.cpp
lib/Analysis/DataStructure/Local.cpp
lib/Analysis/DataStructure/Steensgaard.cpp
lib/Analysis/DataStructure/TopDownClosure.cpp

index c7fb42d860ea91cd238a1592214573e0c685ac7b..d1c96261dccac49c3d048570e902a7fde2ca3c2c 100644 (file)
@@ -364,8 +364,8 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) {
   // Recompute the Incomplete markers.  If there are any function calls left
   // now that are complete, we must loop!
   Graph.maskIncompleteMarkers();
-  Graph.markIncompleteNodes();
-  Graph.removeDeadNodes();
+  Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
+  Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
 
   DEBUG(std::cerr << "  [BU] Done inlining: " << F.getName() << " ["
         << Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
@@ -440,8 +440,8 @@ DSGraph &BUDataStructures::inlineNonSCCGraphs(Function &F,
   // Recompute the Incomplete markers.  If there are any function calls left
   // now that are complete, we must loop!
   Graph.maskIncompleteMarkers();
-  Graph.markIncompleteNodes();
-  Graph.removeDeadNodes();
+  Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
+  Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
 
   DEBUG(std::cerr << "  [BU] Done Non-SCC inlining: " << F.getName() << " ["
         << Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
@@ -535,8 +535,8 @@ DSGraph &BUDataStructures::calculateSCCGraph(Function &F,
   // Recompute the Incomplete markers.  If there are any function calls left
   // now that are complete, we must loop!
   Graph.maskIncompleteMarkers();
-  Graph.markIncompleteNodes();
-  Graph.removeDeadNodes();
+  Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
+  Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
 
   DEBUG(std::cerr << "  [BU] Done inlining: " << F.getName() << " ["
         << Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
index 0e61f03781374a2afe994bb925ae537dc5ef4a7c..f15195114a8a431b43613b219083b1ed59b616c6 100644 (file)
@@ -785,9 +785,9 @@ static void markIncomplete(DSCallSite &Call) {
 // scope of current analysis may have modified it), the 'Incomplete' flag is
 // added to the NodeType.
 //
-void DSGraph::markIncompleteNodes(bool markFormalArgs) {
+void DSGraph::markIncompleteNodes(unsigned Flags) {
   // Mark any incoming arguments as incomplete...
-  if (markFormalArgs && Func)
+  if ((Flags & DSGraph::MarkFormalArgs) && Func)
     for (Function::aiterator I = Func->abegin(), E = Func->aend(); I != E; ++I)
       if (isPointerType(I->getType()) && ScalarMap.find(I) != ScalarMap.end())
         markIncompleteNode(ScalarMap[I].getNode());
@@ -1010,7 +1010,7 @@ static void markAlive(DSCallSite &CS, std::set<DSNode*> &Alive) {
 // from the caller's graph entirely.  This is only appropriate to use when
 // inlining graphs.
 //
-void DSGraph::removeDeadNodes() {
+void DSGraph::removeDeadNodes(unsigned Flags) {
   // Reduce the amount of work we have to do...
   removeTriviallyDeadNodes();
 
@@ -1023,10 +1023,11 @@ void DSGraph::removeDeadNodes() {
   // Mark all nodes reachable by (non-global) scalar nodes as alive...
   for (std::map<Value*, DSNodeHandle>::iterator I = ScalarMap.begin(),
          E = ScalarMap.end(); I != E; ++I)
-    // if (!isa<GlobalValue>(I->first))              // Don't mark globals!
+    if (!(Flags & DSGraph::RemoveUnreachableGlobals) ||
+        !isa<GlobalValue>(I->first))              // Don't mark globals!
       markAlive(I->second.getNode(), Alive);
-    // else                    // Keep track of global nodes
-    //   GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
+    else                    // Keep track of global nodes
+      GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
 
   // The return value is alive as well...
   markAlive(RetNode.getNode(), Alive);
index f40080a913913fa3c42cf7f982237b3d52996dea..93c534abcf8edbf74898748c8c7c9e4fc18f483b 100644 (file)
@@ -136,10 +136,10 @@ DSGraph::DSGraph(Function &F, DSGraph *GG) : Func(&F), GlobalsGraph(GG) {
 #ifndef NDEBUG
   Timer::addPeakMemoryMeasurement();
 #endif
-  markIncompleteNodes();
+  markIncompleteNodes(DSGraph::MarkFormalArgs);
 
   // Remove any nodes made dead due to merging...
-  removeDeadNodes();
+  removeDeadNodes(DSGraph::KeepUnreachableGlobals);
 }
 
 
index 0994a22426049fdc316d659ebbd6a85c80884885..b6497c507225a8af0c4e87861939da99ce230ee4 100644 (file)
@@ -196,10 +196,10 @@ bool Steens::run(Module &M) {
   // Update the "incomplete" markers on the nodes, ignoring unknownness due to
   // incoming arguments...
   ResultGraph->maskIncompleteMarkers();
-  ResultGraph->markIncompleteNodes(false);
+  ResultGraph->markIncompleteNodes(DSGraph::IgnoreFormalArgs);
 
   // Remove any nodes that are dead after all of the merging we have done...
-  ResultGraph->removeDeadNodes();
+  ResultGraph->removeDeadNodes(DSGraph::KeepUnreachableGlobals);
 
   DEBUG(print(std::cerr, &M));
   return false;
index da9bc7c1348dff4a8cb22df3335e770baab57ee1..b867f7edff88051ebabc62df99f9dda612aeba01 100644 (file)
@@ -186,9 +186,10 @@ void TDDataStructures::calculateGraph(Function &F) {
 
       // Recompute the Incomplete markers and eliminate unreachable nodes.
       CG.maskIncompleteMarkers();
-      CG.markIncompleteNodes(/*markFormals*/ !F.hasInternalLinkage()
+      CG.markIncompleteNodes(F.hasInternalLinkage() ? DSGraph::IgnoreFormalArgs:
+                             DSGraph::MarkFormalArgs
                              /*&& FIXME: NEED TO CHECK IF ALL CALLERS FOUND!*/);
-      CG.removeDeadNodes();
+      CG.removeDeadNodes(DSGraph::RemoveUnreachableGlobals);
     }
 
   DEBUG(std::cerr << "  [TD] Done inlining into callees for: " << F.getName()