[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