diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-08 22:46:11 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-03-08 22:46:11 +0000 |
commit | 5881799d0cccbd814ec1b0f0509df9be1f63c6cb (patch) | |
tree | 3877f470995699b287a14a2b4a5d66f9ffe6e112 /lib/CodeGen/SplitKit.cpp | |
parent | 5aa3fa6d827e162893534454b2a2c4b6e50884fc (diff) |
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
Diffstat (limited to 'lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index c4ae8c474c..99d05fa655 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -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) |