Delete dead code after rematerializing.

LiveRangeEdit::eliminateDeadDefs() will eventually be used by coalescing,
splitting, and spilling for dead code elimination. It can delete chains of dead
instructions as long as there are no dependency loops.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127287 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2011-03-08 22:46:11 +00:00
parent 5aa3fa6d82
commit 5881799d0c
4 changed files with 107 additions and 1 deletions
+37 -1
View File
@@ -797,6 +797,40 @@ void SplitEditor::rewriteComponents(const SmallVectorImpl<LiveInterval*> &Intvs,
}
}
void SplitEditor::deleteRematVictims() {
SmallVector<MachineInstr*, 8> Dead;
for (LiveInterval::const_vni_iterator I = Edit->getParent().vni_begin(),
E = Edit->getParent().vni_end(); I != E; ++I) {
const VNInfo *VNI = *I;
// Was VNI rematted anywhere?
if (VNI->isUnused() || VNI->isPHIDef() || !Edit->didRematerialize(VNI))
continue;
unsigned RegIdx = RegAssign.lookup(VNI->def);
LiveInterval *LI = Edit->get(RegIdx);
LiveInterval::const_iterator LII = LI->FindLiveRangeContaining(VNI->def);
assert(LII != LI->end() && "Missing live range for rematted def");
// Is this a dead def?
if (LII->end != VNI->def.getNextSlot())
continue;
MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
assert(MI && "Missing instruction for dead def");
MI->addRegisterDead(LI->reg, &TRI);
if (!MI->allDefsAreDead())
continue;
DEBUG(dbgs() << "All defs dead: " << *MI);
Dead.push_back(MI);
}
if (Dead.empty())
return;
Edit->eliminateDeadDefs(Dead, LIS, TII);
}
void SplitEditor::finish() {
assert(OpenIdx == 0 && "Previous LI not closed before rewrite");
++NumFinished;
@@ -835,7 +869,9 @@ void SplitEditor::finish() {
// Rewrite virtual registers, possibly extending ranges.
rewriteAssigned(Complex);
// FIXME: Delete defs that were rematted everywhere.
// Delete defs that were rematted everywhere.
if (Complex)
deleteRematVictims();
// Get rid of unused values and set phi-kill flags.
for (LiveRangeEdit::iterator I = Edit->begin(), E = Edit->end(); I != E; ++I)