From 48ef398ebd2f2b992c81bebd5159de119ce62c80 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sun, 25 Feb 2007 09:46:31 +0000 Subject: [PATCH] Fix a couple of bugs related IsDead back propagation during coalescing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34595 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/LiveIntervalAnalysis.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 5e17a734a21..809d13464c0 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -903,11 +903,16 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, unsigned SrcStart = 0; unsigned SrcEnd = 0; if (isDead) { - unsigned CopyIdx = getDefIndex(getInstructionIndex(CopyMI)); - LiveInterval::iterator SrcLR = SrcInt.FindLiveRangeContaining(CopyIdx-1); + unsigned CopyIdx = getInstructionIndex(CopyMI); + LiveInterval::iterator SrcLR = + SrcInt.FindLiveRangeContaining(getUseIndex(CopyIdx)); SrcStart = SrcLR->start; SrcEnd = SrcLR->end; - if (hasRegisterUse(repSrcReg, SrcStart, SrcEnd)) + // The instruction which defines the src is only truly dead if there are + // no intermediate uses and there isn't a use beyond the copy. + // FIXME: find the last use, mark is kill and shorten the live range. + if (SrcEnd > getDefIndex(CopyIdx) || + hasRegisterUse(repSrcReg, SrcStart, CopyIdx)) isDead = false; } @@ -918,10 +923,10 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, if (JoinIntervals(DestInt, SrcInt)) { if (isDead) { // Result of the copy is dead. Propagate this property. - if (SrcStart == 0) { + if (SrcStart == 0 && MRegisterInfo::isPhysicalRegister(SrcReg)) { // Live-in to the function but dead. Remove it from MBB live-in set. // JoinIntervals may end up swapping the two intervals. - LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt:SrcInt; + LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt : SrcInt; LiveInInt.removeRange(SrcStart, SrcEnd); MachineBasicBlock *MBB = CopyMI->getParent(); MBB->removeLiveIn(SrcReg);