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

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 7 20:32:41 PDT 2023


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

>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 1/8] 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
+}

>From 0f9ea07d6157ed1f81b9b3c8a41ef4ca108ab620 Mon Sep 17 00:00:00 2001
From: Kai Luo <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 02:50:12 +0000
Subject: [PATCH 2/8] 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 dfae2326939446f..3d56302bb6b8992 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 <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 02:52:05 +0000
Subject: [PATCH 3/8] 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 <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 05:13:45 +0000
Subject: [PATCH 4/8] 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 3d56302bb6b8992..03a4aa7e0db9514 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 <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 05:22:37 +0000
Subject: [PATCH 5/8] 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 ec0be7570a2f396..50b48ac63c7630e 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 <lkail at cn.ibm.com>
Date: Thu, 7 Sep 2023 05:37:15 +0000
Subject: [PATCH 6/8] 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 50b48ac63c7630e..990f80c7fb3f1cf 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 <gluokai at gmail.com>
Date: Fri, 8 Sep 2023 11:15:26 +0800
Subject: [PATCH 7/8] 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 990f80c7fb3f1cf..e39c41d9d1587c2 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 <gluokai at gmail.com>
Date: Fri, 8 Sep 2023 11:32:24 +0800
Subject: [PATCH 8/8] 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 e39c41d9d1587c2..80a01d2e8262f48 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, <scratch_reg>, r1` to extend the stack;
+  // use `add r1, r1, <scratch_reg>` 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();
 }



More information about the llvm-commits mailing list