aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveIntervalAnalysis.cpp
diff options
context:
space:
mode:
authorAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-31 23:13:30 +0000
committerAlkis Evlogimenos <alkis@evlogimenos.com>2004-01-31 23:13:30 +0000
commit02ba13c9897ae2b19f9201e57460d7ee2b753a0b (patch)
tree0effd6c8333e12e12513bf33b30adc38a5a4f3e1 /lib/CodeGen/LiveIntervalAnalysis.cpp
parentef09c63e7ba5dd5410655f71d35eb7245893b1f1 (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.cpp39
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?");