aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-07-19 04:47:36 +0000
committerChris Lattner <sabre@nondot.org>2004-07-19 04:47:36 +0000
commit59073e02ccd79c8728e439dfe6869091b84d669c (patch)
treef80dc8e7c61394e3efb2c8f23836bdf086c03e64
parent6097d13b2a624048dbe02e39e2dfb23bfa269b64 (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
-rw-r--r--lib/CodeGen/RegAllocLinearScan.cpp36
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;
}