diff options
author | Chris Lattner <sabre@nondot.org> | 2004-07-19 04:47:36 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-07-19 04:47:36 +0000 |
commit | 59073e02ccd79c8728e439dfe6869091b84d669c (patch) | |
tree | f80dc8e7c61394e3efb2c8f23836bdf086c03e64 /lib/CodeGen/RegAllocLinearScan.cpp | |
parent | 6097d13b2a624048dbe02e39e2dfb23bfa269b64 (diff) |
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
Diffstat (limited to 'lib/CodeGen/RegAllocLinearScan.cpp')
-rw-r--r-- | lib/CodeGen/RegAllocLinearScan.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index d5d3459906..24508fbbb0 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<LiveInterval*> 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<LiveInterval*>::iterator addedIt = added.begin(); std::vector<LiveInterval*>::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; } |