[llvm] [AMDGPU] Fix undef uses miscounted as kills in SIOptimizeVGPRLiveRange (PR #218342)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 01:01:26 PDT 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/218342
None
>From 3575559bc4c5bfcd99133ff2c41b05994da0dd79 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Mon, 24 Aug 2026 09:59:29 +0200
Subject: [PATCH] [AMDGPU] Fix undef uses miscounted as kills in
SIOptimizeVGPRLiveRange
---
.../Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp | 3 +-
...-opt-vgpr-liverange-undef-use-livevars.mir | 84 +++++++++++++++++++
2 files changed, 86 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/AMDGPU/si-opt-vgpr-liverange-undef-use-livevars.mir
diff --git a/llvm/lib/Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp b/llvm/lib/Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp
index bd51ccc2dea78..b682b439a241e 100644
--- a/llvm/lib/Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp
+++ b/llvm/lib/Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp
@@ -220,7 +220,8 @@ void SIOptimizeVGPRLiveRange::findNonPHIUsesInBlock(
Register Reg, MachineBasicBlock *MBB,
SmallVectorImpl<MachineInstr *> &Uses) const {
for (auto &UseMI : MRI->use_nodbg_instructions(Reg)) {
- if (UseMI.getParent() == MBB && !UseMI.isPHI())
+ if (UseMI.getParent() == MBB && !UseMI.isPHI() &&
+ UseMI.readsVirtualRegister(Reg))
Uses.push_back(&UseMI);
}
}
diff --git a/llvm/test/CodeGen/AMDGPU/si-opt-vgpr-liverange-undef-use-livevars.mir b/llvm/test/CodeGen/AMDGPU/si-opt-vgpr-liverange-undef-use-livevars.mir
new file mode 100644
index 0000000000000..efff02bc0aea7
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/si-opt-vgpr-liverange-undef-use-livevars.mir
@@ -0,0 +1,84 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize64 -run-pass=livevars,si-opt-vgpr-liverange,phi-node-elimination -verify-machineinstrs -o - %s | FileCheck %s
+
+# The undef use of %1 in bb.2 must not count as a kill, or PHI elimination
+# leaves bb.1 in AliveBlocks for %1 and the verifier rejects it.
+
+---
+name: phi_src_undef_use_in_then
+tracksRegLiveness: true
+body: |
+ ; CHECK-LABEL: name: phi_src_undef_use_in_then
+ ; CHECK: bb.0:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: liveins: $vgpr0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0
+ ; CHECK-NEXT: [[REG_SEQUENCE:%[0-9]+]]:vreg_64 = REG_SEQUENCE [[COPY]], %subreg.sub0, [[COPY]], %subreg.sub1
+ ; CHECK-NEXT: [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_NE_U32_e64 0, [[COPY]], implicit $exec
+ ; CHECK-NEXT: S_BRANCH %bb.1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.1:
+ ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY killed [[REG_SEQUENCE]]
+ ; CHECK-NEXT: [[SI_IF:%[0-9]+]]:sreg_64 = SI_IF killed [[V_CMP_NE_U32_e64_]], %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ ; CHECK-NEXT: S_BRANCH %bb.2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.2:
+ ; CHECK-NEXT: successors: %bb.3(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: dead [[INSERT_SUBREG:%[0-9]+]]:vreg_64 = INSERT_SUBREG undef [[REG_SEQUENCE]], killed [[COPY]], %subreg.sub1
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = IMPLICIT_DEF
+ ; CHECK-NEXT: S_BRANCH %bb.3
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.3:
+ ; CHECK-NEXT: successors: %bb.4(0x40000000), %bb.5(0x40000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY killed [[COPY1]]
+ ; CHECK-NEXT: [[DEF:%[0-9]+]]:vreg_64 = IMPLICIT_DEF
+ ; CHECK-NEXT: [[SI_ELSE:%[0-9]+]]:sreg_64 = SI_ELSE killed [[SI_IF]], %bb.5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ ; CHECK-NEXT: S_BRANCH %bb.4
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.4:
+ ; CHECK-NEXT: successors: %bb.5(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[DEF:%[0-9]+]]:vreg_64 = COPY killed [[COPY2]]
+ ; CHECK-NEXT: S_BRANCH %bb.5
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.5:
+ ; CHECK-NEXT: SI_END_CF killed [[SI_ELSE]], implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vreg_64 = COPY killed [[DEF]]
+ ; CHECK-NEXT: S_ENDPGM 0, implicit killed [[COPY3]]
+ bb.0:
+ liveins: $vgpr0
+
+ %0:vgpr_32 = COPY killed $vgpr0
+ %1:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, %0, %subreg.sub1
+ %2:sreg_64 = V_CMP_NE_U32_e64 0, %0, implicit $exec
+ S_BRANCH %bb.1
+
+ bb.1:
+ successors: %bb.2, %bb.3
+
+ %3:sreg_64 = SI_IF killed %2, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_BRANCH %bb.2
+
+ bb.2:
+ dead %4:vreg_64 = INSERT_SUBREG undef %1, %0, %subreg.sub1
+ S_BRANCH %bb.3
+
+ bb.3:
+ successors: %bb.4, %bb.5
+
+ %5:sreg_64 = SI_ELSE killed %3, %bb.5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_BRANCH %bb.4
+
+ bb.4:
+ S_BRANCH %bb.5
+
+ bb.5:
+ %6:vreg_64 = PHI undef %7:vreg_64, %bb.3, %1, %bb.4
+ SI_END_CF killed %5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
+ S_ENDPGM 0, implicit %6
+...
More information about the llvm-commits
mailing list