From 9b87c5c53c879ba6417e391fdd17c21df2892d18 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 31 Oct 2002 22:41:15 +0000 Subject: [PATCH] * 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 --- lib/Analysis/DataStructure/DataStructure.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index cd2c8983194..44ecd01ab7e 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.