* 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
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index cd2c898..44ecd01 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -355,7 +355,7 @@
   // now completely folded.
   //
   if (isNodeCompletelyFolded()) {
-    NH.getNode()->foldNodeCompletely();
+    N->foldNodeCompletely();
   } else if (NH.getNode()->isNodeCompletelyFolded()) {
     foldNodeCompletely();
     Offset = 0;
@@ -367,6 +367,10 @@
   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 @@
   //
   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.