diff options
Diffstat (limited to 'llvm/lib/CodeGen/RegisterPressure.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/RegisterPressure.cpp | 116 |
1 files changed, 57 insertions, 59 deletions
diff --git a/llvm/lib/CodeGen/RegisterPressure.cpp b/llvm/lib/CodeGen/RegisterPressure.cpp index 037986ec48af..e8e6db1e3b3b 100644 --- a/llvm/lib/CodeGen/RegisterPressure.cpp +++ b/llvm/lib/CodeGen/RegisterPressure.cpp @@ -95,7 +95,7 @@ void RegisterPressure::dump(const TargetRegisterInfo *TRI) const { dbgs() << "Max Pressure: "; dumpRegSetPressure(MaxSetPressure, TRI); dbgs() << "Live In: "; - for (const RegisterMaskPair &P : LiveInRegs) { + for (const VRegMaskOrUnit &P : LiveInRegs) { dbgs() << printVRegOrUnit(P.RegUnit, TRI); if (!P.LaneMask.all()) dbgs() << ':' << PrintLaneMask(P.LaneMask); @@ -103,7 +103,7 @@ void RegisterPressure::dump(const TargetRegisterInfo *TRI) const { } dbgs() << '\n'; dbgs() << "Live Out: "; - for (const RegisterMaskPair &P : LiveOutRegs) { + for (const VRegMaskOrUnit &P : LiveOutRegs) { dbgs() << printVRegOrUnit(P.RegUnit, TRI); if (!P.LaneMask.all()) dbgs() << ':' << PrintLaneMask(P.LaneMask); @@ -358,7 +358,7 @@ void RegPressureTracker::closeRegion() { void RegPressureTracker::initLiveThru(const RegPressureTracker &RPTracker) { LiveThruPressure.assign(TRI->getNumRegPressureSets(), 0); assert(isBottomClosed() && "need bottom-up tracking to intialize."); - for (const RegisterMaskPair &Pair : P.LiveOutRegs) { + for (const VRegMaskOrUnit &Pair : P.LiveOutRegs) { Register RegUnit = Pair.RegUnit; if (RegUnit.isVirtual() && !RPTracker.hasUntiedDef(RegUnit)) increaseSetPressure(LiveThruPressure, *MRI, RegUnit, @@ -366,9 +366,9 @@ void RegPressureTracker::initLiveThru(const RegPressureTracker &RPTracker) { } } -static LaneBitmask getRegLanes(ArrayRef<RegisterMaskPair> RegUnits, +static LaneBitmask getRegLanes(ArrayRef<VRegMaskOrUnit> RegUnits, Register RegUnit) { - auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { + auto I = llvm::find_if(RegUnits, [RegUnit](const VRegMaskOrUnit Other) { return Other.RegUnit == RegUnit; }); if (I == RegUnits.end()) @@ -376,11 +376,11 @@ static LaneBitmask getRegLanes(ArrayRef<RegisterMaskPair> RegUnits, return I->LaneMask; } -static void addRegLanes(SmallVectorImpl<RegisterMaskPair> &RegUnits, - RegisterMaskPair Pair) { +static void addRegLanes(SmallVectorImpl<VRegMaskOrUnit> &RegUnits, + VRegMaskOrUnit Pair) { Register RegUnit = Pair.RegUnit; assert(Pair.LaneMask.any()); - auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { + auto I = llvm::find_if(RegUnits, [RegUnit](const VRegMaskOrUnit Other) { return Other.RegUnit == RegUnit; }); if (I == RegUnits.end()) { @@ -390,23 +390,23 @@ static void addRegLanes(SmallVectorImpl<RegisterMaskPair> &RegUnits, } } -static void setRegZero(SmallVectorImpl<RegisterMaskPair> &RegUnits, +static void setRegZero(SmallVectorImpl<VRegMaskOrUnit> &RegUnits, Register RegUnit) { - auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { + auto I = llvm::find_if(RegUnits, [RegUnit](const VRegMaskOrUnit Other) { return Other.RegUnit == RegUnit; }); if (I == RegUnits.end()) { - RegUnits.push_back(RegisterMaskPair(RegUnit, LaneBitmask::getNone())); + RegUnits.emplace_back(RegUnit, LaneBitmask::getNone()); } else { I->LaneMask = LaneBitmask::getNone(); } } -static void removeRegLanes(SmallVectorImpl<RegisterMaskPair> &RegUnits, - RegisterMaskPair Pair) { +static void removeRegLanes(SmallVectorImpl<VRegMaskOrUnit> &RegUnits, + VRegMaskOrUnit Pair) { Register RegUnit = Pair.RegUnit; assert(Pair.LaneMask.any()); - auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { + auto I = llvm::find_if(RegUnits, [RegUnit](const VRegMaskOrUnit Other) { return Other.RegUnit == RegUnit; }); if (I != RegUnits.end()) { @@ -480,7 +480,7 @@ class RegisterOperandsCollector { collectOperand(*OperI); // Remove redundant physreg dead defs. - for (const RegisterMaskPair &P : RegOpers.Defs) + for (const VRegMaskOrUnit &P : RegOpers.Defs) removeRegLanes(RegOpers.DeadDefs, P); } @@ -489,7 +489,7 @@ class RegisterOperandsCollector { collectOperandLanes(*OperI); // Remove redundant physreg dead defs. - for (const RegisterMaskPair &P : RegOpers.Defs) + for (const VRegMaskOrUnit &P : RegOpers.Defs) removeRegLanes(RegOpers.DeadDefs, P); } @@ -515,13 +515,12 @@ class RegisterOperandsCollector { } } - void pushReg(Register Reg, - SmallVectorImpl<RegisterMaskPair> &RegUnits) const { + void pushReg(Register Reg, SmallVectorImpl<VRegMaskOrUnit> &RegUnits) const { if (Reg.isVirtual()) { - addRegLanes(RegUnits, RegisterMaskPair(Reg, LaneBitmask::getAll())); + addRegLanes(RegUnits, VRegMaskOrUnit(Reg, LaneBitmask::getAll())); } else if (MRI.isAllocatable(Reg)) { for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg())) - addRegLanes(RegUnits, RegisterMaskPair(Unit, LaneBitmask::getAll())); + addRegLanes(RegUnits, VRegMaskOrUnit(Unit, LaneBitmask::getAll())); } } @@ -548,15 +547,15 @@ class RegisterOperandsCollector { } void pushRegLanes(Register Reg, unsigned SubRegIdx, - SmallVectorImpl<RegisterMaskPair> &RegUnits) const { + SmallVectorImpl<VRegMaskOrUnit> &RegUnits) const { if (Reg.isVirtual()) { LaneBitmask LaneMask = SubRegIdx != 0 ? TRI.getSubRegIndexLaneMask(SubRegIdx) : MRI.getMaxLaneMaskForVReg(Reg); - addRegLanes(RegUnits, RegisterMaskPair(Reg, LaneMask)); + addRegLanes(RegUnits, VRegMaskOrUnit(Reg, LaneMask)); } else if (MRI.isAllocatable(Reg)) { for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg())) - addRegLanes(RegUnits, RegisterMaskPair(Unit, LaneBitmask::getAll())); + addRegLanes(RegUnits, VRegMaskOrUnit(Unit, LaneBitmask::getAll())); } } }; @@ -622,7 +621,7 @@ void RegisterOperands::adjustLaneLiveness(const LiveIntervals &LIS, LaneMask = getLiveLanesAt(LIS, MRI, true, RegUnit, Pos.getBaseIndex()); if (AddFlagsMI != nullptr) { - for (const RegisterMaskPair &P : DeadDefs) { + for (const VRegMaskOrUnit &P : DeadDefs) { Register RegUnit = P.RegUnit; if (!RegUnit.isVirtual()) continue; @@ -651,10 +650,10 @@ void PressureDiffs::addInstruction(unsigned Idx, const MachineRegisterInfo &MRI) { PressureDiff &PDiff = (*this)[Idx]; assert(!PDiff.begin()->isValid() && "stale PDiff"); - for (const RegisterMaskPair &P : RegOpers.Defs) + for (const VRegMaskOrUnit &P : RegOpers.Defs) PDiff.addPressureChange(P.RegUnit, true, &MRI); - for (const RegisterMaskPair &P : RegOpers.Uses) + for (const VRegMaskOrUnit &P : RegOpers.Uses) PDiff.addPressureChange(P.RegUnit, false, &MRI); } @@ -694,20 +693,20 @@ void PressureDiff::addPressureChange(Register RegUnit, bool IsDec, } /// Force liveness of registers. -void RegPressureTracker::addLiveRegs(ArrayRef<RegisterMaskPair> Regs) { - for (const RegisterMaskPair &P : Regs) { +void RegPressureTracker::addLiveRegs(ArrayRef<VRegMaskOrUnit> Regs) { + for (const VRegMaskOrUnit &P : Regs) { LaneBitmask PrevMask = LiveRegs.insert(P); LaneBitmask NewMask = PrevMask | P.LaneMask; increaseRegPressure(P.RegUnit, PrevMask, NewMask); } } -void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair, - SmallVectorImpl<RegisterMaskPair> &LiveInOrOut) { +void RegPressureTracker::discoverLiveInOrOut( + VRegMaskOrUnit Pair, SmallVectorImpl<VRegMaskOrUnit> &LiveInOrOut) { assert(Pair.LaneMask.any()); Register RegUnit = Pair.RegUnit; - auto I = llvm::find_if(LiveInOrOut, [RegUnit](const RegisterMaskPair &Other) { + auto I = llvm::find_if(LiveInOrOut, [RegUnit](const VRegMaskOrUnit &Other) { return Other.RegUnit == RegUnit; }); LaneBitmask PrevMask; @@ -724,22 +723,22 @@ void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair, increaseSetPressure(P.MaxSetPressure, *MRI, RegUnit, PrevMask, NewMask); } -void RegPressureTracker::discoverLiveIn(RegisterMaskPair Pair) { +void RegPressureTracker::discoverLiveIn(VRegMaskOrUnit Pair) { discoverLiveInOrOut(Pair, P.LiveInRegs); } -void RegPressureTracker::discoverLiveOut(RegisterMaskPair Pair) { +void RegPressureTracker::discoverLiveOut(VRegMaskOrUnit Pair) { discoverLiveInOrOut(Pair, P.LiveOutRegs); } -void RegPressureTracker::bumpDeadDefs(ArrayRef<RegisterMaskPair> DeadDefs) { - for (const RegisterMaskPair &P : DeadDefs) { +void RegPressureTracker::bumpDeadDefs(ArrayRef<VRegMaskOrUnit> DeadDefs) { + for (const VRegMaskOrUnit &P : DeadDefs) { Register Reg = P.RegUnit; LaneBitmask LiveMask = LiveRegs.contains(Reg); LaneBitmask BumpedMask = LiveMask | P.LaneMask; increaseRegPressure(Reg, LiveMask, BumpedMask); } - for (const RegisterMaskPair &P : DeadDefs) { + for (const VRegMaskOrUnit &P : DeadDefs) { Register Reg = P.RegUnit; LaneBitmask LiveMask = LiveRegs.contains(Reg); LaneBitmask BumpedMask = LiveMask | P.LaneMask; @@ -753,7 +752,7 @@ void RegPressureTracker::bumpDeadDefs(ArrayRef<RegisterMaskPair> DeadDefs) { /// difference pointer is provided record the changes is pressure caused by this /// instruction independent of liveness. void RegPressureTracker::recede(const RegisterOperands &RegOpers, - SmallVectorImpl<RegisterMaskPair> *LiveUses) { + SmallVectorImpl<VRegMaskOrUnit> *LiveUses) { assert(!CurrPos->isDebugOrPseudoInstr()); // Boost pressure for all dead defs together. @@ -761,7 +760,7 @@ void RegPressureTracker::recede(const RegisterOperands &RegOpers, // Kill liveness at live defs. // TODO: consider earlyclobbers? - for (const RegisterMaskPair &Def : RegOpers.Defs) { + for (const VRegMaskOrUnit &Def : RegOpers.Defs) { Register Reg = Def.RegUnit; LaneBitmask PreviousMask = LiveRegs.erase(Def); @@ -769,7 +768,7 @@ void RegPressureTracker::recede(const RegisterOperands &RegOpers, LaneBitmask LiveOut = Def.LaneMask & ~PreviousMask; if (LiveOut.any()) { - discoverLiveOut(RegisterMaskPair(Reg, LiveOut)); + discoverLiveOut(VRegMaskOrUnit(Reg, LiveOut)); // Retroactively model effects on pressure of the live out lanes. increaseSetPressure(CurrSetPressure, *MRI, Reg, LaneBitmask::getNone(), LiveOut); @@ -791,7 +790,7 @@ void RegPressureTracker::recede(const RegisterOperands &RegOpers, SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot(); // Generate liveness for uses. - for (const RegisterMaskPair &Use : RegOpers.Uses) { + for (const VRegMaskOrUnit &Use : RegOpers.Uses) { Register Reg = Use.RegUnit; assert(Use.LaneMask.any()); LaneBitmask PreviousMask = LiveRegs.insert(Use); @@ -803,19 +802,18 @@ void RegPressureTracker::recede(const RegisterOperands &RegOpers, if (PreviousMask.none()) { if (LiveUses != nullptr) { if (!TrackLaneMasks) { - addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); + addRegLanes(*LiveUses, VRegMaskOrUnit(Reg, NewMask)); } else { - auto I = - llvm::find_if(*LiveUses, [Reg](const RegisterMaskPair Other) { - return Other.RegUnit == Reg; - }); + auto I = llvm::find_if(*LiveUses, [Reg](const VRegMaskOrUnit Other) { + return Other.RegUnit == Reg; + }); bool IsRedef = I != LiveUses->end(); if (IsRedef) { // ignore re-defs here... assert(I->LaneMask.none()); - removeRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); + removeRegLanes(*LiveUses, VRegMaskOrUnit(Reg, NewMask)); } else { - addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); + addRegLanes(*LiveUses, VRegMaskOrUnit(Reg, NewMask)); } } } @@ -824,14 +822,14 @@ void RegPressureTracker::recede(const RegisterOperands &RegOpers, if (RequireIntervals) { LaneBitmask LiveOut = getLiveThroughAt(Reg, SlotIdx); if (LiveOut.any()) - discoverLiveOut(RegisterMaskPair(Reg, LiveOut)); + discoverLiveOut(VRegMaskOrUnit(Reg, LiveOut)); } } increaseRegPressure(Reg, PreviousMask, NewMask); } if (TrackUntiedDefs) { - for (const RegisterMaskPair &Def : RegOpers.Defs) { + for (const VRegMaskOrUnit &Def : RegOpers.Defs) { Register RegUnit = Def.RegUnit; if (RegUnit.isVirtual() && (LiveRegs.contains(RegUnit) & Def.LaneMask).none()) @@ -861,7 +859,7 @@ void RegPressureTracker::recedeSkipDebugValues() { static_cast<IntervalPressure&>(P).openTop(SlotIdx); } -void RegPressureTracker::recede(SmallVectorImpl<RegisterMaskPair> *LiveUses) { +void RegPressureTracker::recede(SmallVectorImpl<VRegMaskOrUnit> *LiveUses) { recedeSkipDebugValues(); if (CurrPos->isDebugInstr() || CurrPos->isPseudoProbe()) { // It's possible to only have debug_value and pseudo probe instructions and @@ -902,27 +900,27 @@ void RegPressureTracker::advance(const RegisterOperands &RegOpers) { static_cast<RegionPressure&>(P).openBottom(CurrPos); } - for (const RegisterMaskPair &Use : RegOpers.Uses) { + for (const VRegMaskOrUnit &Use : RegOpers.Uses) { Register Reg = Use.RegUnit; LaneBitmask LiveMask = LiveRegs.contains(Reg); LaneBitmask LiveIn = Use.LaneMask & ~LiveMask; if (LiveIn.any()) { - discoverLiveIn(RegisterMaskPair(Reg, LiveIn)); + discoverLiveIn(VRegMaskOrUnit(Reg, LiveIn)); increaseRegPressure(Reg, LiveMask, LiveMask | LiveIn); - LiveRegs.insert(RegisterMaskPair(Reg, LiveIn)); + LiveRegs.insert(VRegMaskOrUnit(Reg, LiveIn)); } // Kill liveness at last uses. if (RequireIntervals) { LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx); if (LastUseMask.any()) { - LiveRegs.erase(RegisterMaskPair(Reg, LastUseMask)); + LiveRegs.erase(VRegMaskOrUnit(Reg, LastUseMask)); decreaseRegPressure(Reg, LiveMask, LiveMask & ~LastUseMask); } } } // Generate liveness for defs. - for (const RegisterMaskPair &Def : RegOpers.Defs) { + for (const VRegMaskOrUnit &Def : RegOpers.Defs) { LaneBitmask PreviousMask = LiveRegs.insert(Def); LaneBitmask NewMask = PreviousMask | Def.LaneMask; increaseRegPressure(Def.RegUnit, PreviousMask, NewMask); @@ -1051,7 +1049,7 @@ void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) { bumpDeadDefs(RegOpers.DeadDefs); // Kill liveness at live defs. - for (const RegisterMaskPair &P : RegOpers.Defs) { + for (const VRegMaskOrUnit &P : RegOpers.Defs) { Register Reg = P.RegUnit; LaneBitmask LiveAfter = LiveRegs.contains(Reg); LaneBitmask UseLanes = getRegLanes(RegOpers.Uses, Reg); @@ -1063,7 +1061,7 @@ void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) { decreaseRegPressure(Reg, LiveAfter, LiveAfter & LiveBefore); } // Generate liveness for uses. Also handle any uses which overlap with defs. - for (const RegisterMaskPair &P : RegOpers.Uses) { + for (const VRegMaskOrUnit &P : RegOpers.Uses) { Register Reg = P.RegUnit; LaneBitmask LiveAfter = LiveRegs.contains(Reg); LaneBitmask LiveBefore = LiveAfter | P.LaneMask; @@ -1288,7 +1286,7 @@ void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) { RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); if (RequireIntervals) { - for (const RegisterMaskPair &Use : RegOpers.Uses) { + for (const VRegMaskOrUnit &Use : RegOpers.Uses) { Register Reg = Use.RegUnit; LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx); if (LastUseMask.none()) @@ -1311,7 +1309,7 @@ void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) { } // Generate liveness for defs. - for (const RegisterMaskPair &Def : RegOpers.Defs) { + for (const VRegMaskOrUnit &Def : RegOpers.Defs) { Register Reg = Def.RegUnit; LaneBitmask LiveMask = LiveRegs.contains(Reg); LaneBitmask NewMask = LiveMask | Def.LaneMask; |
