[llvm] [AMDGPU] Fix SIPreAllocateWWMRegs to reserve AV-class WWM defs (PR #211560)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 07:09:00 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
isVGPR() rejects the unified VGPR+AGPR register class used on gfx90A+, so strict-WWM defs allocated to an AV-class register were left out of WWMReservedRegs and could be clobbered by the post-WWM allocator
---
Full diff: https://github.com/llvm/llvm-project/pull/211560.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp (+1-1)
- (modified) llvm/test/CodeGen/AMDGPU/si-pre-allocate-wwm-regs.mir (+39)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp b/llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp
index 2afd573c94f3f..bf484cef98da4 100644
--- a/llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp
+++ b/llvm/lib/Target/AMDGPU/SIPreAllocateWWMRegs.cpp
@@ -109,7 +109,7 @@ bool SIPreAllocateWWMRegs::processDef(MachineOperand &MO) {
if (Reg.isPhysical())
return false;
- if (!TRI->isVGPR(*MRI, Reg))
+ if (!SIRegisterInfo::hasVGPRs(MRI->getRegClass(Reg)))
return false;
if (VRM->hasPhys(Reg))
diff --git a/llvm/test/CodeGen/AMDGPU/si-pre-allocate-wwm-regs.mir b/llvm/test/CodeGen/AMDGPU/si-pre-allocate-wwm-regs.mir
index bde9ea336fae9..eb825bf80b3e0 100644
--- a/llvm/test/CodeGen/AMDGPU/si-pre-allocate-wwm-regs.mir
+++ b/llvm/test/CodeGen/AMDGPU/si-pre-allocate-wwm-regs.mir
@@ -44,6 +44,45 @@ body: |
...
---
+name: pre_allocate_wwm_regs_strict_av_class
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $sgpr1
+ ; CHECK-LABEL: name: pre_allocate_wwm_regs_strict_av_class
+ ; CHECK: wwmReservedRegs:
+ ; CHECK-NEXT: - '$vgpr0'
+ ; CHECK-NEXT: - '$vgpr1'
+ ; CHECK: liveins: $sgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
+ ; CHECK-NEXT: renamable $sgpr4_sgpr5 = ENTER_STRICT_WWM -1, implicit-def $exec, implicit-def $scc, implicit $exec
+ ; CHECK-NEXT: $vgpr0 = AV_MOV_B32_IMM_PSEUDO 0, implicit $exec
+ ; CHECK-NEXT: dead $vgpr1 = V_MOV_B32_dpp [[DEF]], [[DEF]], 323, 12, 15, 0, implicit $exec
+ ; CHECK-NEXT: $exec = EXIT_STRICT_WWM killed renamable $sgpr4_sgpr5
+ ; CHECK-NEXT: dead [[COPY:%[0-9]+]]:av_32 = COPY $vgpr0
+ ;
+ ; CHECK2-LABEL: name: pre_allocate_wwm_regs_strict_av_class
+ ; CHECK2: wwmReservedRegs:
+ ; CHECK2-NEXT: - '$vgpr0'
+ ; CHECK2-NEXT: - '$vgpr1'
+ ; CHECK2: liveins: $sgpr1
+ ; CHECK2-NEXT: {{ $}}
+ ; CHECK2-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
+ ; CHECK2-NEXT: renamable $sgpr4_sgpr5 = ENTER_STRICT_WWM -1, implicit-def $exec, implicit-def $scc, implicit $exec
+ ; CHECK2-NEXT: $vgpr0 = AV_MOV_B32_IMM_PSEUDO 0, implicit $exec
+ ; CHECK2-NEXT: dead $vgpr1 = V_MOV_B32_dpp [[DEF]], [[DEF]], 323, 12, 15, 0, implicit $exec
+ ; CHECK2-NEXT: $exec = EXIT_STRICT_WWM killed renamable $sgpr4_sgpr5
+ ; CHECK2-NEXT: dead [[COPY:%[0-9]+]]:av_32 = COPY $vgpr0
+ %0:vgpr_32 = IMPLICIT_DEF
+ renamable $sgpr4_sgpr5 = ENTER_STRICT_WWM -1, implicit-def $exec, implicit-def $scc, implicit $exec
+ %1:av_32 = AV_MOV_B32_IMM_PSEUDO 0, implicit $exec
+ %2:vgpr_32 = V_MOV_B32_dpp %0, %0, 323, 12, 15, 0, implicit $exec
+ $exec = EXIT_STRICT_WWM killed renamable $sgpr4_sgpr5
+ %3:av_32 = COPY %1
+...
+---
+
name: pre_allocate_wwm_spill_to_vgpr
tracksRegLiveness: true
body: |
``````````
</details>
https://github.com/llvm/llvm-project/pull/211560
More information about the llvm-commits
mailing list