aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Analysis/DataStructure.h6
-rw-r--r--include/llvm/Analysis/DataStructure/DataStructure.h6
-rw-r--r--lib/Analysis/DataStructure/EliminateNodes.cpp85
3 files changed, 69 insertions, 28 deletions
diff --git a/include/llvm/Analysis/DataStructure.h b/include/llvm/Analysis/DataStructure.h
index 6a048276f1..3af030d320 100644
--- a/include/llvm/Analysis/DataStructure.h
+++ b/include/llvm/Analysis/DataStructure.h
@@ -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);
diff --git a/include/llvm/Analysis/DataStructure/DataStructure.h b/include/llvm/Analysis/DataStructure/DataStructure.h
index 6a048276f1..3af030d320 100644
--- a/include/llvm/Analysis/DataStructure/DataStructure.h
+++ b/include/llvm/Analysis/DataStructure/DataStructure.h
@@ -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);
diff --git a/lib/Analysis/DataStructure/EliminateNodes.cpp b/lib/Analysis/DataStructure/EliminateNodes.cpp
index 471c6281df..ab94c60d6d 100644
--- a/lib/Analysis/DataStructure/EliminateNodes.cpp
+++ b/lib/Analysis/DataStructure/EliminateNodes.cpp
@@ -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]);
+}