[llvm] [AMDGPU] Fix excessive stack usage in SIInsertWaitcnts::run (PR #134835)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 8 03:44:12 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Jay Foad (jayfoad)
<details>
<summary>Changes</summary>
Noticed on Windows when running LLVM as part of a graphics driver, with
total stack usage limited to about 128 KB. In some cases this function
would overflow the stack.
On Linux this reduces stack usage in this function from about 32 KB to
about 0.5 KB.
---
Full diff: https://github.com/llvm/llvm-project/pull/134835.diff
1 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp (+9-4)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp b/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp
index 15965f2bac8aa..1ad60212c7d95 100644
--- a/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInsertWaitcnts.cpp
@@ -2623,12 +2623,17 @@ bool SIInsertWaitcnts::run(MachineFunction &MF) {
else
*Brackets = *BI.Incoming;
} else {
- if (!Brackets)
+ if (!Brackets) {
Brackets = std::make_unique<WaitcntBrackets>(
ST, MaxCounter, Limits, WaitEventMaskForInst, SmemAccessCounter);
- else
- *Brackets = WaitcntBrackets(ST, MaxCounter, Limits,
- WaitEventMaskForInst, SmemAccessCounter);
+ } else {
+ // Reinitialize in-place. N.B. do not do this by assigning from a
+ // temporary because the WaitcntBrackets class is large and it could
+ // cause this function to use an unreasonable amount of stack space.
+ Brackets->~WaitcntBrackets();
+ new (Brackets.get()) WaitcntBrackets(
+ ST, MaxCounter, Limits, WaitEventMaskForInst, SmemAccessCounter);
+ }
}
Modified |= insertWaitcntInBlock(MF, *MBB, *Brackets);
``````````
</details>
https://github.com/llvm/llvm-project/pull/134835
More information about the llvm-commits
mailing list