aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/InlineSpiller.cpp
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 /lib/CodeGen/InlineSpiller.cpp
parent9eae80051b6f6f5564b725221b2163a1f0d83672 (diff)
downloadexternal_llvm-c1d22d8adbd40c3e5d704fdae90f9ed2089bb67e.zip
external_llvm-c1d22d8adbd40c3e5d704fdae90f9ed2089bb67e.tar.gz
external_llvm-c1d22d8adbd40c3e5d704fdae90f9ed2089bb67e.tar.bz2
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
Diffstat (limited to 'lib/CodeGen/InlineSpiller.cpp')
-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 f1b9aaf..f56cb48 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.