* Minor optimization: when merging nodes, merge the smaller one into the
authorChris Lattner <sabre@nondot.org>
Thu, 31 Oct 2002 22:41:15 +0000 (22:41 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 31 Oct 2002 22:41:15 +0000 (22:41 +0000)
       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

lib/Analysis/DataStructure/DataStructure.cpp

index cd2c898319476babf5976c5499d3b3ca5da16ad3..44ecd01ab7e6bae6c078bd8a67d89cfcbd61d181 100644 (file)
@@ -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.