[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