[llvm] [AMDGPU] Ignore debug instructions in GPR-index scan distance (PR #224279)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 17 05:28:15 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Yongqiang Tian (yqtian-se)
<details>
<summary>Changes</summary>
## Summary
- exclude debug instructions from `SIPreEmitPeephole`'s bounded search for redundant GPR-index mode transitions
- add a verifier-enabled MIR regression test where `DBG_VALUE` instructions previously exhausted the search distance and left an extra `S_SET_GPR_IDX_OFF`/`S_SET_GPR_IDX_ON` pair
## Testing
- `python3 llvm/utils/update_mir_test_checks.py --llc-binary build/bin/llc llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir`
- `llvm-lit -sv llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir llvm/test/CodeGen/AMDGPU/set-gpr-idx-peephole.mir`
- `ninja check-llvm-codegen-amdgpu` (5057 passed, 6 expectedly failed)
- confirmed the fixed-behavior test fails on the unmodified build
- confirmed the original reproducer changes from 16/24-byte `.text` sections to identical 16-byte sections after the fix
Fixes #<!-- -->224271
AI disclosure: This patch was developed with OpenAI Codex 5.6 Sol and reviewed with Claude.
---
Full diff: https://github.com/llvm/llvm-project/pull/224279.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIPreEmitPeephole.cpp (+2)
- (added) llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir (+55)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIPreEmitPeephole.cpp b/llvm/lib/Target/AMDGPU/SIPreEmitPeephole.cpp
index 9b67cdd6be6f45..53213846d62713 100644
--- a/llvm/lib/Target/AMDGPU/SIPreEmitPeephole.cpp
+++ b/llvm/lib/Target/AMDGPU/SIPreEmitPeephole.cpp
@@ -904,6 +904,8 @@ bool SIPreEmitPeephole::run(MachineFunction &MF, MachineLoopInfo *LoopInfo) {
// Note: this needs to work on bundles as S_SET_GPR_IDX* instructions
// may be bundled with the instructions they modify.
for (auto &MI : make_early_inc_range(MBB.instrs())) {
+ if (MI.isDebugInstr())
+ continue;
if (Count == Threshold)
SetGPRMI = nullptr;
else
diff --git a/llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir b/llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir
new file mode 100644
index 00000000000000..52b27b3e8f7446
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/set-gpr-idx-debug-instr.mir
@@ -0,0 +1,55 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=amdgpu9.00 -run-pass si-pre-emit-peephole -verify-machineinstrs -o - %s | FileCheck %s -implicit-check-not=S_SET_GPR_IDX
+
+---
+name: debug_value_in_between
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: debug_value_in_between
+ ; CHECK: S_SET_GPR_IDX_ON $sgpr2, 1, implicit-def $mode, implicit-def $m0, implicit $mode, implicit undef $m0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0
+ ; CHECK-NEXT: $vgpr16 = V_MOV_B32_indirect_read undef $vgpr1, implicit $exec, implicit $m0, implicit $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
+ ; CHECK-NEXT: $vgpr15 = V_MOV_B32_indirect_read undef $vgpr0, implicit $exec, implicit $m0, implicit killed $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
+ ; CHECK-NEXT: S_SET_GPR_IDX_OFF implicit-def $mode, implicit $mode
+ S_SET_GPR_IDX_ON $sgpr2, 1, implicit-def $mode, implicit-def $m0, implicit $mode, implicit undef $m0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ DBG_VALUE $noreg, 0
+ $vgpr16 = V_MOV_B32_indirect_read undef $vgpr1, implicit $exec, implicit $m0, implicit $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
+ S_SET_GPR_IDX_OFF implicit-def $mode, implicit $mode
+ S_SET_GPR_IDX_ON killed $sgpr2, 1, implicit-def $mode, implicit-def $m0, implicit $mode, implicit undef $m0
+ $vgpr15 = V_MOV_B32_indirect_read undef $vgpr0, implicit $exec, implicit $m0, implicit killed $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
+ S_SET_GPR_IDX_OFF implicit-def $mode, implicit $mode
+...
``````````
</details>
https://github.com/llvm/llvm-project/pull/224279
More information about the llvm-commits
mailing list