diff options
author | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2017-02-23 20:19:44 +0000 |
---|---|---|
committer | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2017-02-23 20:19:44 +0000 |
commit | ce3ddd2de4c5dbd5a7a68b51ea38f96cf7fbf3aa (patch) | |
tree | 05d2e6754a3580a96a723b01dcd89dcf58eec2bb /llvm/lib/CodeGen | |
parent | 851125dca903fdaa458d87fb0a35349286a2395f (diff) | |
download | bcm5719-llvm-ce3ddd2de4c5dbd5a7a68b51ea38f96cf7fbf3aa.tar.gz bcm5719-llvm-ce3ddd2de4c5dbd5a7a68b51ea38f96cf7fbf3aa.zip |
Correct register pressure calculation in presence of subregs
If a subreg is used in an instruction it counts as a whole superreg
for the purpose of register pressure calculation. This patch corrects
improper register pressure calculation by examining operand's lane mask.
Differential Revision: https://reviews.llvm.org/D29835
llvm-svn: 296009
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/MachineScheduler.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/CodeGen/RegisterPressure.cpp | 42 | ||||
-rw-r--r-- | llvm/lib/CodeGen/TargetRegisterInfo.cpp | 9 |
3 files changed, 42 insertions, 13 deletions
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp index 79b02c7de8c..066398358e8 100644 --- a/llvm/lib/CodeGen/MachineScheduler.cpp +++ b/llvm/lib/CodeGen/MachineScheduler.cpp @@ -1085,7 +1085,7 @@ void ScheduleDAGMILive::updatePressureDiffs( continue; PressureDiff &PDiff = getPressureDiff(&SU); - PDiff.addPressureChange(Reg, Decrement, &MRI); + PDiff.addPressureChange(P, Decrement, &MRI); DEBUG( dbgs() << " UpdateRegP: SU(" << SU.NodeNum << ") " << PrintReg(Reg, TRI) << ':' << PrintLaneMask(P.LaneMask) @@ -1123,7 +1123,7 @@ void ScheduleDAGMILive::updatePressureDiffs( LI.Query(LIS->getInstructionIndex(*SU->getInstr())); if (LRQ.valueIn() == VNI) { PressureDiff &PDiff = getPressureDiff(SU); - PDiff.addPressureChange(Reg, true, &MRI); + PDiff.addPressureChange(P, true, &MRI); DEBUG( dbgs() << " UpdateRegP: SU(" << SU->NodeNum << ") " << *SU->getInstr(); diff --git a/llvm/lib/CodeGen/RegisterPressure.cpp b/llvm/lib/CodeGen/RegisterPressure.cpp index c726edc88b4..b22b36a3607 100644 --- a/llvm/lib/CodeGen/RegisterPressure.cpp +++ b/llvm/lib/CodeGen/RegisterPressure.cpp @@ -46,16 +46,29 @@ using namespace llvm; +/// Clamp lane masks to maximum posible value. +static void clampMasks(const MachineRegisterInfo &MRI, unsigned Reg, + LaneBitmask& LaneMask1, LaneBitmask& LaneMask2) { + if (TargetRegisterInfo::isVirtualRegister(Reg)) { + LaneBitmask Max = MRI.getMaxLaneMaskForVReg(Reg); + LaneMask1 &= Max; + LaneMask2 &= Max; + } +} + /// Increase pressure for each pressure set provided by TargetRegisterInfo. static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure, const MachineRegisterInfo &MRI, unsigned Reg, LaneBitmask PrevMask, LaneBitmask NewMask) { assert((PrevMask & ~NewMask).none() && "Must not remove bits"); - if (PrevMask.any() || NewMask.none()) + + clampMasks(MRI, Reg, PrevMask, NewMask); + if ((NewMask & ~PrevMask).none()) return; + const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo(); + unsigned Weight = TRI->getRegUnitWeight(MRI, Reg, NewMask & ~PrevMask); PSetIterator PSetI = MRI.getPressureSets(Reg); - unsigned Weight = PSetI.getWeight(); for (; PSetI.isValid(); ++PSetI) CurrSetPressure[*PSetI] += Weight; } @@ -65,11 +78,13 @@ static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure, const MachineRegisterInfo &MRI, unsigned Reg, LaneBitmask PrevMask, LaneBitmask NewMask) { //assert((NewMask & !PrevMask) == 0 && "Must not add bits"); - if (NewMask.any() || PrevMask.none()) + clampMasks(MRI, Reg, PrevMask, NewMask); + if ((~NewMask & PrevMask).none()) return; + const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo(); + unsigned Weight = TRI->getRegUnitWeight(MRI, Reg, ~NewMask & PrevMask); PSetIterator PSetI = MRI.getPressureSets(Reg); - unsigned Weight = PSetI.getWeight(); for (; PSetI.isValid(); ++PSetI) { assert(CurrSetPressure[*PSetI] >= Weight && "register pressure underflow"); CurrSetPressure[*PSetI] -= Weight; @@ -139,11 +154,14 @@ void PressureDiff::dump(const TargetRegisterInfo &TRI) const { void RegPressureTracker::increaseRegPressure(unsigned RegUnit, LaneBitmask PreviousMask, LaneBitmask NewMask) { - if (PreviousMask.any() || NewMask.none()) + clampMasks(*MRI, RegUnit, PreviousMask, NewMask); + if ((NewMask & ~PreviousMask).none()) return; + const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo(); + unsigned Weight = TRI->getRegUnitWeight(*MRI, RegUnit, + NewMask & ~PreviousMask); PSetIterator PSetI = MRI->getPressureSets(RegUnit); - unsigned Weight = PSetI.getWeight(); for (; PSetI.isValid(); ++PSetI) { CurrSetPressure[*PSetI] += Weight; P.MaxSetPressure[*PSetI] = @@ -644,17 +662,19 @@ void PressureDiffs::addInstruction(unsigned Idx, PressureDiff &PDiff = (*this)[Idx]; assert(!PDiff.begin()->isValid() && "stale PDiff"); for (const RegisterMaskPair &P : RegOpers.Defs) - PDiff.addPressureChange(P.RegUnit, true, &MRI); + PDiff.addPressureChange(P, true, &MRI); for (const RegisterMaskPair &P : RegOpers.Uses) - PDiff.addPressureChange(P.RegUnit, false, &MRI); + PDiff.addPressureChange(P, false, &MRI); } /// Add a change in pressure to the pressure diff of a given instruction. -void PressureDiff::addPressureChange(unsigned RegUnit, bool IsDec, +void PressureDiff::addPressureChange(RegisterMaskPair P, bool IsDec, const MachineRegisterInfo *MRI) { - PSetIterator PSetI = MRI->getPressureSets(RegUnit); - int Weight = IsDec ? -PSetI.getWeight() : PSetI.getWeight(); + const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo(); + int Weight = (int)TRI->getRegUnitWeight(*MRI, P.RegUnit, P.LaneMask); + PSetIterator PSetI = MRI->getPressureSets(P.RegUnit); + if (IsDec) Weight = -Weight; for (; PSetI.isValid(); ++PSetI) { // Find an existing entry in the pressure diff for this PSet. PressureDiff::iterator I = nonconst_begin(), E = nonconst_end(); diff --git a/llvm/lib/CodeGen/TargetRegisterInfo.cpp b/llvm/lib/CodeGen/TargetRegisterInfo.cpp index 66cdad278e8..0d3f8eb6fb5 100644 --- a/llvm/lib/CodeGen/TargetRegisterInfo.cpp +++ b/llvm/lib/CodeGen/TargetRegisterInfo.cpp @@ -412,6 +412,15 @@ bool TargetRegisterInfo::regmaskSubsetEqual(const uint32_t *mask0, return true; } +/// Get the weight in units of pressure for a sub register of this register +/// unit given a lane mask. +unsigned TargetRegisterInfo::getRegUnitWeight(const MachineRegisterInfo &MRI, + unsigned RegUnit, + LaneBitmask LaneMask) const { + PSetIterator PSetI = MRI.getPressureSets(RegUnit); + return PSetI.getWeight(); +} + #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) LLVM_DUMP_METHOD void TargetRegisterInfo::dumpReg(unsigned Reg, unsigned SubRegIndex, |