aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/DataStructure.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-01-28 02:05:05 +0000
committerChris Lattner <sabre@nondot.org>2004-01-28 02:05:05 +0000
commit00948c05b26fc865e212eb293afeae692a44e6bb (patch)
treeb5f7443d844aff1ea60414c70da2310ab4646e9a /lib/Analysis/DataStructure/DataStructure.cpp
parent64507e39dae300e5bdce33bb02f05f4c47c99f46 (diff)
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
Diffstat (limited to 'lib/Analysis/DataStructure/DataStructure.cpp')
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index b16ed8ea29..c0be41331c 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<GlobalValue>(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();