aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/EliminateNodes.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-04-16 03:44:03 +0000
committerChris Lattner <sabre@nondot.org>2002-04-16 03:44:03 +0000
commit212be2e56980bd778e0013d01ce82dcb5ed5d58d (patch)
treec91bb8ddf9ea529803723909d1d3bc73b68d246e /lib/Analysis/DataStructure/EliminateNodes.cpp
parentda022cd143a3694e7f8c2cdad827c4caf90d3b5f (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.cpp33
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;
}