mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-09 10:31:14 +00:00
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
This commit is contained in:
parent
16191f0333
commit
48ef398ebd
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user