diff options
author | Chris Lattner <sabre@nondot.org> | 2002-04-16 03:44:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-04-16 03:44:03 +0000 |
commit | 212be2e56980bd778e0013d01ce82dcb5ed5d58d (patch) | |
tree | c91bb8ddf9ea529803723909d1d3bc73b68d246e /lib/Analysis/DataStructure/EliminateNodes.cpp | |
parent | da022cd143a3694e7f8c2cdad827c4caf90d3b5f (diff) |
* Eliminate ArgDSNode's completely, now rely on scalar map
* Fold call nodes that are indistinguishable for each other. This is a big
win for external functions like sqrt, which would multiply dramatically
before.
* Global nodes with no edges to or from them are now eliminated from the graph.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2257 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DataStructure/EliminateNodes.cpp')
-rw-r--r-- | lib/Analysis/DataStructure/EliminateNodes.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/lib/Analysis/DataStructure/EliminateNodes.cpp b/lib/Analysis/DataStructure/EliminateNodes.cpp index 767f7fe006..6b22f69617 100644 --- a/lib/Analysis/DataStructure/EliminateNodes.cpp +++ b/lib/Analysis/DataStructure/EliminateNodes.cpp @@ -250,11 +250,6 @@ void FunctionDSGraph::MarkEscapeableNodesReachable( // 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, @@ -273,8 +268,10 @@ void FunctionDSGraph::MarkEscapeableNodesReachable( bool FunctionDSGraph::RemoveUnreachableNodes() { bool Changed = false; - - while (1) { + bool LocalChange = true; + + while (LocalChange) { + LocalChange = false; // Reachable*Nodes - Contains true if there is an edge from a reachable // node to the numbered node... // @@ -296,7 +293,6 @@ bool FunctionDSGraph::RemoveUnreachableNodes() { // a two part process, because we must drop all references before we delete // the shadow nodes [in case cycles exist]. // - bool LocalChange = false; for (unsigned i = 0; i != ShadowNodes.size(); ++i) if (!ReachableShadowNodes[i]) { // Track all unreachable nodes... @@ -311,7 +307,7 @@ bool FunctionDSGraph::RemoveUnreachableNodes() { ReachableShadowNodes.erase(ReachableShadowNodes.begin()+i); ShadowNodes.erase(ShadowNodes.begin()+i); // Remove node entry --i; // Don't skip the next node. - LocalChange = true; + LocalChange = Changed = true; } for (unsigned i = 0; i != AllocNodes.size(); ++i) @@ -328,13 +324,22 @@ bool FunctionDSGraph::RemoveUnreachableNodes() { ReachableAllocNodes.erase(ReachableAllocNodes.begin()+i); AllocNodes.erase(AllocNodes.begin()+i); // Remove node entry --i; // Don't skip the next node. - LocalChange = true; + LocalChange = Changed = true; } - - if (!LocalChange) return Changed; // No more dead nodes... - - Changed = true; } + + // Loop over the global nodes, removing nodes that have no edges into them. + // + for (std::vector<GlobalDSNode*>::iterator I = GlobalNodes.begin(); + I != GlobalNodes.end(); ) + if ((*I)->getReferrers().empty()) { // No referrers... + delete *I; + I = GlobalNodes.erase(I); // Remove the node... + Changed = true; + } else { + ++I; + } + return Changed; } |