[llvm] a07ace6 - [AMDGPU][NFC] Extract GCNDownwardRPTracker::retireVirtReg (#228289)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 16:46:03 PDT 2026
Author: Dhruva Chakrabarti
Date: 2026-10-02T16:45:56-07:00
New Revision: a07ace6151f5a76944379951a51bc395d17acfd5
URL: https://github.com/llvm/llvm-project/commit/a07ace6151f5a76944379951a51bc395d17acfd5
DIFF: https://github.com/llvm/llvm-project/commit/a07ace6151f5a76944379951a51bc395d17acfd5.diff
LOG: [AMDGPU][NFC] Extract GCNDownwardRPTracker::retireVirtReg (#228289)
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.
https://github.com/llvm/llvm-project/pull/228294 depends on this patch.
Assisted-by: Cursor/Claude Opus
Added:
Modified:
llvm/lib/Target/AMDGPU/GCNRegPressure.cpp
llvm/lib/Target/AMDGPU/GCNRegPressure.h
Removed:
################################################################################
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_) {}
More information about the llvm-commits
mailing list