diff --git a/include/llvm/CodeGen/MachineFrameInfo.h b/include/llvm/CodeGen/MachineFrameInfo.h index c99b5f59c1d..ba5d6ba97eb 100644 --- a/include/llvm/CodeGen/MachineFrameInfo.h +++ b/include/llvm/CodeGen/MachineFrameInfo.h @@ -212,6 +212,10 @@ class MachineFrameInfo { /// target in eliminateFrameIndex(). int64_t LocalFrameBaseOffset; + /// Required alignment of the local object blob, which is the strictest + /// alignment of any object in it. + unsigned LocalFrameMaxAlign; + public: explicit MachineFrameInfo(const TargetFrameInfo &tfi) : TFI(tfi) { StackSize = NumFixedObjects = OffsetAdjustment = MaxAlignment = 0; @@ -225,6 +229,7 @@ public: CSIValid = false; LocalFrameSize = 0; LocalFrameBaseOffset = 0; + LocalFrameMaxAlign = 0; } /// hasStackObjects - Return true if there are any stack objects in this @@ -302,6 +307,15 @@ public: /// getLocalFrameSize - Get the size of the local object blob. int64_t getLocalFrameSize() const { return LocalFrameSize; } + /// setLocalFrameMaxAlign - Required alignment of the local object blob, + /// which is the strictest alignment of any object in it. + void setLocalFrameMaxAlign(unsigned Align) { LocalFrameMaxAlign = Align; } + + /// getLocalFrameMaxAlign - Return the required alignment of the local + /// object blob. + unsigned getLocalFrameMaxAlign() { return LocalFrameMaxAlign; } + + /// isObjectPreAllocated - Return true if the object was pre-allocated into /// the local block. bool isObjectPreAllocated(int ObjectIdx) const { diff --git a/lib/CodeGen/LocalStackSlotAllocation.cpp b/lib/CodeGen/LocalStackSlotAllocation.cpp index 8cacc179fa0..75498ed8e5a 100644 --- a/lib/CodeGen/LocalStackSlotAllocation.cpp +++ b/lib/CodeGen/LocalStackSlotAllocation.cpp @@ -99,7 +99,7 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) { // Loop over all of the stack objects, assigning sequential addresses... MachineFrameInfo *MFI = Fn.getFrameInfo(); int64_t Offset = 0; - unsigned MaxAlign = MFI->getMaxAlignment(); + unsigned MaxAlign = 0; // Make sure that the stack protector comes before the local variables on the // stack. @@ -134,33 +134,7 @@ void LocalStackSlotPass::calculateFrameObjectOffsets(MachineFunction &Fn) { AdjustStackOffset(MFI, i, Offset, MaxAlign); } - const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo(); - if (!RegInfo->targetHandlesStackFrameRounding()) { - // If we have reserved argument space for call sites in the function - // immediately on entry to the current function, count it as part of the - // overall stack size. - if (MFI->adjustsStack() && RegInfo->hasReservedCallFrame(Fn)) - Offset += MFI->getMaxCallFrameSize(); - - // Round up the size to a multiple of the alignment. If the function has - // any calls or alloca's, align to the target's StackAlignment value to - // ensure that the callee's frame or the alloca data is suitably aligned; - // otherwise, for leaf functions, align to the TransientStackAlignment - // value. - unsigned StackAlign; - if (MFI->adjustsStack() || MFI->hasVarSizedObjects() || - (RegInfo->needsStackRealignment(Fn) && MFI->getObjectIndexEnd() != 0)) - StackAlign = TFI.getStackAlignment(); - else - StackAlign = TFI.getTransientStackAlignment(); - - // If the frame pointer is eliminated, all frame offsets will be relative to - // SP not FP. Align to MaxAlign so this works. - StackAlign = std::max(StackAlign, MaxAlign); - unsigned AlignMask = StackAlign - 1; - Offset = (Offset + AlignMask) & ~uint64_t(AlignMask); - } - // Remember how big this blob of stack space is MFI->setLocalFrameSize(Offset); + MFI->setLocalFrameMaxAlign(MaxAlign); } diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp index 8f1d3a6da61..83aa0c44d78 100644 --- a/lib/CodeGen/PrologEpilogInserter.cpp +++ b/lib/CodeGen/PrologEpilogInserter.cpp @@ -556,10 +556,20 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign); } - // Store the offset of the start of the local allocation block. This - // will be used later when resolving frame base virtual register pseudos. - MFI->setLocalFrameBaseOffset(Offset); + // FIXME: Once this is working, then enable flag will change to a target + // 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) { + unsigned Align = MFI->getLocalFrameMaxAlign(); + + // Adjust to alignment boundary. + Offset = (Offset + Align - 1) / Align * Align; + + // Store the offset of the start of the local allocation block. This + // will be used later when resolving frame base virtual register pseudos. + MFI->setLocalFrameBaseOffset(Offset); + // Allocate the local block Offset += MFI->getLocalFrameSize(); @@ -571,10 +581,6 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) { AdjustStackOffset(MFI, Entry.first, StackGrowsDown, FIOffset, MaxAlign); } } - // FIXME: Allocate locals. Once the block allocation pass is turned on, - // this simplifies to just the second loop, since all of the large objects - // will have already been handled. The second loop can also simplify a - // bit, as the conditionals inside aren't all necessary. // Make sure that the stack protector comes before the local variables on the // stack.