From 02606637e070e936e81d8206945fb0c9b4a04ec2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 4 Nov 2002 06:48:26 +0000 Subject: [PATCH] Change the "Cannot merge two portions of the same node yet" from an assertion into a "oh crap, lets collapse" case git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4530 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/DataStructure.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp index d20d1b42c2a..85e9684e022 100644 --- a/lib/Analysis/DataStructure/DataStructure.cpp +++ b/lib/Analysis/DataStructure/DataStructure.cpp @@ -347,18 +347,25 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) { if (N == 0 || (N == this && NH.getOffset() == Offset)) return; // Noop - assert(NH.getNode() != this && - "Cannot merge two portions of the same node yet!"); + if (N == this) { + std::cerr << "WARNING: Cannot merge two portions of the same node yet, so we collapse instead!\n"; + N->foldNodeCompletely(); + return; + } // If we are merging a node with a completely folded node, then both nodes are // now completely folded. // if (isNodeCompletelyFolded()) { - N->foldNodeCompletely(); - } else if (NH.getNode()->isNodeCompletelyFolded()) { + if (!N->isNodeCompletelyFolded()) + N->foldNodeCompletely(); + } else if (N->isNodeCompletelyFolded()) { foldNodeCompletely(); Offset = 0; } + N = NH.getNode(); + + if (this == N) return; // If both nodes are not at offset 0, make sure that we are merging the node // at an later offset into the node with the zero offset. @@ -401,7 +408,7 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) { DSNodeHandle &Ref = *N->Referrers.back(); Ref = DSNodeHandle(this, NOffset+Ref.getOffset()); } - + // We must merge fields in this node due to nodes merged in the source node. // In order to handle this we build a map that converts from the source node's // MergeMap values to our MergeMap values. This map is indexed by the @@ -440,7 +447,7 @@ void DSNode::mergeWith(const DSNodeHandle &NH, unsigned Offset) { // for (unsigned i = 0, e = NSize; i != e; ++i) if (DSNodeHandle *Link = N->getLink(i)) { - addEdgeTo(i+NOffset, *Link); + addEdgeTo((i+NOffset) % getSize(), *Link); N->MergeMap[i] = -1; // Kill outgoing edge }