From 9e1899daa873ba62acc1d81e7f7b60bd454a6e36 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 02:39:14 +0000 Subject: [PATCH 01/10] Override stack threshold --- .../include/llvm/CodeGen/TargetFrameLowering.h | 4 ++++ llvm/lib/CodeGen/PrologEpilogInserter.cpp | 2 +- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 7 +++++++ llvm/lib/Target/PowerPC/PPCFrameLowering.h | 2 ++ llvm/test/CodeGen/PowerPC/warn-on-size.ll | 18 ++++++++++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/PowerPC/warn-on-size.ll diff --git a/llvm/include/llvm/CodeGen/TargetFrameLowering.h b/llvm/include/llvm/CodeGen/TargetFrameLowering.h index 94de30461547e..35551d45af43a 100644 --- a/llvm/include/llvm/CodeGen/TargetFrameLowering.h +++ b/llvm/include/llvm/CodeGen/TargetFrameLowering.h @@ -102,6 +102,10 @@ class TargetFrameLowering { /// Align getStackAlign() const { return StackAlignment; } + /// getStackThreshold - Return the maximum stack size + /// + virtual uint64_t getStackThreshold() const { return UINT_MAX; } + /// alignSPAdjust - This method aligns the stack adjustment to the correct /// alignment. /// diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index fe88a360e832f..6c8be5cff7536 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -293,7 +293,7 @@ bool PEI::runOnMachineFunction(MachineFunction &MF) { MachineFrameInfo &MFI = MF.getFrameInfo(); uint64_t StackSize = MFI.getStackSize(); - unsigned Threshold = UINT_MAX; + uint64_t Threshold = TFI->getStackThreshold(); if (MF.getFunction().hasFnAttribute("warn-stack-size")) { bool Failed = MF.getFunction() .getFnAttribute("warn-stack-size") diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index d5e4ae34dde73..ec0be7570a2f3 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2740,3 +2740,10 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { return false; return !MF.getSubtarget().is32BitELFABI(); } + +uint64_t PPCFrameLowering::getStackThreshold() const { + if (Subtarget.isPPC64()) + return 1UL << 63; + + return TargetFrameLowering::getStackThreshold(); +} diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.h b/llvm/lib/Target/PowerPC/PPCFrameLowering.h index 21883b19a5755..e19087ce0e186 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.h +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.h @@ -173,6 +173,8 @@ class PPCFrameLowering: public TargetFrameLowering { /// function prologue/epilogue. bool canUseAsPrologue(const MachineBasicBlock &MBB) const override; bool canUseAsEpilogue(const MachineBasicBlock &MBB) const override; + + uint64_t getStackThreshold() const override; }; } // End llvm namespace diff --git a/llvm/test/CodeGen/PowerPC/warn-on-size.ll b/llvm/test/CodeGen/PowerPC/warn-on-size.ll new file mode 100644 index 0000000000000..dfae232693944 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/warn-on-size.ll @@ -0,0 +1,18 @@ +; RUN: llc -mtriple=powerpc64-unknown-unknown < %s 2>&1 | FileCheck %s +; RUN: llc -mtriple=powerpc64le-unknown-unknown < %s 2>&1 | FileCheck %s + +; CHECK-NOT: warning +; CHECK-Label: large_stack +define i8* @large_stack() { + %s = alloca [281474976710656 x i8], align 1 + %e = getelementptr i8, i8* %s, i64 0 + ret i8* %e +} + +; CHECK: warning: {{.*}} stack frame size {{.*}} exceeds limit (4294967295) in function 'warn_on_large_stack' +; CHECK-Label: warn_on_large_stack +define i8* @warn_on_large_stack() "warn-stack-size"="4294967295" { + %s = alloca [281474976710656 x i8], align 1 + %e = getelementptr i8, i8* %s, i64 0 + ret i8* %e +} From 0f9ea07d6157ed1f81b9b3c8a41ef4ca108ab620 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 02:50:12 +0000 Subject: [PATCH 02/10] Correct test --- llvm/test/CodeGen/PowerPC/warn-on-size.ll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/test/CodeGen/PowerPC/warn-on-size.ll b/llvm/test/CodeGen/PowerPC/warn-on-size.ll index dfae232693944..3d56302bb6b89 100644 --- a/llvm/test/CodeGen/PowerPC/warn-on-size.ll +++ b/llvm/test/CodeGen/PowerPC/warn-on-size.ll @@ -1,16 +1,14 @@ ; RUN: llc -mtriple=powerpc64-unknown-unknown < %s 2>&1 | FileCheck %s ; RUN: llc -mtriple=powerpc64le-unknown-unknown < %s 2>&1 | FileCheck %s -; CHECK-NOT: warning -; CHECK-Label: large_stack +; CHECK-NOT: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'large_stack' define i8* @large_stack() { %s = alloca [281474976710656 x i8], align 1 %e = getelementptr i8, i8* %s, i64 0 ret i8* %e } -; CHECK: warning: {{.*}} stack frame size {{.*}} exceeds limit (4294967295) in function 'warn_on_large_stack' -; CHECK-Label: warn_on_large_stack +; CHECK: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'warn_on_large_stack' define i8* @warn_on_large_stack() "warn-stack-size"="4294967295" { %s = alloca [281474976710656 x i8], align 1 %e = getelementptr i8, i8* %s, i64 0 From 8e2eba74f1b1149d48dec7c37e433bc62c5f2dd2 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 02:52:05 +0000 Subject: [PATCH 03/10] Rename --- llvm/test/CodeGen/PowerPC/{warn-on-size.ll => warn-stack-size.ll} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename llvm/test/CodeGen/PowerPC/{warn-on-size.ll => warn-stack-size.ll} (100%) diff --git a/llvm/test/CodeGen/PowerPC/warn-on-size.ll b/llvm/test/CodeGen/PowerPC/warn-stack-size.ll similarity index 100% rename from llvm/test/CodeGen/PowerPC/warn-on-size.ll rename to llvm/test/CodeGen/PowerPC/warn-stack-size.ll From 07084a9ecefd44040b111f075a5ff5ac924c5189 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 05:13:45 +0000 Subject: [PATCH 04/10] Use opaque pointer --- llvm/test/CodeGen/PowerPC/warn-stack-size.ll | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/llvm/test/CodeGen/PowerPC/warn-stack-size.ll b/llvm/test/CodeGen/PowerPC/warn-stack-size.ll index 3d56302bb6b89..03a4aa7e0db95 100644 --- a/llvm/test/CodeGen/PowerPC/warn-stack-size.ll +++ b/llvm/test/CodeGen/PowerPC/warn-stack-size.ll @@ -2,15 +2,15 @@ ; RUN: llc -mtriple=powerpc64le-unknown-unknown < %s 2>&1 | FileCheck %s ; CHECK-NOT: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'large_stack' -define i8* @large_stack() { +define ptr @large_stack() { %s = alloca [281474976710656 x i8], align 1 - %e = getelementptr i8, i8* %s, i64 0 - ret i8* %e + %e = getelementptr i8, ptr %s, i64 0 + ret ptr %e } ; CHECK: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'warn_on_large_stack' -define i8* @warn_on_large_stack() "warn-stack-size"="4294967295" { +define ptr @warn_on_large_stack() "warn-stack-size"="4294967295" { %s = alloca [281474976710656 x i8], align 1 - %e = getelementptr i8, i8* %s, i64 0 - ret i8* %e + %e = getelementptr i8, ptr %s, i64 0 + ret ptr %e } From 070b0a460ae1c28eaf74389b5838cf38917be701 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 05:22:37 +0000 Subject: [PATCH 05/10] Correct upper bound by using LONG_MAX --- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index ec0be7570a2f3..50b48ac63c763 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2743,7 +2743,7 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { uint64_t PPCFrameLowering::getStackThreshold() const { if (Subtarget.isPPC64()) - return 1UL << 63; + return LONG_MAX; return TargetFrameLowering::getStackThreshold(); } From f974a9e6af2caa5caa3165bd4be471b93a77b58b Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Thu, 7 Sep 2023 05:37:15 +0000 Subject: [PATCH 06/10] Still use 1UL<<63 --- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index 50b48ac63c763..990f80c7fb3f1 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2742,8 +2742,9 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { } uint64_t PPCFrameLowering::getStackThreshold() const { + // The scratch register of STUX contains a signed negative 64-bit number. if (Subtarget.isPPC64()) - return LONG_MAX; + return 1UL << 63; return TargetFrameLowering::getStackThreshold(); } From 2a9916dd157f79ed5c8b93fbd00f750e9fe88802 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Fri, 8 Sep 2023 11:15:26 +0800 Subject: [PATCH 07/10] Elaborate more about the maximum stack size on PPC64 --- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index 990f80c7fb3f1..e39c41d9d1587 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2742,7 +2742,9 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { } uint64_t PPCFrameLowering::getStackThreshold() const { - // The scratch register of STUX contains a signed negative 64-bit number. + // The scratch register of STUX contains a signed negative 64-bit number, + // so that the minimum number contained in the scratch register is -2^63, + // thus the maximum stack size is |-2^63| = 2^63. if (Subtarget.isPPC64()) return 1UL << 63; From 826f2d6d9a4e766bcd9cf26b5b5ae28e2f6e07fd Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Fri, 8 Sep 2023 11:32:24 +0800 Subject: [PATCH 08/10] Adjust comment and maximum stack size considering the procedure of stack frame allocation and deallocation --- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index e39c41d9d1587..80a01d2e8262f 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2742,11 +2742,15 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { } uint64_t PPCFrameLowering::getStackThreshold() const { - // The scratch register of STUX contains a signed negative 64-bit number, - // so that the minimum number contained in the scratch register is -2^63, - // thus the maximum stack size is |-2^63| = 2^63. + // On PPC64, we use `stux r1, , r1` to extend the stack; + // use `add r1, r1, ` to release the stack frame. + // Scratch register contains a signed 64-bit number, which is negative + // when extending the stack and is positive when releasing the stack frame. + // To make `stux` and `add` paired, the absolute value of the number contained + // in the scratch register should be the same. Thus the maximum stack size + // is (2^63)-1, i.e., LONG_MAX. if (Subtarget.isPPC64()) - return 1UL << 63; + return LONG_MAX; return TargetFrameLowering::getStackThreshold(); } From 2ebf69bcd3aecbe47545e15970b3063c446fc497 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Fri, 8 Sep 2023 14:28:06 +0800 Subject: [PATCH 09/10] Adjust comment --- llvm/lib/Target/PowerPC/PPCFrameLowering.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp index 80a01d2e8262f..d41861ddcc8c6 100644 --- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -2742,7 +2742,7 @@ bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { } uint64_t PPCFrameLowering::getStackThreshold() const { - // On PPC64, we use `stux r1, , r1` to extend the stack; + // On PPC64, we use `stux r1, r1, ` to extend the stack; // use `add r1, r1, ` to release the stack frame. // Scratch register contains a signed 64-bit number, which is negative // when extending the stack and is positive when releasing the stack frame. From 7e4e584bcf352fda9cca19825eb6ac5248edcea2 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Fri, 8 Sep 2023 14:39:37 +0800 Subject: [PATCH 10/10] Put test cases in huge-frame-size.ll --- llvm/test/CodeGen/PowerPC/huge-frame-size.ll | 17 ++++++++++++++++- llvm/test/CodeGen/PowerPC/warn-stack-size.ll | 16 ---------------- 2 files changed, 16 insertions(+), 17 deletions(-) delete mode 100644 llvm/test/CodeGen/PowerPC/warn-stack-size.ll diff --git a/llvm/test/CodeGen/PowerPC/huge-frame-size.ll b/llvm/test/CodeGen/PowerPC/huge-frame-size.ll index 3b16e1cc9ee44..a3490ca9f48e7 100644 --- a/llvm/test/CodeGen/PowerPC/huge-frame-size.ll +++ b/llvm/test/CodeGen/PowerPC/huge-frame-size.ll @@ -1,9 +1,12 @@ -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-linux-gnu < %s \ ; RUN: 2>&1 | FileCheck --check-prefix=CHECK-LE %s ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff < %s \ ; RUN: 2>&1 | FileCheck --check-prefix=CHECK-BE %s +; CHECK-NOT: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'foo' +; CHECK-NOT: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'large_stack' +; CHECK: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'warn_on_large_stack' + declare void @bar(ptr) define void @foo(i8 %x) { @@ -54,3 +57,15 @@ entry: store volatile i8 %x, ptr %d ret void } + +define ptr @large_stack() { + %s = alloca [281474976710656 x i8], align 1 + %e = getelementptr i8, ptr %s, i64 0 + ret ptr %e +} + +define ptr @warn_on_large_stack() "warn-stack-size"="4294967295" { + %s = alloca [281474976710656 x i8], align 1 + %e = getelementptr i8, ptr %s, i64 0 + ret ptr %e +} diff --git a/llvm/test/CodeGen/PowerPC/warn-stack-size.ll b/llvm/test/CodeGen/PowerPC/warn-stack-size.ll deleted file mode 100644 index 03a4aa7e0db95..0000000000000 --- a/llvm/test/CodeGen/PowerPC/warn-stack-size.ll +++ /dev/null @@ -1,16 +0,0 @@ -; RUN: llc -mtriple=powerpc64-unknown-unknown < %s 2>&1 | FileCheck %s -; RUN: llc -mtriple=powerpc64le-unknown-unknown < %s 2>&1 | FileCheck %s - -; CHECK-NOT: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'large_stack' -define ptr @large_stack() { - %s = alloca [281474976710656 x i8], align 1 - %e = getelementptr i8, ptr %s, i64 0 - ret ptr %e -} - -; CHECK: warning: {{.*}} stack frame size ({{.*}}) exceeds limit (4294967295) in function 'warn_on_large_stack' -define ptr @warn_on_large_stack() "warn-stack-size"="4294967295" { - %s = alloca [281474976710656 x i8], align 1 - %e = getelementptr i8, ptr %s, i64 0 - ret ptr %e -}