From: Chris Lattner Date: Mon, 19 Jul 2004 04:47:36 +0000 (+0000) Subject: Add some asserts that the list of intervals returned by addIntervalsForSpills X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=59073e02ccd79c8728e439dfe6869091b84d669c;p=oota-llvm.git Add some asserts that the list of intervals returned by addIntervalsForSpills is sorted. This is not the case currently, which is causing no end of problems. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14990 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index d5d3459906f..24508fbbb02 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -386,18 +386,42 @@ void RA::assignRegOrStackSlotAtInterval(IntervalPtrs::value_type cur) int slot = vrm_->assignVirt2StackSlot(cur->reg); std::vector added = li_->addIntervalsForSpills(*cur, *vrm_, slot); - - // merge added with unhandled + if (added.empty()) + return; // Early exit if all spills were folded. +#ifndef NDEBUG + int OldStart = -1; +#endif + + // Merge added with unhandled. Note that we know that + // addIntervalsForSpills returns intervals sorted by their starting + // point. std::vector::iterator addedIt = added.begin(); std::vector::iterator addedItEnd = added.end(); - for (IntervalPtrs::iterator i = unhandled_.begin(), e = unhandled_.end(); + for (IntervalPtrs::iterator i = unhandled_.begin(), e =unhandled_.end(); i != e && addedIt != addedItEnd; ++i) { - if ((*i)->start() > (*addedIt)->start()) + while ((*i)->start() > (*addedIt)->start() && + addedIt != addedItEnd) { +#ifndef NDEBUG + // This code only works if addIntervalsForSpills retursn a + // sorted interval list. Assert this is the case now. + assert(OldStart <= (int)(*addedIt)->start() && + "addIntervalsForSpills didn't return sorted interval list!"); + OldStart = (*addedIt)->start(); +#endif i = unhandled_.insert(i, *(addedIt++)); + } } - while (addedIt != addedItEnd) - unhandled_.push_back(*(addedIt++)); + while (addedIt != addedItEnd) { +#ifndef NDEBUG + // This code only works if addIntervalsForSpills retursn a + // sorted interval list. Assert this is the case now. + assert(OldStart <= (int)(*addedIt)->start() && + "addIntervalsForSpills didn't return sorted interval list!"); + OldStart = (*addedIt)->start(); +#endif + unhandled_.push_back(*(addedIt++)); + } return; }