summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/RegAllocLinearScan.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-05-10 22:30:41 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-05-10 22:30:41 +0000
commit6ad040a6bc8a674e4b290c8479000395372864eb (patch)
treeee011874962a1f0f531d32c575a0a185572075bf /llvm/lib/CodeGen/RegAllocLinearScan.cpp
parent47a57ac4f9c338b609a23371c295f50740574b17 (diff)
downloadbcm5719-llvm-6ad040a6bc8a674e4b290c8479000395372864eb.tar.gz
bcm5719-llvm-6ad040a6bc8a674e4b290c8479000395372864eb.zip
If the live interval legnth is essentially zero, i.e. in every live range
the use follows def immediately, it doesn't make sense to spill it and hope it will be easier to allocate for this LI. llvm-svn: 28217
Diffstat (limited to 'llvm/lib/CodeGen/RegAllocLinearScan.cpp')
-rw-r--r--llvm/lib/CodeGen/RegAllocLinearScan.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/RegAllocLinearScan.cpp b/llvm/lib/CodeGen/RegAllocLinearScan.cpp
index 59467c1e0f8..fd7d5a6d760 100644
--- a/llvm/lib/CodeGen/RegAllocLinearScan.cpp
+++ b/llvm/lib/CodeGen/RegAllocLinearScan.cpp
@@ -406,6 +406,14 @@ static void RevertVectorIteratorsTo(RA::IntervalPtrs &V, unsigned Point) {
}
}
+static bool isZeroLengthInterval(LiveInterval *li) {
+ for (LiveInterval::Ranges::const_iterator
+ i = li->ranges.begin(), e = li->ranges.end(); i != e; ++i)
+ if (i->end - i->start > LiveIntervals::InstrSlots::NUM)
+ return false;
+ return true;
+}
+
/// assignRegOrStackSlotAtInterval - assign a register if one is available, or
/// spill.
@@ -557,10 +565,16 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur)
DEBUG(std::cerr << "\t\tregister with min weight: "
<< mri_->getName(minReg) << " (" << minWeight << ")\n");
+ // If the live interval legnth is essentially zero, i.e. in every live range
+ // the use follows def immediately, it doesn't make sense to spill it and
+ // hope it will be easier to allocate for this li.
+ if (isZeroLengthInterval(cur))
+ DEBUG(std::cerr << "\t\tavoid spilling zero length live interval: "
+ << *cur << '\n';);
// if the current has the minimum weight, we need to spill it and
// add any added intervals back to unhandled, and restart
// linearscan.
- if (cur->weight <= minWeight) {
+ else if (cur->weight <= minWeight) {
DEBUG(std::cerr << "\t\t\tspilling(c): " << *cur << '\n';);
int slot = vrm_->assignVirt2StackSlot(cur->reg);
std::vector<LiveInterval*> added =
OpenPOWER on IntegriCloud