aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2004-02-22 04:05:13 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2004-02-22 04:05:13 +0000
commit7200c6b82acb8401048a2bc8a423f23b48db6731 (patch)
tree06f27de9bb971337608095fe2004789e030bbd37 /lib/CodeGen
parent0ad91703274b57f98a08baa545712b64c4b89987 (diff)
Abstract merging of ranges away from number of slots per instruction.
Also make it less aggressive as the current implementation breaks in some cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11696 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp10
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.h5
2 files changed, 11 insertions, 4 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index 00e366fbb3..f15d6cd1b3 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -227,6 +227,7 @@ void LiveIntervals::updateSpilledInterval(Interval& li, int slot)
// the new spill weight is now infinity as it cannot be spilled again
li.weight = std::numeric_limits<float>::infinity();
DEBUG(std::cerr << '\n');
+ DEBUG(std::cerr << "\t\t\t\tupdated interval: " << li << '\n');
}
void LiveIntervals::printRegName(unsigned reg) const
@@ -652,8 +653,10 @@ void LiveIntervals::Interval::join(const LiveIntervals::Interval& other)
LiveIntervals::Interval::Ranges::iterator
LiveIntervals::Interval::mergeRangesForward(Ranges::iterator it)
{
- for (Ranges::iterator n = next(it);
- n != ranges.end() && ((it->second & 1) + it->second) >= n->first; ) {
+ Ranges::iterator n;
+ while ((n = next(it)) != ranges.end()) {
+ if (n->first > it->second)
+ break;
it->second = std::max(it->second, n->second);
n = ranges.erase(n);
}
@@ -665,7 +668,8 @@ LiveIntervals::Interval::mergeRangesBackward(Ranges::iterator it)
{
while (it != ranges.begin()) {
Ranges::iterator p = prior(it);
- if (it->first > ((p->second & 1) + p->second)) break;
+ if (it->first > p->second)
+ break;
it->first = std::min(it->first, p->first);
it->second = std::max(it->second, p->second);
diff --git a/lib/CodeGen/LiveIntervalAnalysis.h b/lib/CodeGen/LiveIntervalAnalysis.h
index 3769f07de7..24bc8956b3 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.h
+++ b/lib/CodeGen/LiveIntervalAnalysis.h
@@ -126,7 +126,10 @@ namespace llvm {
};
static unsigned getBaseIndex(unsigned index) {
- return index - (index % 4);
+ return index - (index % InstrSlots::NUM);
+ }
+ static unsigned getBoundaryIndex(unsigned index) {
+ return getBaseIndex(index + InstrSlots::NUM - 1);
}
static unsigned getLoadIndex(unsigned index) {
return getBaseIndex(index) + InstrSlots::LOAD;