diff options
author | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-01-31 23:13:30 +0000 |
---|---|---|
committer | Alkis Evlogimenos <alkis@evlogimenos.com> | 2004-01-31 23:13:30 +0000 |
commit | 02ba13c9897ae2b19f9201e57460d7ee2b753a0b (patch) | |
tree | 0effd6c8333e12e12513bf33b30adc38a5a4f3e1 /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | ef09c63e7ba5dd5410655f71d35eb7245893b1f1 (diff) |
Be a little smarter on the way we handle physical register defs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11038 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 439781b0b0..a762ede860 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -210,49 +210,36 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock* mbb, MachineBasicBlock::iterator mi, unsigned reg) { + typedef LiveVariables::killed_iterator KillIter; + DEBUG(std::cerr << "\t\tregister: "; printRegName(reg)); + MachineBasicBlock::iterator e = mbb->end(); 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 + unsigned end = start + 1; - for (LiveVariables::killed_iterator - ki = lv_->dead_begin(*mi), - ke = lv_->dead_end(*mi); + // a variable can be dead by the instruction defining it + for (KillIter 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), - ke = lv_->dead_end(*mi); - ki != ke; ++ki) { - if (reg == ki->second) { - end = getInstructionIndex(ki->first) + 1; - DEBUG(std::cerr << " dead\n"); - goto exit; - } - } - for (LiveVariables::killed_iterator - ki = lv_->killed_begin(*mi), - ke = lv_->killed_end(*mi); + // a variable can only be killed by subsequent instructions + do { + ++mi; + ++end; + for (KillIter ki = lv_->killed_begin(*mi), ke = lv_->killed_end(*mi); ki != ke; ++ki) { if (reg == ki->second) { - end = getInstructionIndex(ki->first) + 1; DEBUG(std::cerr << " killed\n"); goto exit; } } - } + } while (mi != e); + exit: assert(start < end && "did not find end of interval?"); |