Update local stack block allocation to let PEI do the allocs if no additional
authorJim Grosbach <grosbach@apple.com>
Thu, 19 Aug 2010 02:47:08 +0000 (02:47 +0000)
committerJim Grosbach <grosbach@apple.com>
Thu, 19 Aug 2010 02:47:08 +0000 (02:47 +0000)
base registers were required. This will allow for slightly better packing
of the locals when alignment padding is necessary after callee saved registers.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111508 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineFrameInfo.h
lib/CodeGen/LocalStackSlotAllocation.cpp
lib/CodeGen/PrologEpilogInserter.cpp

index ba5d6ba97ebf00d8e0163c894113ca992c55e2cd..f8bf14ab018851cffbce025447bf235e60cbc0a0 100644 (file)
@@ -216,6 +216,11 @@ class MachineFrameInfo {
   /// alignment of any object in it.
   unsigned LocalFrameMaxAlign;
 
+  /// Whether the local object blob needs to be allocated together. If not,
+  /// PEI should ignore the isPreAllocated flags on the stack objects and
+  /// just allocate them normally.
+  bool UseLocalStackAllocationBlock;
+
 public:
     explicit MachineFrameInfo(const TargetFrameInfo &tfi) : TFI(tfi) {
     StackSize = NumFixedObjects = OffsetAdjustment = MaxAlignment = 0;
@@ -315,6 +320,17 @@ public:
   /// object blob.
   unsigned getLocalFrameMaxAlign() { return LocalFrameMaxAlign; }
 
+  /// getUseLocalStackAllocationBlock - Get whether the local allocation blob
+  /// should be allocated together or let PEI allocate the locals in it
+  /// directly.
+  bool getUseLocalStackAllocationBlock() {return UseLocalStackAllocationBlock;}
+
+  /// setUseLocalStackAllocationBlock - Set whether the local allocation blob
+  /// should be allocated together or let PEI allocate the locals in it
+  /// directly.
+  void setUseLocalStackAllocationBlock(bool v) {
+    UseLocalStackAllocationBlock = v;
+  }
 
   /// isObjectPreAllocated - Return true if the object was pre-allocated into
   /// the local block.
index b7071dec474b3aa31fdc410b4ec43a23c7cff706..a4a43875ceed5719d5e2608dea68596de6c1292c 100644 (file)
@@ -89,6 +89,13 @@ bool LocalStackSlotPass::runOnMachineFunction(MachineFunction &MF) {
   // Insert virtual base registers to resolve frame index references.
   insertFrameReferenceRegisters(MF);
 
+  // Tell MFI whether any base registers were allocated. PEI will only
+  // want to use the local block allocations from this pass if there were any.
+  // Otherwise, PEI can do a bit better job of getting the alignment right
+  // without a hole at the start since it knows the alignment of the stack
+  // at the start of local allocation, and this pass doesn't.
+  MFI->setUseLocalStackAllocationBlock(NumBaseRegisters > 0);
+
   return true;
 }
 
index 569faceffdc7ae6ea0e8c69ad800bb23745b76a2..4b8a4b5562ff6459c6e54347b24142ba817fee2c 100644 (file)
@@ -560,7 +560,7 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
   // check for whether the frame is large enough to want to use virtual
   // frame index registers. Functions which don't want/need this optimization
   // will continue to use the existing code path.
-  if (EnableLocalStackAlloc && MFI->getLocalFrameSize()) {
+  if (EnableLocalStackAlloc && MFI->getUseLocalStackAllocationBlock()) {
     unsigned Align = MFI->getLocalFrameMaxAlign();
 
     // Adjust to alignment boundary.
@@ -593,7 +593,8 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
 
     // Assign large stack objects first.
     for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
-      if (MFI->isObjectPreAllocated(i))
+      if (MFI->isObjectPreAllocated(i) &&
+          MFI->getUseLocalStackAllocationBlock())
         continue;
       if (i >= MinCSFrameIndex && i <= MaxCSFrameIndex)
         continue;
@@ -614,7 +615,8 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
   // Then assign frame offsets to stack objects that are not used to spill
   // callee saved registers.
   for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
-    if (MFI->isObjectPreAllocated(i))
+    if (MFI->isObjectPreAllocated(i) &&
+        MFI->getUseLocalStackAllocationBlock())
       continue;
     if (i >= MinCSFrameIndex && i <= MaxCSFrameIndex)
       continue;