diff options
| author | Owen Anderson <resistor@mac.com> | 2008-09-15 22:00:38 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2008-09-15 22:00:38 +0000 |
| commit | 82ab1e72808a652f32d91592b1654f61fe2dea18 (patch) | |
| tree | dc2da4b08eb34b906744b2efbe4251be8964a659 /llvm/lib/CodeGen | |
| parent | 68e7735a3890294c9538ed843169ac5da7db33ba (diff) | |
| download | bcm5719-llvm-82ab1e72808a652f32d91592b1654f61fe2dea18.tar.gz bcm5719-llvm-82ab1e72808a652f32d91592b1654f61fe2dea18.zip | |
Live intervals for live-in registers should begin at the beginning of a basic block, not at the first
instruction. Also, their valno's should have an unknown def. This has no effect currently, but was
causing issues when StrongPHIElimination was enabled.
llvm-svn: 56231
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervalAnalysis.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index 41804db13dc..577400c674b 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -624,7 +624,11 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB, MachineBasicBlock::iterator mi = MBB->begin(); unsigned baseIndex = MIIdx; unsigned start = baseIndex; - unsigned end = start; + while (baseIndex / InstrSlots::NUM < i2miMap_.size() && + getInstructionFromIndex(baseIndex) == 0) + baseIndex += InstrSlots::NUM; + unsigned end = baseIndex; + while (mi != MBB->end()) { if (mi->killsRegister(interval.reg, tri_)) { DOUT << " killed"; @@ -659,7 +663,7 @@ exit: } } - LiveRange LR(start, end, interval.getNextValue(start, 0, VNInfoAllocator)); + LiveRange LR(start, end, interval.getNextValue(~0U, 0, VNInfoAllocator)); interval.addRange(LR); interval.addKill(LR.valno, end); DOUT << " +" << LR << '\n'; @@ -676,11 +680,6 @@ void LiveIntervals::computeIntervals() { // Track the index of the current machine instr. unsigned MIIndex = 0; - // Skip over empty initial indices. - while (MIIndex / InstrSlots::NUM < i2miMap_.size() && - getInstructionFromIndex(MIIndex) == 0) - MIIndex += InstrSlots::NUM; - for (MachineFunction::iterator MBBI = mf_->begin(), E = mf_->end(); MBBI != E; ++MBBI) { MachineBasicBlock *MBB = MBBI; @@ -699,6 +698,11 @@ void LiveIntervals::computeIntervals() { true); } + // Skip over empty initial indices. + while (MIIndex / InstrSlots::NUM < i2miMap_.size() && + getInstructionFromIndex(MIIndex) == 0) + MIIndex += InstrSlots::NUM; + for (; MI != miEnd; ++MI) { DOUT << MIIndex << "\t" << *MI; |

