From af25473d5e99e0c0968746e12d8827e4b712bd31 Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Tue, 13 Jan 2004 22:26:14 +0000 Subject: [PATCH] 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 --- lib/CodeGen/LiveIntervalAnalysis.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 4929a56e691..acc32117c00 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; } }