Implement getEscapingAllocations & getNonEscapingAllocations
llvm-svn: 2021
This commit is contained in:
parent
c3ae15cf0b
commit
8d4894e3fa
|
@ -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);
|
||||
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue