Implement getEscapingAllocations & getNonEscapingAllocations
authorChris Lattner <sabre@nondot.org>
Thu, 28 Mar 2002 19:33:00 +0000 (19:33 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 28 Mar 2002 19:33:00 +0000 (19:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2021 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DataStructure.h
include/llvm/Analysis/DataStructure/DataStructure.h
lib/Analysis/DataStructure/EliminateNodes.cpp

index 6a048276f1c41230c9a4f45b0cbe25fe3a9131ff..3af030d32007eaf52e54a39262a9ee96707c5a50 100644 (file)
@@ -357,6 +357,8 @@ class FunctionDSGraph {
   PointerValSet cloneFunctionIntoSelf(const FunctionDSGraph &G, bool ValueMap);
   bool RemoveUnreachableNodes();
   bool UnlinkUndistinguishableNodes();
+  void MarkEscapeableNodesReachable(std::vector<bool> &RSN,
+                                    std::vector<bool> &RAN);
 
 private:
   // Define the interface only accessable to DataStructure
@@ -375,8 +377,8 @@ public:
   //
   void getEscapingAllocations(std::vector<AllocDSNode*> &Allocs);
 
-  // getEscapingAllocations - Add all allocations that do not escape the current
-  // function to the specified vector.
+  // getNonEscapingAllocations - Add all allocations that do not escape the
+  // current function to the specified vector.
   //
   void getNonEscapingAllocations(std::vector<AllocDSNode*> &Allocs);
 
index 6a048276f1c41230c9a4f45b0cbe25fe3a9131ff..3af030d32007eaf52e54a39262a9ee96707c5a50 100644 (file)
@@ -357,6 +357,8 @@ class FunctionDSGraph {
   PointerValSet cloneFunctionIntoSelf(const FunctionDSGraph &G, bool ValueMap);
   bool RemoveUnreachableNodes();
   bool UnlinkUndistinguishableNodes();
+  void MarkEscapeableNodesReachable(std::vector<bool> &RSN,
+                                    std::vector<bool> &RAN);
 
 private:
   // Define the interface only accessable to DataStructure
@@ -375,8 +377,8 @@ public:
   //
   void getEscapingAllocations(std::vector<AllocDSNode*> &Allocs);
 
-  // getEscapingAllocations - Add all allocations that do not escape the current
-  // function to the specified vector.
+  // getNonEscapingAllocations - Add all allocations that do not escape the
+  // current function to the specified vector.
   //
   void getNonEscapingAllocations(std::vector<AllocDSNode*> &Allocs);
 
index 471c6281df9df1bb4dffe5e7245b16988cd765f0..ab94c60d6d8d1e260fd6164e43ba7ad658e50a7c 100644 (file)
@@ -193,6 +193,34 @@ static void MarkReferredNodesReachable(DSNode *N,
                                    AllocNodes, ReachableAllocNodes);
 }
 
+void FunctionDSGraph::MarkEscapeableNodesReachable(
+                                       vector<bool> &ReachableShadowNodes,
+                                       vector<bool> &ReachableAllocNodes) {
+  // Mark all shadow nodes that have edges from other nodes as reachable.  
+  // Recursively mark any shadow nodes pointed to by the newly live shadow
+  // nodes as also alive.
+  //
+  for (unsigned i = 0, e = ArgNodes.size(); i != e; ++i)
+    MarkReferredNodesReachable(ArgNodes[i],
+                               ShadowNodes, ReachableShadowNodes,
+                               AllocNodes, ReachableAllocNodes);
+  
+  for (unsigned i = 0, e = GlobalNodes.size(); i != e; ++i)
+    MarkReferredNodesReachable(GlobalNodes[i],
+                               ShadowNodes, ReachableShadowNodes,
+                               AllocNodes, ReachableAllocNodes);
+  
+  for (unsigned i = 0, e = CallNodes.size(); i != e; ++i)
+    MarkReferredNodesReachable(CallNodes[i],
+                               ShadowNodes, ReachableShadowNodes,
+                               AllocNodes, ReachableAllocNodes);
+  
+  // Mark all nodes in the return set as being reachable...
+  MarkReferredNodeSetReachable(RetNode,
+                               ShadowNodes, ReachableShadowNodes,
+                               AllocNodes, ReachableAllocNodes);
+}
+
 bool FunctionDSGraph::RemoveUnreachableNodes() {
   bool Changed = false;
 
@@ -202,30 +230,8 @@ bool FunctionDSGraph::RemoveUnreachableNodes() {
     //
     vector<bool> ReachableShadowNodes(ShadowNodes.size());
     vector<bool> ReachableAllocNodes (AllocNodes.size());
-
-    // Mark all shadow nodes that have edges from other nodes as reachable.  
-    // Recursively mark any shadow nodes pointed to by the newly live shadow
-    // nodes as also alive.
-    //
-    for (unsigned i = 0, e = ArgNodes.size(); i != e; ++i)
-      MarkReferredNodesReachable(ArgNodes[i],
-                                 ShadowNodes, ReachableShadowNodes,
-                                 AllocNodes, ReachableAllocNodes);
-
-    for (unsigned i = 0, e = GlobalNodes.size(); i != e; ++i)
-      MarkReferredNodesReachable(GlobalNodes[i],
-                                 ShadowNodes, ReachableShadowNodes,
-                                 AllocNodes, ReachableAllocNodes);
-
-    for (unsigned i = 0, e = CallNodes.size(); i != e; ++i)
-      MarkReferredNodesReachable(CallNodes[i],
-                                 ShadowNodes, ReachableShadowNodes,
-                                 AllocNodes, ReachableAllocNodes);
-
-    // Mark all nodes in the return set as being reachable...
-    MarkReferredNodeSetReachable(RetNode,
-                                 ShadowNodes, ReachableShadowNodes,
-                                 AllocNodes, ReachableAllocNodes);
+    
+    MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes);
 
     // Mark all nodes in the value map as being reachable...
     for (std::map<Value*, PointerValSet>::iterator I = ValueMap.begin(),
@@ -280,3 +286,34 @@ bool FunctionDSGraph::RemoveUnreachableNodes() {
     Changed = true;
   }
 }
+
+
+
+
+// getEscapingAllocations - Add all allocations that escape the current
+// function to the specified vector.
+//
+void FunctionDSGraph::getEscapingAllocations(vector<AllocDSNode*> &Allocs) {
+  vector<bool> ReachableShadowNodes(ShadowNodes.size());
+  vector<bool> ReachableAllocNodes (AllocNodes.size());
+    
+  MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes);
+
+  for (unsigned i = 0, e = AllocNodes.size(); i != e; ++i)
+    if (ReachableAllocNodes[i])
+      Allocs.push_back(AllocNodes[i]);
+}
+
+// getNonEscapingAllocations - Add all allocations that do not escape the
+// current function to the specified vector.
+//
+void FunctionDSGraph::getNonEscapingAllocations(vector<AllocDSNode*> &Allocs) {
+  vector<bool> ReachableShadowNodes(ShadowNodes.size());
+  vector<bool> ReachableAllocNodes (AllocNodes.size());
+    
+  MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes);
+
+  for (unsigned i = 0, e = AllocNodes.size(); i != e; ++i)
+    if (!ReachableAllocNodes[i])
+      Allocs.push_back(AllocNodes[i]);
+}