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