Implement PR3495: local spiller optimization. The local spiller can now keep availabi...
[oota-llvm.git] / lib / CodeGen / PrologEpilogInserter.cpp
index 51d3698dc58f7247fa682e1a4c4a8f24b08e08ae..39f96133bd19783ee1796f504989dfd5952a0c50 100644 (file)
@@ -41,6 +41,12 @@ namespace {
       return "Prolog/Epilog Insertion & Frame Finalization";
     }
 
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.addPreservedID(MachineLoopInfoID);
+      AU.addPreservedID(MachineDominatorsID);
+      MachineFunctionPass::getAnalysisUsage(AU);
+    }
+
     /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
     /// frame indexes with appropriate references.
     ///
@@ -50,7 +56,7 @@ namespace {
 
       // Get MachineModuleInfo so that we can track the construction of the
       // frame.
-      if (MachineModuleInfo *MMI = getAnalysisToUpdate<MachineModuleInfo>())
+      if (MachineModuleInfo *MMI = getAnalysisIfAvailable<MachineModuleInfo>())
         Fn.getFrameInfo()->setMachineModuleInfo(MMI);
 
       // Allow the target machine to make some adjustments to the function
@@ -300,6 +306,32 @@ void PEI::saveCalleeSavedRegisters(MachineFunction &Fn) {
     }
 }
 
+/// AdjustStackOffset - Helper function used to adjust the stack frame offset.
+static inline void
+AdjustStackOffset(MachineFrameInfo *FFI, int FrameIdx,
+                  bool StackGrowsDown, int64_t &Offset,
+                  unsigned &MaxAlign) {
+  // If stack grows down, we need to add size of find the lowest address of the
+  // object.
+  if (StackGrowsDown)
+    Offset += FFI->getObjectSize(FrameIdx);
+
+  unsigned Align = FFI->getObjectAlignment(FrameIdx);
+
+  // If the alignment of this object is greater than that of the stack, then
+  // increase the stack alignment to match.
+  MaxAlign = std::max(MaxAlign, Align);
+
+  // Adjust to alignment boundary.
+  Offset = (Offset + Align - 1) / Align * Align;
+
+  if (StackGrowsDown) {
+    FFI->setObjectOffset(FrameIdx, -Offset); // Set the computed offset
+  } else {
+    FFI->setObjectOffset(FrameIdx, Offset);
+    Offset += FFI->getObjectSize(FrameIdx);
+  }
+}
 
 /// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
 /// abstract stack objects.
@@ -381,25 +413,16 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
   const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
   if (RS && RegInfo->hasFP(Fn)) {
     int SFI = RS->getScavengingFrameIndex();
-    if (SFI >= 0) {
-      // If stack grows down, we need to add size of the lowest
-      // address of the object.
-      if (StackGrowsDown)
-        Offset += FFI->getObjectSize(SFI);
-
-      unsigned Align = FFI->getObjectAlignment(SFI);
-      // Adjust to alignment boundary
-      Offset = (Offset+Align-1)/Align*Align;
-
-      if (StackGrowsDown) {
-        FFI->setObjectOffset(SFI, -Offset);        // Set the computed offset
-      } else {
-        FFI->setObjectOffset(SFI, Offset);
-        Offset += FFI->getObjectSize(SFI);
-      }
-    }
+    if (SFI >= 0)
+      AdjustStackOffset(FFI, SFI, StackGrowsDown, Offset, MaxAlign);
   }
 
+  // Make sure that the stack protector comes before the local variables on the
+  // stack.
+  if (FFI->getStackProtectorIndex() >= 0)
+    AdjustStackOffset(FFI, FFI->getStackProtectorIndex(), StackGrowsDown,
+                      Offset, MaxAlign);
+
   // Then assign frame offsets to stack objects that are not used to spill
   // callee saved registers.
   for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
@@ -409,51 +432,18 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
       continue;
     if (FFI->isDeadObjectIndex(i))
       continue;
+    if (FFI->getStackProtectorIndex() == (int)i)
+      continue;
 
-    // If stack grows down, we need to add size of find the lowest
-    // address of the object.
-    if (StackGrowsDown)
-      Offset += FFI->getObjectSize(i);
-
-    unsigned Align = FFI->getObjectAlignment(i);
-    // If the alignment of this object is greater than that of the stack, then
-    // increase the stack alignment to match.
-    MaxAlign = std::max(MaxAlign, Align);
-    // Adjust to alignment boundary
-    Offset = (Offset+Align-1)/Align*Align;
-
-    if (StackGrowsDown) {
-      FFI->setObjectOffset(i, -Offset);        // Set the computed offset
-    } else {
-      FFI->setObjectOffset(i, Offset);
-      Offset += FFI->getObjectSize(i);
-    }
+    AdjustStackOffset(FFI, i, StackGrowsDown, Offset, MaxAlign);
   }
 
   // Make sure the special register scavenging spill slot is closest to the
   // stack pointer.
   if (RS && !RegInfo->hasFP(Fn)) {
     int SFI = RS->getScavengingFrameIndex();
-    if (SFI >= 0) {
-      // If stack grows down, we need to add size of find the lowest
-      // address of the object.
-      if (StackGrowsDown)
-        Offset += FFI->getObjectSize(SFI);
-
-      unsigned Align = FFI->getObjectAlignment(SFI);
-      // If the alignment of this object is greater than that of the
-      // stack, then increase the stack alignment to match.
-      MaxAlign = std::max(MaxAlign, Align);
-      // Adjust to alignment boundary
-      Offset = (Offset+Align-1)/Align*Align;
-
-      if (StackGrowsDown) {
-        FFI->setObjectOffset(SFI, -Offset);        // Set the computed offset
-      } else {
-        FFI->setObjectOffset(SFI, Offset);
-        Offset += FFI->getObjectSize(SFI);
-      }
-    }
+    if (SFI >= 0)
+      AdjustStackOffset(FFI, SFI, StackGrowsDown, Offset, MaxAlign);
   }
 
   // Round up the size to a multiple of the alignment, but only if there are
@@ -554,7 +544,7 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
       bool DoIncr = true;
 
       for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
-        if (MI->getOperand(i).isFrameIndex()) {
+        if (MI->getOperand(i).isFI()) {
           // Some instructions (e.g. inline asm instructions) can have
           // multiple frame indices and/or cause eliminateFrameIndex
           // to insert more than one instruction. We need the register