aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/SplitKit.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-08 22:46:11 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-08 22:46:11 +0000
commitea5ebfed15907800346d069c7fe2fe9f76ff89e8 (patch)
tree25606326038a761932e44596ec10a3470de099d6 /llvm/lib/CodeGen/SplitKit.cpp
parente996fd30be59b65b0607607aa907af7178568994 (diff)
downloadllvm-ea5ebfed15907800346d069c7fe2fe9f76ff89e8.zip
llvm-ea5ebfed15907800346d069c7fe2fe9f76ff89e8.tar.gz
llvm-ea5ebfed15907800346d069c7fe2fe9f76ff89e8.tar.bz2
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. llvm-svn: 127287
Diffstat (limited to 'llvm/lib/CodeGen/SplitKit.cpp')
-rw-r--r--llvm/lib/CodeGen/SplitKit.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp
index c4ae8c4..99d05fa 100644
--- a/llvm/lib/CodeGen/SplitKit.cpp
+++ b/llvm/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)