diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp index 3dd8f204f72..5d71b19b574 100644 --- a/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -63,6 +63,7 @@ bool BUDataStructures::run(Module &M) { // nodes at the end of the BU phase should make things that they point to // incomplete in the globals graph. // + GlobalsGraph->removeTriviallyDeadNodes(); GlobalsGraph->maskIncompleteMarkers(); return false; } diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index 68530f043ed..24ccf91357d 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -30,6 +30,8 @@ namespace { Statistic<> NumCallNodesMerged("dsa", "Number of call nodes merged"); Statistic<> NumNodeAllocated ("dsa", "Number of nodes allocated"); Statistic<> NumDNE ("dsa", "Number of nodes removed by reachability"); + Statistic<> NumTrivialDNE ("dsa", "Number of nodes trivially removed"); + Statistic<> NumTrivialGlobalDNE("dsa", "Number of globals trivially removed"); cl::opt EnableDSNodeGlobalRootsHack("enable-dsa-globalrootshack", cl::Hidden, @@ -1470,8 +1472,6 @@ static void removeIdenticalCalls(std::vector &Calls) { // void DSGraph::removeTriviallyDeadNodes() { TIME_REGION(X, "removeTriviallyDeadNodes"); - removeIdenticalCalls(FunctionCalls); - removeIdenticalCalls(AuxFunctionCalls); // Loop over all of the nodes in the graph, calling getNode on each field. // This will cause all nodes to update their forwarding edges, causing @@ -1531,6 +1531,7 @@ void DSGraph::removeTriviallyDeadNodes() { for (unsigned j = 0, e = Globals.size(); j != e; ++j) ScalarMap.erase(Globals[j]); Node.makeNodeDead(); + ++NumTrivialGlobalDNE; } } } @@ -1538,10 +1539,14 @@ void DSGraph::removeTriviallyDeadNodes() { if (Node.getNodeFlags() == 0 && Node.hasNoReferrers()) { // This node is dead! NI = Nodes.erase(NI); // Erase & remove from node list. + ++NumTrivialDNE; } else { ++NI; } } + + removeIdenticalCalls(FunctionCalls); + removeIdenticalCalls(AuxFunctionCalls); } @@ -1755,12 +1760,8 @@ void DSGraph::removeDeadNodes(unsigned Flags) { AuxFunctionCalls.erase(AuxFunctionCalls.begin()+CurIdx, AuxFunctionCalls.end()); - // We are finally done with the GGCloner so we can clear it and then get rid - // of unused nodes in the GlobalsGraph produced by merging. - if (GGCloner.clonedNode()) { - GGCloner.destroy(); - GlobalsGraph->removeTriviallyDeadNodes(); - } + // We are finally done with the GGCloner so we can destroy it. + GGCloner.destroy(); // At this point, any nodes which are visited, but not alive, are nodes // which can be removed. Loop over all nodes, eliminating completely diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index a62cf9806fc..22a60414d3c 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -623,6 +623,7 @@ bool LocalDataStructures::run(Module &M) { if (!I->isExternal()) GGB.mergeInGlobalInitializer(I); + GlobalsGraph->removeTriviallyDeadNodes(); GlobalsGraph->markIncompleteNodes(DSGraph::MarkFormalArgs); return false; } diff --git a/lib/Analysis/DataStructure/TopDownClosure.cpp b/lib/Analysis/DataStructure/TopDownClosure.cpp index 939d7ebd6e1..78ffc359525 100644 --- a/lib/Analysis/DataStructure/TopDownClosure.cpp +++ b/lib/Analysis/DataStructure/TopDownClosure.cpp @@ -107,6 +107,8 @@ bool TDDataStructures::run(Module &M) { } ArgsRemainIncomplete.clear(); + GlobalsGraph->removeTriviallyDeadNodes(); + return false; }