[llvm] [PEI][PowerPC] Fix false alarm of stack size limit (PR #65559)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 6 19:50:03 PDT 2023


https://github.com/bzEq created https://github.com/llvm/llvm-project/pull/65559:

PPC64 allows stack size up to 2^63 bytes, current llc reports
```
warning: stack frame size (4294967568) exceeds limit (4294967295) in function 'main'
```
if the stack allocated is larger than 4G.

>From 9e1899daa873ba62acc1d81e7f7b60bd454a6e36 Mon Sep 17 00:00:00 2001
From: Kai Luo <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 02:39:14 +0000
Subject: [PATCH] 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 94de30461547e9d..35551d45af43abe 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 fe88a360e832f31..6c8be5cff75360e 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 d5e4ae34dde73a3..ec0be7570a2f396 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<PPCSubtarget>().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 21883b19a57559f..e19087ce0e18694 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 000000000000000..dfae2326939446f
--- /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
+}



More information about the llvm-commits mailing list