aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--include/llvm/CodeGen/LiveIntervalAnalysis.h5
-rw-r--r--include/llvm/CodeGen/LiveIntervals.h5
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp10
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.h5
4 files changed, 19 insertions, 6 deletions
diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h
index 3769f07de7..24bc8956b3 100644
--- a/include/llvm/CodeGen/LiveIntervalAnalysis.h
+++ b/include/llvm/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;
diff --git a/include/llvm/CodeGen/LiveIntervals.h b/include/llvm/CodeGen/LiveIntervals.h
index 3769f07de7..24bc8956b3 100644
--- a/include/llvm/CodeGen/LiveIntervals.h
+++ b/include/llvm/CodeGen/LiveIntervals.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;
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;