[PATCH] D34337: [PPC] Fix two bugs in frame lowering.
Eric Christopher via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 19 00:44:49 PDT 2017
"growing" :)
On Sun, Jun 18, 2017, 6:53 PM Tony Jiang via Phabricator <
reviews at reviews.llvm.org> wrote:
> jtony created this revision.
>
> 1. The available program storage region of the red zone to compilers is
> 288 bytes rather than 244 bytes.
> 1. The formula for negative number alignment calculation should be y = x
> & ~(n-1) rather than y = (x + (n-1)) & ~(n-1).
>
>
> https://reviews.llvm.org/D34337
>
> Files:
> lib/Target/PowerPC/PPCFrameLowering.cpp
> test/CodeGen/PowerPC/svr4-redzone.ll
> test/CodeGen/PowerPC/tailcall1-64.ll
>
>
> Index: test/CodeGen/PowerPC/tailcall1-64.ll
> ===================================================================
> --- test/CodeGen/PowerPC/tailcall1-64.ll
> +++ test/CodeGen/PowerPC/tailcall1-64.ll
> @@ -1,11 +1,14 @@
> ; RUN: llc -relocation-model=static -verify-machineinstrs < %s
> -march=ppc64 -tailcallopt | grep TC_RETURNd8
> +; RUN: llc -relocation-model=static -verify-machineinstrs -march=ppc64 <
> %s | FileCheck %s
> define fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) {
> entry:
> ret i32 %a3
> }
>
> define fastcc i32 @tailcaller(i32 %in1, i32 %in2) {
> entry:
> - %tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32
> %in1, i32 %in2 ) ; <i32> [#uses=1]
> + %tmp11 = tail call fastcc i32 @tailcallee( i32 %in1, i32 %in2, i32
> %in1, i32 %in2 )
> ret i32 %tmp11
> +; CHECK-NOT: stdu
> +; CHECK: b tailcallee
> }
> Index: test/CodeGen/PowerPC/svr4-redzone.ll
> ===================================================================
> --- test/CodeGen/PowerPC/svr4-redzone.ll
> +++ test/CodeGen/PowerPC/svr4-redzone.ll
> @@ -29,11 +29,11 @@
>
> define i8* @bigstack() nounwind {
> entry:
> - %0 = alloca i8, i32 230
> + %0 = alloca i8, i32 290
> ret i8* %0
> }
> ; PPC32-LABEL: bigstack:
> -; PPC32: stwu 1, -240(1)
> +; PPC32: stwu 1, -304(1)
>
> ; PPC64-LABEL: bigstack:
> -; PPC64: stdu 1, -288(1)
> +; PPC64: stdu 1, -352(1)
> Index: lib/Target/PowerPC/PPCFrameLowering.cpp
> ===================================================================
> --- lib/Target/PowerPC/PPCFrameLowering.cpp
> +++ lib/Target/PowerPC/PPCFrameLowering.cpp
> @@ -435,7 +435,7 @@
>
> const PPCRegisterInfo *RegInfo = Subtarget.getRegisterInfo();
>
> - // If we are a leaf function, and use up to 224 bytes of stack space,
> + // If we are a leaf function, and use up to 288 bytes of stack space,
> // don't have a frame pointer, calls, or dynamic alloca then we do not
> need
> // to adjust the stack pointer (we fit in the Red Zone).
> // The 32-bit SVR4 ABI has no Red Zone. However, it can still generate
> @@ -446,7 +446,7 @@
> (Subtarget.isPPC64() || // 32-bit SVR4, no
> stack-
> !Subtarget.isSVR4ABI() || // allocated locals.
> FrameSize == 0) &&
> - FrameSize <= 224 && // Fits in red zone.
> + FrameSize <= 288 && // Fits in red zone.
> !MFI.hasVarSizedObjects() && // No dynamic alloca.
> !MFI.adjustsStack() && // No calls.
> !MustSaveLR(MF, LR) &&
> @@ -1869,8 +1869,12 @@
> }
>
> if (HasVRSaveArea) {
> - // Insert alignment padding, we need 16-byte alignment.
> - LowerBound = (LowerBound - 15) & ~(15);
> + // Insert alignment padding, we need 16-byte alignment. Note: for
> postive
> + // number the alignment formula is : y = x + (n-1) & ~(n-1). But
> since we
> + // are using negative number here (the stack is growning down). We
> should
> + // use formula : y = x & ~(n-1). Where x is the size before aligning,
> n is
> + // the alignment size ( n = 16 here) and y is the size after aligning.
> + LowerBound &= ~(15);
>
> for (unsigned i = 0, e = VRegs.size(); i != e; ++i) {
> int FI = VRegs[i].getFrameIdx();
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170619/bc9ffc6a/attachment.html>
More information about the llvm-commits
mailing list