aboutsummaryrefslogtreecommitdiff
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
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
-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;
}
}