diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/GCNRegPressure.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/GCNRegPressure.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp index d593204cba059..86a3cb9af32fa 100644 --- a/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp +++ b/llvm/lib/Target/AMDGPU/GCNRegPressure.cpp @@ -5,6 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// +/// +/// \file +/// This file implements the GCNRegPressure class. +/// +//===----------------------------------------------------------------------===// #include "GCNRegPressure.h" #include "AMDGPUSubtarget.h" @@ -98,7 +103,8 @@ void GCNRegPressure::inc(unsigned Reg, LaneBitmask PrevMask, LaneBitmask NewMask, const MachineRegisterInfo &MRI) { - if (NewMask == PrevMask) + if (SIRegisterInfo::getNumCoveredRegs(NewMask) == + SIRegisterInfo::getNumCoveredRegs(PrevMask)) return; int Sign = 1; @@ -106,25 +112,21 @@ void GCNRegPressure::inc(unsigned Reg, std::swap(NewMask, PrevMask); Sign = -1; } -#ifndef NDEBUG - const auto MaxMask = MRI.getMaxLaneMaskForVReg(Reg); -#endif + switch (auto Kind = getRegKind(Reg, MRI)) { case SGPR32: case VGPR32: case AGPR32: - assert(PrevMask.none() && NewMask == MaxMask); Value[Kind] += Sign; break; case SGPR_TUPLE: case VGPR_TUPLE: case AGPR_TUPLE: - assert(NewMask < MaxMask || NewMask == MaxMask); assert(PrevMask < NewMask); Value[Kind == SGPR_TUPLE ? SGPR32 : Kind == AGPR_TUPLE ? AGPR32 : VGPR32] += - Sign * (~PrevMask & NewMask).getNumLanes(); + Sign * SIRegisterInfo::getNumCoveredRegs(~PrevMask & NewMask); if (PrevMask.none()) { assert(NewMask.any()); @@ -216,7 +218,7 @@ static LaneBitmask getUsedRegMask(const MachineOperand &MO, return MRI.getTargetRegisterInfo()->getSubRegIndexLaneMask(SubReg); auto MaxMask = MRI.getMaxLaneMaskForVReg(MO.getReg()); - if (MaxMask == LaneBitmask::getLane(0)) // cannot have subregs + if (SIRegisterInfo::getNumCoveredRegs(MaxMask) > 1) // cannot have subregs return MaxMask; // For a tentative schedule LIS isn't updated yet but livemask should remain @@ -327,8 +329,9 @@ void GCNUpwardRPTracker::recede(const MachineInstr &MI) { // update max pressure MaxPressure = max(AtMIPressure, MaxPressure); - for (const auto &MO : MI.defs()) { - if (!MO.isReg() || !Register::isVirtualRegister(MO.getReg()) || MO.isDead()) + for (const auto &MO : MI.operands()) { + if (!MO.isReg() || !MO.isDef() || + !Register::isVirtualRegister(MO.getReg()) || MO.isDead()) continue; auto Reg = MO.getReg(); @@ -403,8 +406,8 @@ void GCNDownwardRPTracker::advanceToNext() { LastTrackedMI = &*NextMI++; // Add new registers or mask bits. - for (const auto &MO : LastTrackedMI->defs()) { - if (!MO.isReg()) + for (const auto &MO : LastTrackedMI->operands()) { + if (!MO.isReg() || !MO.isDef()) continue; Register Reg = MO.getReg(); if (!Register::isVirtualRegister(Reg)) |