aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure/DataStructure.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-10-31 22:41:15 +0000
committerChris Lattner <sabre@nondot.org>2002-10-31 22:41:15 +0000
commit9b87c5c53c879ba6417e391fdd17c21df2892d18 (patch)
tree4699cfce7e7218f310ed267fcbe0d768db053a16 /lib/Analysis/DataStructure/DataStructure.cpp
parente3aa8aa08f77e9747439b856db1cde004019a422 (diff)
* Minor optimization: when merging nodes, merge the smaller one into the
larger one. * Handle the case where we are merging two nodes of different size better. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4476 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DataStructure/DataStructure.cpp')
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index cd2c898319..44ecd01ab7 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -355,7 +355,7 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) {
// now completely folded.
//
if (isNodeCompletelyFolded()) {
- NH.getNode()->foldNodeCompletely();
+ N->foldNodeCompletely();
} else if (NH.getNode()->isNodeCompletelyFolded()) {
foldNodeCompletely();
Offset = 0;
@@ -367,6 +367,10 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) {
if (Offset > NH.getOffset()) {
N->mergeWith(DSNodeHandle(this, Offset), NH.getOffset());
return;
+ } else if (Offset == NH.getOffset() && getSize() < N->getSize()) {
+ // If the offsets are the same, merge the smaller node into the bigger node
+ N->mergeWith(DSNodeHandle(this, Offset), NH.getOffset());
+ return;
}
#if 0
@@ -381,9 +385,15 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) {
//
unsigned NOffset = NH.getOffset()-Offset;
+ // If our destination node is too small... try to grow it.
+ if (N->getSize()+NOffset > getSize() &&
+ growNode(N->getSize()+NOffset)) {
+ // Catastrophic failure occured and we had to collapse the node. In this
+ // case, collapse the other node as well.
+ N->foldNodeCompletely();
+ NOffset = 0;
+ }
unsigned NSize = N->getSize();
- assert(NSize+NOffset <= getSize() &&
- "Don't know how to merge extend a merged nodes size yet!");
// Remove all edges pointing at N, causing them to point to 'this' instead.
// Make sure to adjust their offset, not just the node pointer.