aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-29 17:47:00 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-29 17:47:00 +0000
commitc1d22d8adbd40c3e5d704fdae90f9ed2089bb67e (patch)
tree913b059629ff3b16e9580625798388cf4f3f3826
parent9eae80051b6f6f5564b725221b2163a1f0d83672 (diff)
Run dead code elimination immediately after rematerialization.
This may eliminate some uses of the spilled registers, and we don't want to insert reloads for that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128468 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/InlineSpiller.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/lib/CodeGen/InlineSpiller.cpp b/lib/CodeGen/InlineSpiller.cpp
index f1b9aaff2a..f56cb4822e 100644
--- a/lib/CodeGen/InlineSpiller.cpp
+++ b/lib/CodeGen/InlineSpiller.cpp
@@ -684,8 +684,7 @@ void InlineSpiller::reMaterializeAll() {
for (LiveInterval::vni_iterator I = LI.vni_begin(), E = LI.vni_end();
I != E; ++I) {
VNInfo *VNI = *I;
- if (VNI->isUnused() || VNI->isPHIDef() || VNI->hasPHIKill() ||
- UsedValues.count(VNI))
+ if (VNI->isUnused() || VNI->isPHIDef() || UsedValues.count(VNI))
continue;
MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
MI->addRegisterDead(Reg, &TRI);
@@ -693,14 +692,30 @@ void InlineSpiller::reMaterializeAll() {
continue;
DEBUG(dbgs() << "All defs dead: " << *MI);
DeadDefs.push_back(MI);
- // Remove all Reg references so we don't insert spill code around MI.
- for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
- MOE = MI->operands_end(); MOI != MOE ; ++MOI)
- if (MOI->isReg() && MOI->getReg() == Reg)
- MOI->setReg(0);
- VNI->setIsUnused(true);
}
}
+
+ // Eliminate dead code after remat. Note that some snippet copies may be
+ // deleted here.
+ if (DeadDefs.empty())
+ return;
+ DEBUG(dbgs() << "Remat created " << DeadDefs.size() << " dead defs.\n");
+ Edit->eliminateDeadDefs(DeadDefs, LIS, VRM, TII);
+
+ // Get rid of deleted and empty intervals.
+ for (unsigned i = RegsToSpill.size(); i != 0; --i) {
+ unsigned Reg = RegsToSpill[i-1];
+ if (!LIS.hasInterval(Reg)) {
+ RegsToSpill.erase(RegsToSpill.begin() + (i - 1));
+ continue;
+ }
+ LiveInterval &LI = LIS.getInterval(Reg);
+ if (!LI.empty())
+ continue;
+ Edit->eraseVirtReg(Reg, LIS);
+ RegsToSpill.erase(RegsToSpill.begin() + (i - 1));
+ }
+ DEBUG(dbgs() << RegsToSpill.size() << " registers to spill after remat.\n");
}
/// If MI is a load or store of StackSlot, it can be removed.
@@ -913,7 +928,7 @@ void InlineSpiller::spill(LiveRangeEdit &edit) {
reMaterializeAll();
// Remat may handle everything.
- if (Edit->getParent().empty())
+ if (RegsToSpill.empty())
return;
// Update LiveStacks now that we are committed to spilling.