diff options
author | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-01-13 22:26:14 +0000 |
---|---|---|
committer | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-01-13 22:26:14 +0000 |
commit | af25473d5e99e0c0968746e12d8827e4b712bd31 (patch) | |
tree | b13f76518f333def6c845a6568d65a4e3c1e119f /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | 048a1d8db737c32dbbb9396863eb94d9f7f0a8c4 (diff) |
Fix miscomputation of live intervals. The catch is that registers can
be dead at the defining instruction but can only be killed in
subsequent ones.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10833 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 4929a56e69..acc32117c0 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -196,6 +196,21 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock* mbb, unsigned start = getInstructionIndex(*mi); unsigned end = start; + // register can be dead by the instruction defining it but it can + // only be killed by subsequent instructions + + for (LiveVariables::killed_iterator + ki = lv_->dead_begin(*mi), + ke = lv_->dead_end(*mi); + ki != ke; ++ki) { + if (reg == ki->second) { + end = getInstructionIndex(ki->first) + 1; + DEBUG(std::cerr << " dead\n"); + goto exit; + } + } + ++mi; + for (MachineBasicBlock::iterator e = mbb->end(); mi != e; ++mi) { for (LiveVariables::killed_iterator ki = lv_->dead_begin(*mi), @@ -203,6 +218,7 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock* mbb, ki != ke; ++ki) { if (reg == ki->second) { end = getInstructionIndex(ki->first) + 1; + DEBUG(std::cerr << " dead\n"); goto exit; } } @@ -213,6 +229,7 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock* mbb, ki != ke; ++ki) { if (reg == ki->second) { end = getInstructionIndex(ki->first) + 1; + DEBUG(std::cerr << " killed\n"); goto exit; } } |