From 00948c05b26fc865e212eb293afeae692a44e6bb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 28 Jan 2004 02:05:05 +0000 Subject: [PATCH] Add a timer, fix a minor bug. Also, use RC::merge when possible, reducing the number of nodes allocated, then immediately merged away from 2985444 to 2193852 on perlbmk. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10991 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/DataStructure.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index b16ed8ea298..c0be41331ce 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -779,7 +779,7 @@ DSNodeHandle ReachabilityCloner::getClonedNH(const DSNodeHandle &SrcNH) { DSNode *DN = new DSNode(*SN, &Dest, true /* Null out all links */); DN->maskNodeTypes(BitsToKeep); - NH.setNode(DN); + NH = DN; // Next, recursively clone all outgoing links as necessary. Note that // adding these links can cause the node to collapse itself at any time, and @@ -814,7 +814,7 @@ DSNodeHandle ReachabilityCloner::getClonedNH(const DSNodeHandle &SrcNH) { DSNodeHandle &DestGNH = NodeMap[SrcGNH.getNode()]; assert(DestGNH.getNode() == NH.getNode() &&"Global mapping inconsistent"); Dest.getNodeForValue(GV).mergeWith(DSNodeHandle(DestGNH.getNode(), - DestGNH.getOffset()+NH.getOffset())); + DestGNH.getOffset()+SrcGNH.getOffset())); if (CloneFlags & DSGraph::UpdateInlinedGlobals) Dest.getInlinedGlobals().insert(GV); @@ -1619,6 +1619,7 @@ void DSGraph::removeDeadNodes(unsigned Flags) { DSGraph::StripIncompleteBit); // Mark all nodes reachable by (non-global) scalar nodes as alive... + { TIME_REGION(Y, "removeDeadNodes:scalarscan"); for (ScalarMapTy::iterator I = ScalarMap.begin(), E = ScalarMap.end(); I !=E;) if (isa(I->first)) { // Keep track of global nodes assert(I->second.getNode() && "Null global node?"); @@ -1626,8 +1627,14 @@ void DSGraph::removeDeadNodes(unsigned Flags) { GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode())); // Make sure that all globals are cloned over as roots. - if (!(Flags & DSGraph::RemoveUnreachableGlobals)) - GGCloner.getClonedNH(I->second); + if (!(Flags & DSGraph::RemoveUnreachableGlobals)) { + DSGraph::ScalarMapTy::iterator SMI = + GlobalsGraph->getScalarMap().find(I->first); + if (SMI != GlobalsGraph->getScalarMap().end()) + GGCloner.merge(SMI->second, I->second); + else + GGCloner.getClonedNH(I->second); + } ++I; } else { // Check to see if this is a worthless node generated for non-pointer @@ -1648,6 +1655,7 @@ void DSGraph::removeDeadNodes(unsigned Flags) { ++I; } } + } // The return values are alive as well. for (ReturnNodesTy::iterator I = ReturnNodes.begin(), E = ReturnNodes.end();