From: Evan Cheng Date: Thu, 22 Mar 2007 01:26:05 +0000 (+0000) Subject: Fix for PR1257. Bug in live range shortening as a result of copy coalescing X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2c3535d2a6738d154914a59f272fac45e50b706b;p=oota-llvm.git Fix for PR1257. Bug in live range shortening as a result of copy coalescing where the destination is dead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35252 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index a968063c999..ab8a18d1dfb 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -924,14 +924,14 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, MachineOperand *mopd = CopyMI->findRegisterDefOperand(DstReg); bool isDead = mopd->isDead(); bool isShorten = false; - unsigned SrcStart = 0; - unsigned SrcEnd = 0; + unsigned SrcStart = 0, RemoveStart = 0; + unsigned SrcEnd = 0, RemoveEnd = 0; if (isDead) { unsigned CopyIdx = getInstructionIndex(CopyMI); LiveInterval::iterator SrcLR = SrcInt.FindLiveRangeContaining(getUseIndex(CopyIdx)); - SrcStart = SrcLR->start; - SrcEnd = SrcLR->end; + RemoveStart = SrcStart = SrcLR->start; + RemoveEnd = SrcEnd = SrcLR->end; // 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. @@ -939,18 +939,16 @@ bool LiveIntervals::JoinCopy(MachineInstr *CopyMI, isDead = false; else { MachineOperand *MOU; - MachineInstr *LastUse = - lastRegisterUse(repSrcReg, SrcStart, CopyIdx, MOU); + MachineInstr *LastUse= lastRegisterUse(repSrcReg, SrcStart, CopyIdx, MOU); if (LastUse) { // Shorten the liveinterval to the end of last use. MOU->setIsKill(); isDead = false; isShorten = true; - SrcEnd = getUseIndex(getInstructionIndex(LastUse)); + RemoveStart = getDefIndex(getInstructionIndex(LastUse)); + RemoveEnd = SrcEnd; } } - if (isDead) - isShorten = true; } // We need to be careful about coalescing a source physical register with a @@ -1030,10 +1028,10 @@ TryJoin: } } - if (isShorten) { + if (isShorten || isDead) { // Shorten the live interval. LiveInterval &LiveInInt = (repSrcReg == DestInt.reg) ? DestInt : SrcInt; - LiveInInt.removeRange(SrcStart, SrcEnd); + LiveInInt.removeRange(RemoveStart, RemoveEnd); } } else { // Coallescing failed.