[llvm] [AMDGPU][GISEL] Marking G_DYN_STACKALLOC AlwaysUniform in uniformity analysis (PR #200390)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 29 05:49:02 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Abhinav Garg (abhigargrepo)
<details>
<summary>Changes</summary>
Mark G_DYN_STACKALLOC as AlwaysUniform in getGenericInstructionUniformity so that RegBankSelect assigns SGPR to the result. This avoids an unnecessary SGPR-to-VGPR copy of the allocation pointer, reducing register pressure.
---
Full diff: https://github.com/llvm/llvm-project/pull/200390.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIInstrInfo.cpp (+4)
- (added) llvm/test/CodeGen/AMDGPU/GlobalISel/dyn-stackalloc-uniformity.mir (+28)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index 2333d2906552f..caacb236fcd1c 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -10941,6 +10941,10 @@ SIInstrInfo::getGenericValueUniformity(const MachineInstr &MI) const {
if (Opcode == TargetOpcode::G_ADDRSPACE_CAST)
return HandleAddrSpaceCast(MI);
+ // G_DYN_STACKALLOC is always uniform as derived from SP (wave-uniform)
+ if (Opcode == TargetOpcode::G_DYN_STACKALLOC)
+ return ValueUniformity::AlwaysUniform;
+
if (auto *GI = dyn_cast<GIntrinsic>(&MI)) {
auto IID = GI->getIntrinsicID();
if (AMDGPU::isIntrinsicSourceOfDivergence(IID))
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/dyn-stackalloc-uniformity.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/dyn-stackalloc-uniformity.mir
new file mode 100644
index 0000000000000..62997d0bbc672
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/dyn-stackalloc-uniformity.mir
@@ -0,0 +1,28 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=amdgpu-regbankselect %s -verify-machineinstrs -o - | FileCheck %s
+
+# Verify that G_DYN_STACKALLOC result is always assigned to SGPR bank,
+# even when the allocation size is divergent (VGPR). The result is derived
+# from the wave-uniform stack pointer.
+
+---
+name: dyn_stackalloc_divergent_size_uniform_result
+legalized: true
+frameInfo:
+ maxAlignment: 4
+stack:
+ - { id: 0, type: variable-sized, alignment: 4 }
+body: |
+ bb.0:
+ liveins: $vgpr0
+
+ ; CHECK-LABEL: name: dyn_stackalloc_divergent_size_uniform_result
+ ; CHECK: liveins: $vgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
+ ; CHECK-NEXT: [[DYN_STACKALLOC:%[0-9]+]]:sgpr(p5) = G_DYN_STACKALLOC [[COPY]](s32), 4
+ ; CHECK-NEXT: S_ENDPGM 0, implicit [[DYN_STACKALLOC]](p5)
+ %0:_(s32) = COPY $vgpr0
+ %1:_(p5) = G_DYN_STACKALLOC %0, 4
+ S_ENDPGM 0, implicit %1
+...
``````````
</details>
https://github.com/llvm/llvm-project/pull/200390
More information about the llvm-commits
mailing list