Implement getEscapingAllocations & getNonEscapingAllocations

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2021 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-03-28 19:33:00 +00:00
parent 7d093d4231
commit 4dc1f82e7e
3 changed files with 69 additions and 28 deletions

View 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);

View 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);

View 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]);
}