[llvm-branch-commits] [llvm] [AMDGPU] Physical register tracking in GCN trackers. (PR #184275)

Matt Arsenault via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Mar 3 02:19:09 PST 2026


================
@@ -471,6 +493,77 @@ LaneBitmask llvm::getLiveLaneMask(unsigned Reg, SlotIndex SI,
   return getLiveLaneMask(LIS.getInterval(Reg), SI, MRI, LaneMaskFilter);
 }
 
+bool GCNRPTracker::isUnitLiveAt(MCRegUnit Unit, SlotIndex SI) const {
+  const LiveRange *LR = LIS.getCachedRegUnit(Unit);
+  if (!LR)
+    return false;
+  return LR->liveAt(SI);
+}
+
+bool GCNRPTracker::allRegUnitsLive(Register Reg) const {
+  assert(MRI && "MRI not initialized");
+  const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();
+  return llvm::all_of(TRI->regunits(Reg), [&](MCRegUnit Unit) {
+    return PhysLiveRegs.contains(VirtRegOrUnit(Unit)).any();
+  });
+}
+
+bool GCNRPTracker::checkRegKilled(Register Reg, SlotIndex SI) const {
+  assert(MRI && "MRI not initialized");
+  const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();
+  return llvm::any_of(TRI->regunits(Reg), [&](MCRegUnit Unit) {
+    return PhysLiveRegs.contains(VirtRegOrUnit(Unit)).any() &&
+           !isUnitLiveAt(Unit, SI);
+  });
+}
+
+bool GCNRPTracker::eraseKilledUnits(Register Reg, SlotIndex SI) {
+  assert(MRI && "MRI not initialized");
+  const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();
+  bool IsKilled = false;
+  for (MCRegUnit Unit : TRI->regunits(Reg)) {
+    VirtRegOrUnit VRU(Unit);
+    LaneBitmask PrevMask = PhysLiveRegs.contains(VRU);
+    if (PrevMask.any()) {
+      if (!isUnitLiveAt(Unit, SI)) {
+        IsKilled = true;
+        PhysLiveRegs.erase(VRegMaskOrUnit(VRU, LaneBitmask::getAll()));
+      }
+    }
+  }
+  return IsKilled;
+}
+
+bool GCNRPTracker::eraseAllLiveUnits(Register Reg) {
----------------
arsenm wrote:

```suggestion
bool GCNRPTracker::eraseAllLiveUnits(MCRegister Reg) {
```

https://github.com/llvm/llvm-project/pull/184275


More information about the llvm-branch-commits mailing list