Fix for PR1257. Bug in live range shortening as a result of copy coalescing

where the destination is dead.

llvm-svn: 35252
This commit is contained in:
Evan Cheng 2007-03-22 01:26:05 +00:00
parent fa9925e263
commit a20815e157
1 changed files with 9 additions and 11 deletions

View File

@ -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.