Also eliminate redundant spills downstream of inserted reloads.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 20 Mar 2011 05:44:58 +0000 (05:44 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sun, 20 Mar 2011 05:44:58 +0000 (05:44 +0000)
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

lib/CodeGen/InlineSpiller.cpp

index 3e2adfbe24b49095533ab53b47e9c5ed23a35a0a..78a6ca62d9307c06fc993d47004071db05fa68c2 100644 (file)
@@ -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.