aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/InlineSpiller.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-20 05:44:58 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-03-20 05:44:58 +0000
commit682eed0da8e42770a0e694390ba929fd4d241657 (patch)
treefda2d3c839def1967bef096138d8ad6e9937c409 /lib/CodeGen/InlineSpiller.cpp
parent01a46c82e0b58f6c2d562282538556159806c4fe (diff)
downloadexternal_llvm-682eed0da8e42770a0e694390ba929fd4d241657.zip
external_llvm-682eed0da8e42770a0e694390ba929fd4d241657.tar.gz
external_llvm-682eed0da8e42770a0e694390ba929fd4d241657.tar.bz2
Also eliminate redundant spills downstream of inserted reloads.
This can happen when multiple sibling registers are spilled after live range splitting. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127965 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/InlineSpiller.cpp')
-rw-r--r--lib/CodeGen/InlineSpiller.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/CodeGen/InlineSpiller.cpp b/lib/CodeGen/InlineSpiller.cpp
index 3e2adfb..78a6ca6 100644
--- a/lib/CodeGen/InlineSpiller.cpp
+++ b/lib/CodeGen/InlineSpiller.cpp
@@ -466,6 +466,7 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
/// eliminateRedundantSpills - SLI:VNI is known to be on the stack. Remove any
/// redundant spills of this value in SLI.reg and sibling copies.
void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
+ assert(VNI && "Missing value");
SmallVector<std::pair<LiveInterval*, VNInfo*>, 8> WorkList;
WorkList.push_back(std::make_pair(&SLI, VNI));
LiveInterval &StackInt = LSS.getInterval(StackSlot);
@@ -793,15 +794,22 @@ void InlineSpiller::spillAroundUses(unsigned Reg) {
// Check for a sibling copy.
unsigned SibReg = isFullCopyOf(MI, Reg);
- if (!isSibling(SibReg))
- SibReg = 0;
-
- // Hoist the spill of a sib-reg copy.
- if (SibReg && Writes && !Reads && hoistSpill(OldLI, MI)) {
- // This COPY is now dead, the value is already in the stack slot.
- MI->getOperand(0).setIsDead();
- DeadDefs.push_back(MI);
- continue;
+ if (SibReg && isSibling(SibReg)) {
+ if (Writes) {
+ // Hoist the spill of a sib-reg copy.
+ if (hoistSpill(OldLI, MI)) {
+ // This COPY is now dead, the value is already in the stack slot.
+ MI->getOperand(0).setIsDead();
+ DeadDefs.push_back(MI);
+ continue;
+ }
+ } else {
+ // This is a reload for a sib-reg copy. Drop spills downstream.
+ SlotIndex Idx = LIS.getInstructionIndex(MI).getDefIndex();
+ LiveInterval &SibLI = LIS.getInterval(SibReg);
+ eliminateRedundantSpills(SibLI, SibLI.getVNInfoAt(Idx));
+ // The COPY will fold to a reload below.
+ }
}
// Attempt to fold memory ops.