diff options
-rw-r--r-- | llvm/include/llvm/CodeGen/MachineFrameInfo.h | 19 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MachineFunction.cpp | 48 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 3 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/alloc-no-stack-realign-error.ll | 19 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/alloc-no-stack-realign.ll | 2 |
6 files changed, 24 insertions, 70 deletions
diff --git a/llvm/include/llvm/CodeGen/MachineFrameInfo.h b/llvm/include/llvm/CodeGen/MachineFrameInfo.h index 0748b9ab24a..93d77287d7c 100644 --- a/llvm/include/llvm/CodeGen/MachineFrameInfo.h +++ b/llvm/include/llvm/CodeGen/MachineFrameInfo.h @@ -493,23 +493,11 @@ public: return Objects[ObjectIdx+NumFixedObjects].Size == ~0ULL; } - /// CreateStackObjectWithMinAlign - Create a new statically sized stack - /// object, returning a nonnegative identifier to represent it. This function - /// takes a preferred alignment and a minimal alignment. - /// - int CreateStackObjectWithMinAlign(uint64_t Size, unsigned PrefAlignment, - unsigned MinAlignment, bool isSS, - bool MayNeedSP = false, const AllocaInst *Alloca = 0); - /// CreateStackObject - Create a new statically sized stack object, returning - /// a nonnegative identifier to represent it. Will not emit an error when - /// Alignment can't be satisfied. + /// a nonnegative identifier to represent it. /// int CreateStackObject(uint64_t Size, unsigned Alignment, bool isSS, - bool MayNeedSP = false, const AllocaInst *Alloca = 0) { - return CreateStackObjectWithMinAlign(Size, Alignment, 0, isSS, - MayNeedSP, Alloca); - } + bool MayNeedSP = false, const AllocaInst *Alloca = 0); /// CreateSpillStackObject - Create a new statically sized stack object that /// represents a spill slot, returning a nonnegative identifier to represent @@ -529,8 +517,7 @@ public: /// variable sized object is created, whether or not the index returned is /// actually used. /// - int CreateVariableSizedObject(unsigned PrefAlignment, unsigned MinAlignment, - const AllocaInst *Alloca = 0); + int CreateVariableSizedObject(unsigned Alignment); /// getCalleeSavedInfo - Returns a reference to call saved info vector for the /// current function. diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index 1898222005d..5e04f2d8a30 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -466,32 +466,24 @@ void MachineFrameInfo::ensureMaxAlignment(unsigned Align) { } /// clampStackAlignment - Clamp the alignment if requested and emit a warning. -static inline unsigned clampStackAlignment(bool ShouldClamp, unsigned PrefAlign, - unsigned MinAlign, unsigned StackAlign, - const AllocaInst *Alloca = 0) { - if (!ShouldClamp || PrefAlign <= StackAlign) - return PrefAlign; - if (Alloca && MinAlign > StackAlign) - Alloca->getParent()->getContext().emitWarning(Alloca, - "Requested alignment exceeds the stack alignment!"); - else - assert(MinAlign <= StackAlign && - "Requested alignment exceeds the stack alignment!"); +static inline unsigned clampStackAlignment(bool ShouldClamp, unsigned Align, + unsigned StackAlign) { + if (!ShouldClamp || Align <= StackAlign) + return Align; + DEBUG(dbgs() << "Warning: requested alignment " << Align + << " exceeds the stack alignment " << StackAlign + << " when stack realignment is off" << '\n'); return StackAlign; } -/// CreateStackObjectWithMinAlign - Create a new statically sized stack -/// object, returning a nonnegative identifier to represent it. This function -/// takes a preferred alignment and a minimal alignment. +/// CreateStackObject - Create a new statically sized stack object, returning +/// a nonnegative identifier to represent it. /// -int MachineFrameInfo::CreateStackObjectWithMinAlign(uint64_t Size, - unsigned PrefAlignment, unsigned MinAlignment, - bool isSS, bool MayNeedSP, const AllocaInst *Alloca) { +int MachineFrameInfo::CreateStackObject(uint64_t Size, unsigned Alignment, + bool isSS, bool MayNeedSP, const AllocaInst *Alloca) { assert(Size != 0 && "Cannot allocate zero size stack objects!"); - unsigned Alignment = clampStackAlignment( - !TFI.isStackRealignable() || !RealignOption, - PrefAlignment, MinAlignment, - TFI.getStackAlignment(), Alloca); + Alignment = clampStackAlignment(!TFI.isStackRealignable() || !RealignOption, + Alignment, TFI.getStackAlignment()); Objects.push_back(StackObject(Size, Alignment, 0, false, isSS, MayNeedSP, Alloca)); int Index = (int)Objects.size() - NumFixedObjects - 1; @@ -507,8 +499,7 @@ int MachineFrameInfo::CreateStackObjectWithMinAlign(uint64_t Size, int MachineFrameInfo::CreateSpillStackObject(uint64_t Size, unsigned Alignment) { Alignment = clampStackAlignment(!TFI.isStackRealignable() || !RealignOption, - Alignment, 0, - TFI.getStackAlignment()); + Alignment, TFI.getStackAlignment()); CreateStackObject(Size, Alignment, true, false); int Index = (int)Objects.size() - NumFixedObjects - 1; ensureMaxAlignment(Alignment); @@ -520,13 +511,10 @@ int MachineFrameInfo::CreateSpillStackObject(uint64_t Size, /// variable sized object is created, whether or not the index returned is /// actually used. /// -int MachineFrameInfo::CreateVariableSizedObject(unsigned PrefAlignment, - unsigned MinAlignment, const AllocaInst *Alloca) { +int MachineFrameInfo::CreateVariableSizedObject(unsigned Alignment) { HasVarSizedObjects = true; - unsigned Alignment = clampStackAlignment( - !TFI.isStackRealignable() || !RealignOption, - PrefAlignment, MinAlignment, - TFI.getStackAlignment(), Alloca); + Alignment = clampStackAlignment(!TFI.isStackRealignable() || !RealignOption, + Alignment, TFI.getStackAlignment()); Objects.push_back(StackObject(0, Alignment, 0, false, false, true, 0)); ensureMaxAlignment(Alignment); return (int)Objects.size()-NumFixedObjects-1; @@ -547,7 +535,7 @@ int MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset, unsigned StackAlign = TFI.getStackAlignment(); unsigned Align = MinAlign(SPOffset, StackAlign); Align = clampStackAlignment(!TFI.isStackRealignable() || !RealignOption, - Align, 0, TFI.getStackAlignment()); + Align, TFI.getStackAlignment()); Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable, /*isSS*/ false, /*NeedSP*/ false, diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index 229c50be9a1..b46edad7a3d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -95,8 +95,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf) { (TySize >= 8 && isa<ArrayType>(Ty) && cast<ArrayType>(Ty)->getElementType()->isIntegerTy(8))); StaticAllocaMap[AI] = - MF->getFrameInfo()->CreateStackObjectWithMinAlign(TySize, Align, - AI->getAlignment(), false, + MF->getFrameInfo()->CreateStackObject(TySize, Align, false, MayNeedSP, AI); } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index e0d664314a9..405e1e8defb 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -3259,8 +3259,7 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) { // Inform the Frame Information that we have just allocated a variable-sized // object. - FuncInfo.MF->getFrameInfo()->CreateVariableSizedObject(Align ? Align : 1, - I.getAlignment(), &I); + FuncInfo.MF->getFrameInfo()->CreateVariableSizedObject(Align ? Align : 1); } void SelectionDAGBuilder::visitLoad(const LoadInst &I) { diff --git a/llvm/test/CodeGen/ARM/alloc-no-stack-realign-error.ll b/llvm/test/CodeGen/ARM/alloc-no-stack-realign-error.ll deleted file mode 100644 index 9b4d12ae8a8..00000000000 --- a/llvm/test/CodeGen/ARM/alloc-no-stack-realign-error.ll +++ /dev/null @@ -1,19 +0,0 @@ -; RUN: llc < %s -mtriple=armv7-apple-ios -O0 -realign-stack=0 2>&1 | FileCheck %s - -; rdar://12713765 -@T3_retval = common global <16 x float> zeroinitializer, align 16 - -; If alignment for alloc is smaller than or equal to stack alignment, but the -; preferred type alignment is bigger, the alignment will be clamped. -; If alignment for alloca is bigger than stack alignment, the compiler -; will emit a warning. -define void @test(<16 x float>* noalias sret %agg.result) nounwind ssp { -entry: -; CHECK: warning: Requested alignment exceeds the stack alignment! - %retval = alloca <16 x float>, align 16 - %0 = load <16 x float>* @T3_retval, align 16 - store <16 x float> %0, <16 x float>* %retval - %1 = load <16 x float>* %retval - store <16 x float> %1, <16 x float>* %agg.result, align 16 - ret void -} diff --git a/llvm/test/CodeGen/ARM/alloc-no-stack-realign.ll b/llvm/test/CodeGen/ARM/alloc-no-stack-realign.ll index 94adc9c67de..273041dee34 100644 --- a/llvm/test/CodeGen/ARM/alloc-no-stack-realign.ll +++ b/llvm/test/CodeGen/ARM/alloc-no-stack-realign.ll @@ -39,7 +39,7 @@ entry: ; NO-REALIGN: add [[R2:r[0-9]+]], [[R1:r[0-9]+]], #16 ; NO-REALIGN: vst1.64 ; NO-REALIGN: vst1.64 - %retval = alloca <16 x float>, align 4 + %retval = alloca <16 x float>, align 16 %0 = load <16 x float>* @T3_retval, align 16 store <16 x float> %0, <16 x float>* %retval %1 = load <16 x float>* %retval |