Implement getEscapingAllocations & getNonEscapingAllocations

llvm-svn: 2021
This commit is contained in:
Chris Lattner 2002-03-28 19:33:00 +00:00
parent c3ae15cf0b
commit 8d4894e3fa
2 changed files with 65 additions and 26 deletions

View File

@ -357,6 +357,8 @@ class FunctionDSGraph {
PointerValSet cloneFunctionIntoSelf(const FunctionDSGraph &G, bool ValueMap); PointerValSet cloneFunctionIntoSelf(const FunctionDSGraph &G, bool ValueMap);
bool RemoveUnreachableNodes(); bool RemoveUnreachableNodes();
bool UnlinkUndistinguishableNodes(); bool UnlinkUndistinguishableNodes();
void MarkEscapeableNodesReachable(std::vector<bool> &RSN,
std::vector<bool> &RAN);
private: private:
// Define the interface only accessable to DataStructure // Define the interface only accessable to DataStructure
@ -375,8 +377,8 @@ public:
// //
void getEscapingAllocations(std::vector<AllocDSNode*> &Allocs); void getEscapingAllocations(std::vector<AllocDSNode*> &Allocs);
// getEscapingAllocations - Add all allocations that do not escape the current // getNonEscapingAllocations - Add all allocations that do not escape the
// function to the specified vector. // current function to the specified vector.
// //
void getNonEscapingAllocations(std::vector<AllocDSNode*> &Allocs); void getNonEscapingAllocations(std::vector<AllocDSNode*> &Allocs);

View File

@ -193,6 +193,34 @@ static void MarkReferredNodesReachable(DSNode *N,
AllocNodes, ReachableAllocNodes); 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 FunctionDSGraph::RemoveUnreachableNodes() {
bool Changed = false; bool Changed = false;
@ -202,30 +230,8 @@ bool FunctionDSGraph::RemoveUnreachableNodes() {
// //
vector<bool> ReachableShadowNodes(ShadowNodes.size()); vector<bool> ReachableShadowNodes(ShadowNodes.size());
vector<bool> ReachableAllocNodes (AllocNodes.size()); vector<bool> ReachableAllocNodes (AllocNodes.size());
// Mark all shadow nodes that have edges from other nodes as reachable. MarkEscapeableNodesReachable(ReachableShadowNodes, ReachableAllocNodes);
// 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);
// Mark all nodes in the value map as being reachable... // Mark all nodes in the value map as being reachable...
for (std::map<Value*, PointerValSet>::iterator I = ValueMap.begin(), for (std::map<Value*, PointerValSet>::iterator I = ValueMap.begin(),
@ -280,3 +286,34 @@ bool FunctionDSGraph::RemoveUnreachableNodes() {
Changed = true; 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]);
}