mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
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:
parent
7d093d4231
commit
4dc1f82e7e
@ -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);
|
||||
|
||||
|
@ -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
Block a user