[llvm] [AMDGPU][NFC] Extract GCNDownwardRPTracker::retireVirtReg (PR #228289)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 1 17:55:58 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Dhruva Chakrabarti (dhruvachak)
<details>
<summary>Changes</summary>
Pull the per-register retirement logic out of advanceBeforeNext() into a helper. The operand reference is replaced by the register argument.
A follow-up change needs to retire dying uses and dead defs at different points in the walk, which requires this logic to be callable from more than one place.
Assisted-by: Cursor/Claude Opus
---
Full diff: https://github.com/llvm/llvm-project/pull/228289.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/GCNRegPressure.cpp (+28-24)
- (modified) llvm/lib/Target/AMDGPU/GCNRegPressure.h (+5)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp
index 8f9362e19bf85..5ceb41cb04b65 100644
--- a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp
@@ -671,6 +671,33 @@ bool GCNDownwardRPTracker::reset(const MachineInstr &MI,
return NextMI != End;
}
+void GCNDownwardRPTracker::retireVirtReg(Register Reg, SlotIndex SI) {
+ const LiveInterval &LI = LIS.getInterval(Reg);
+ if (LI.hasSubRanges()) {
+ auto It = LiveRegs.end();
+ for (const auto &S : LI.subranges()) {
+ if (!S.liveAt(SI)) {
+ if (It == LiveRegs.end()) {
+ It = LiveRegs.find(Reg);
+ if (It == LiveRegs.end())
+ llvm_unreachable("register isn't live");
+ }
+ auto PrevMask = It->second;
+ It->second &= ~S.LaneMask;
+ CurPressure.inc(Reg, PrevMask, It->second, *MRI);
+ }
+ }
+ if (It != LiveRegs.end() && It->second.none())
+ LiveRegs.erase(It);
+ } else if (!LI.liveAt(SI)) {
+ auto It = LiveRegs.find(Reg);
+ if (It == LiveRegs.end())
+ llvm_unreachable("register isn't live");
+ CurPressure.inc(Reg, It->second, LaneBitmask::getNone(), *MRI);
+ LiveRegs.erase(It);
+ }
+}
+
bool GCNDownwardRPTracker::advanceBeforeNext(MachineInstr *MI,
bool UseInternalIterator) {
assert(MRI && "call reset first");
@@ -704,30 +731,7 @@ bool GCNDownwardRPTracker::advanceBeforeNext(MachineInstr *MI,
continue;
if (!SeenRegs.insert(MO.getReg()).second)
continue;
- const LiveInterval &LI = LIS.getInterval(MO.getReg());
- if (LI.hasSubRanges()) {
- auto It = LiveRegs.end();
- for (const auto &S : LI.subranges()) {
- if (!S.liveAt(SI)) {
- if (It == LiveRegs.end()) {
- It = LiveRegs.find(MO.getReg());
- if (It == LiveRegs.end())
- llvm_unreachable("register isn't live");
- }
- auto PrevMask = It->second;
- It->second &= ~S.LaneMask;
- CurPressure.inc(MO.getReg(), PrevMask, It->second, *MRI);
- }
- }
- if (It != LiveRegs.end() && It->second.none())
- LiveRegs.erase(It);
- } else if (!LI.liveAt(SI)) {
- auto It = LiveRegs.find(MO.getReg());
- if (It == LiveRegs.end())
- llvm_unreachable("register isn't live");
- CurPressure.inc(MO.getReg(), It->second, LaneBitmask::getNone(), *MRI);
- LiveRegs.erase(It);
- }
+ retireVirtReg(MO.getReg(), SI);
}
MaxPressure = max(MaxPressure, CurPressure);
diff --git a/llvm/lib/Target/AMDGPU/GCNRegPressure.h b/llvm/lib/Target/AMDGPU/GCNRegPressure.h
index 307b22759f352..f402c85ed9759 100644
--- a/llvm/lib/Target/AMDGPU/GCNRegPressure.h
+++ b/llvm/lib/Target/AMDGPU/GCNRegPressure.h
@@ -407,6 +407,11 @@ class GCNDownwardRPTracker : public GCNRPTracker {
MachineBasicBlock::const_iterator MBBEnd;
+ /// Drop the lanes of \p Reg that are no longer live at \p SI, decreasing
+ /// CurPressure accordingly. \p Reg must be a virtual register that is
+ /// currently tracked as live.
+ void retireVirtReg(Register Reg, SlotIndex SI);
+
public:
GCNDownwardRPTracker(const LiveIntervals &LIS_) : GCNRPTracker(LIS_) {}
``````````
</details>
https://github.com/llvm/llvm-project/pull/228289
More information about the llvm-commits
mailing list