aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveIntervalAnalysis.cpp
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-13 22:26:14 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-13 22:26:14 +0000
commitaf25473d5e99e0c0968746e12d8827e4b712bd31 (patch)
treeb13f76518f333def6c845a6568d65a4e3c1e119f /lib/CodeGen/LiveIntervalAnalysis.cpp
parent048a1d8db737c32dbbb9396863eb94d9f7f0a8c4 (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.cpp17
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;
}
}