diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-09-02 00:20:32 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-09-02 00:20:32 +0000 |
| commit | 7138f9142498d283e419ee7b9ad96eddafb5a963 (patch) | |
| tree | 1a5668ac13fef2cf65440f27250bb0025e017c2c /llvm/lib/CodeGen | |
| parent | a66403dbf74fe3ca3fdfacbf8f083f99da1e33bd (diff) | |
| download | bcm5719-llvm-7138f9142498d283e419ee7b9ad96eddafb5a963.tar.gz bcm5719-llvm-7138f9142498d283e419ee7b9ad96eddafb5a963.zip | |
Teach live intervals to not crash on dead livein regs
llvm-svn: 23206
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervalAnalysis.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervalAnalysis.h | 3 |
2 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index 0f43c1b7330..bac4b70d75b 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -131,10 +131,10 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { for (MachineFunction::livein_iterator I = fn.livein_begin(), E = fn.livein_end(); I != E; ++I) { handlePhysicalRegisterDef(Entry, Entry->begin(), - getOrCreateInterval(I->first), 0, 0); + getOrCreateInterval(I->first), 0, 0, true); for (const unsigned* AS = mri_->getAliasSet(I->first); *AS; ++AS) handlePhysicalRegisterDef(Entry, Entry->begin(), - getOrCreateInterval(*AS), 0, 0); + getOrCreateInterval(*AS), 0, 0, true); } } @@ -478,7 +478,8 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock* mbb, void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB, MachineBasicBlock::iterator mi, LiveInterval& interval, - unsigned SrcReg, unsigned DestReg) + unsigned SrcReg, unsigned DestReg, + bool isLiveIn) { // A physical register cannot be live across basic block, so its // lifetime must end somewhere in its defining basic block. @@ -501,9 +502,7 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB, // If it is not dead on definition, it must be killed by a // subsequent instruction. Hence its interval is: // [defSlot(def), useSlot(kill)+1) - while (true) { - ++mi; - assert(mi != MBB->end() && "physreg was not killed in defining block!"); + while (++mi != MBB->end()) { baseIndex += InstrSlots::NUM; if (lv_->KillsRegister(mi, interval.reg)) { DEBUG(std::cerr << " killed"); @@ -511,6 +510,12 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB, goto exit; } } + + // The only case we should have a dead physreg here without a killing or + // instruction where we know it's dead is if it is live-in to the function + // and never used. + assert(isLiveIn && "physreg was not killed in defining block!"); + end = getDefIndex(start) + 1; // It's dead. exit: assert(start < end && "did not find end of interval?"); diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.h b/llvm/lib/CodeGen/LiveIntervalAnalysis.h index f7f4569cb35..02ecea7af0c 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.h +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.h @@ -164,7 +164,8 @@ namespace llvm { void handlePhysicalRegisterDef(MachineBasicBlock* mbb, MachineBasicBlock::iterator mi, LiveInterval& interval, - unsigned SrcReg, unsigned DestReg); + unsigned SrcReg, unsigned DestReg, + bool isLiveIn = false); /// Return true if the two specified registers belong to different /// register classes. The registers may be either phys or virt regs. |

