mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
Properly shrink live ranges after deleting dead copies. Clean up after all joined copies.
LiveInterval::shrinkToUses recomputes the live range from scratch instead of removing snippets. This should avoid the problem with dangling live ranges. Leave physreg identity copies alone. They can be created when joining a virtreg with a physreg. They don't affect register allocation, and they will be removed by the rewriter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131521 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
141ec63962
commit
fc2fcb4165
@ -1038,6 +1038,7 @@ bool SimpleRegisterCoalescing::JoinCopy(CopyRec &TheCopy, bool &Again) {
|
||||
|
||||
// If they are already joined we continue.
|
||||
if (CP.getSrcReg() == CP.getDstReg()) {
|
||||
markAsJoined(CopyMI);
|
||||
DEBUG(dbgs() << "\tCopy already coalesced.\n");
|
||||
return false; // Not coalescable.
|
||||
}
|
||||
@ -1696,13 +1697,11 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
|
||||
// or else the scavenger may complain. LowerSubregs will
|
||||
// delete them later.
|
||||
DoDelete = false;
|
||||
|
||||
|
||||
if (MI->allDefsAreDead()) {
|
||||
if (li_->hasInterval(SrcReg)) {
|
||||
LiveInterval &li = li_->getInterval(SrcReg);
|
||||
if (!ShortenDeadCopySrcLiveRange(li, MI))
|
||||
ShortenDeadCopyLiveRange(li, MI);
|
||||
}
|
||||
if (TargetRegisterInfo::isVirtualRegister(SrcReg) &&
|
||||
li_->hasInterval(SrcReg))
|
||||
li_->shrinkToUses(&li_->getInterval(SrcReg));
|
||||
DoDelete = true;
|
||||
}
|
||||
if (!DoDelete) {
|
||||
@ -1754,24 +1753,6 @@ bool SimpleRegisterCoalescing::runOnMachineFunction(MachineFunction &fn) {
|
||||
DeadDefs.clear();
|
||||
}
|
||||
|
||||
// If the move will be an identity move delete it
|
||||
if (MI->isIdentityCopy()) {
|
||||
unsigned SrcReg = MI->getOperand(1).getReg();
|
||||
if (li_->hasInterval(SrcReg)) {
|
||||
LiveInterval &RegInt = li_->getInterval(SrcReg);
|
||||
// If def of this move instruction is dead, remove its live range
|
||||
// from the destination register's live interval.
|
||||
if (MI->allDefsAreDead()) {
|
||||
if (!ShortenDeadCopySrcLiveRange(RegInt, MI))
|
||||
ShortenDeadCopyLiveRange(RegInt, MI);
|
||||
}
|
||||
}
|
||||
li_->RemoveMachineInstrFromMaps(MI);
|
||||
mii = mbbi->erase(mii);
|
||||
++numPeep;
|
||||
continue;
|
||||
}
|
||||
|
||||
++mii;
|
||||
|
||||
// Check for now unnecessary kill flags.
|
||||
|
Loading…
x
Reference in New Issue
Block a user