From 100f87252d9b50055c65f3ce08a645acb1d4fe4b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 31 Jan 2003 23:57:36 +0000 Subject: [PATCH] Remove globals on the bottom up pass which do not contain any information git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5451 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/DataStructure.cpp | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index 62788d19b8d..b46e04fc2e8 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -1005,6 +1005,24 @@ static bool CallSiteUsesAliveArgs(DSCallSite &CS, std::set &Alive, return false; } +// GlobalIsAlivenessRoot - Return true if the specified global node is +// intrinsically alive in the context of the current graph (ie, it is a root of +// aliveness). For TD graphs, no globals are. For the BU graphs all are unless +// they are trivial globals... +// +static bool GlobalIsAlivenessRoot(DSNode *N, unsigned Flags) { + if (Flags & DSGraph::RemoveUnreachableGlobals) + return false; // If we are to remove all globals, go for it. + + // Ok, we are keeping globals... hrm, we can still delete it if it has no + // links, and no mod/ref or other info... If it is not modified, it can't + // have links... + // + if ((N->NodeType & ~(DSNode::Composition | DSNode::Array)) == 0) + return false; + return true; +} + // removeDeadNodes - Use a more powerful reachability analysis to eliminate // subgraphs that are unreachable. This often occurs because the data // structure doesn't "escape" into it's caller, and thus should be eliminated @@ -1024,8 +1042,8 @@ void DSGraph::removeDeadNodes(unsigned Flags) { // Mark all nodes reachable by (non-global) scalar nodes as alive... for (std::map::iterator I = ScalarMap.begin(), E = ScalarMap.end(); I != E; ++I) - if (!(Flags & DSGraph::RemoveUnreachableGlobals) || - !isa(I->first)) // Don't mark globals! + if (!isa(I->first) || + GlobalIsAlivenessRoot(I->second.getNode(), Flags)) I->second.getNode()->markReachableNodes(Alive); else // Keep track of global nodes GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode())); @@ -1042,7 +1060,8 @@ void DSGraph::removeDeadNodes(unsigned Flags) { std::vector FCallsAlive(FunctionCalls.size()); for (unsigned i = 0, e = FunctionCalls.size(); i != e; ++i) - if (CallSiteUsesAliveArgs(FunctionCalls[i], Alive, Visited)) { + if (!(Flags & DSGraph::RemoveUnreachableGlobals) || + CallSiteUsesAliveArgs(FunctionCalls[i], Alive, Visited)) { FunctionCalls[i].markReachableNodes(Alive); FCallsAlive[i] = true; } -- 2.34.1