summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-07-19 05:15:10 +0000
committerChris Lattner <sabre@nondot.org>2004-07-19 05:15:10 +0000
commitc56f90d156a89d149c1b0b98654bb29f44c7070a (patch)
tree499aee7fe3c90e43e4768931e9a9c42c4a3af562
parent8c8144b958684513811d76c54e9f14dbada1ac57 (diff)
downloadbcm5719-llvm-c56f90d156a89d149c1b0b98654bb29f44c7070a.tar.gz
bcm5719-llvm-c56f90d156a89d149c1b0b98654bb29f44c7070a.zip
See comments. The live intervals were not coming out of the spiller in sorted
order, causing the inactive list in the linearscan list to get unsorted, which basically fuxored everything up severely. These seems to fix the joiner, so with more testing I will enable it by default. llvm-svn: 14992
-rw-r--r--llvm/lib/CodeGen/LiveIntervals.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp
index 5e9e495edcc..9687e589812 100644
--- a/llvm/lib/CodeGen/LiveIntervals.cpp
+++ b/llvm/lib/CodeGen/LiveIntervals.cpp
@@ -185,6 +185,16 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
return true;
}
+namespace {
+ /// CompareIntervalStar - This is a simple comparison function for interval
+ /// pointers. It compares based on their starting point.
+ struct CompareIntervalStar {
+ bool operator()(LiveInterval *LHS, LiveInterval* RHS) const {
+ return LHS->start() < RHS->start();
+ }
+ };
+}
+
std::vector<LiveInterval*> LiveIntervals::addIntervalsForSpills(
const LiveInterval& li,
VirtRegMap& vrm,
@@ -210,7 +220,7 @@ std::vector<LiveInterval*> LiveIntervals::addIntervalsForSpills(
MachineBasicBlock::iterator mi = getInstructionFromIndex(index);
for_operand:
- for (unsigned i = 0; i < mi->getNumOperands(); ++i) {
+ for (unsigned i = 0; i != mi->getNumOperands(); ++i) {
MachineOperand& mop = mi->getOperand(i);
if (mop.isRegister() && mop.getReg() == li.reg) {
if (MachineInstr* fmi =
@@ -267,6 +277,15 @@ std::vector<LiveInterval*> LiveIntervals::addIntervalsForSpills(
}
}
+ // FIXME: This method MUST return intervals in sorted order. If a
+ // particular machine instruction both uses and defines the vreg being
+ // spilled (e.g., vr = vr + 1) and if the def is processed before the
+ // use, the list ends up not sorted.
+ //
+ // The proper way to fix this is to process all uses of the vreg before we
+ // process any defs. However, this would require refactoring the above
+ // blob of code, which I'm not feeling up to right now.
+ std::sort(added.begin(), added.end(), CompareIntervalStar());
return added;
}
OpenPOWER on IntegriCloud