[RISCV] Fix mgather -> riscv.masked.strided.load combine not extending indices (...
[llvm-project.git] / llvm / lib / CodeGen / RegisterPressure.cpp
blobf86aa3a167202f461362ea018f27b6be1d77a69f
1 //===- RegisterPressure.cpp - Dynamic Register Pressure -------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the RegisterPressure class which can be used to track
10 // MachineInstr level register pressure.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/RegisterPressure.h"
15 #include "llvm/ADT/ArrayRef.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/CodeGen/LiveInterval.h"
19 #include "llvm/CodeGen/LiveIntervals.h"
20 #include "llvm/CodeGen/MachineBasicBlock.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineInstr.h"
23 #include "llvm/CodeGen/MachineInstrBundle.h"
24 #include "llvm/CodeGen/MachineOperand.h"
25 #include "llvm/CodeGen/MachineRegisterInfo.h"
26 #include "llvm/CodeGen/RegisterClassInfo.h"
27 #include "llvm/CodeGen/SlotIndexes.h"
28 #include "llvm/CodeGen/TargetRegisterInfo.h"
29 #include "llvm/CodeGen/TargetSubtargetInfo.h"
30 #include "llvm/Config/llvm-config.h"
31 #include "llvm/MC/LaneBitmask.h"
32 #include "llvm/MC/MCRegisterInfo.h"
33 #include "llvm/Support/Compiler.h"
34 #include "llvm/Support/Debug.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include <algorithm>
38 #include <cassert>
39 #include <cstdint>
40 #include <cstdlib>
41 #include <cstring>
42 #include <iterator>
43 #include <limits>
44 #include <utility>
45 #include <vector>
47 using namespace llvm;
49 /// Increase pressure for each pressure set provided by TargetRegisterInfo.
50 static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure,
51 const MachineRegisterInfo &MRI, unsigned Reg,
52 LaneBitmask PrevMask, LaneBitmask NewMask) {
53 assert((PrevMask & ~NewMask).none() && "Must not remove bits");
54 if (PrevMask.any() || NewMask.none())
55 return;
57 PSetIterator PSetI = MRI.getPressureSets(Reg);
58 unsigned Weight = PSetI.getWeight();
59 for (; PSetI.isValid(); ++PSetI)
60 CurrSetPressure[*PSetI] += Weight;
63 /// Decrease pressure for each pressure set provided by TargetRegisterInfo.
64 static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure,
65 const MachineRegisterInfo &MRI, Register Reg,
66 LaneBitmask PrevMask, LaneBitmask NewMask) {
67 //assert((NewMask & !PrevMask) == 0 && "Must not add bits");
68 if (NewMask.any() || PrevMask.none())
69 return;
71 PSetIterator PSetI = MRI.getPressureSets(Reg);
72 unsigned Weight = PSetI.getWeight();
73 for (; PSetI.isValid(); ++PSetI) {
74 assert(CurrSetPressure[*PSetI] >= Weight && "register pressure underflow");
75 CurrSetPressure[*PSetI] -= Weight;
79 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
80 LLVM_DUMP_METHOD
81 void llvm::dumpRegSetPressure(ArrayRef<unsigned> SetPressure,
82 const TargetRegisterInfo *TRI) {
83 bool Empty = true;
84 for (unsigned i = 0, e = SetPressure.size(); i < e; ++i) {
85 if (SetPressure[i] != 0) {
86 dbgs() << TRI->getRegPressureSetName(i) << "=" << SetPressure[i] << '\n';
87 Empty = false;
90 if (Empty)
91 dbgs() << "\n";
94 LLVM_DUMP_METHOD
95 void RegisterPressure::dump(const TargetRegisterInfo *TRI) const {
96 dbgs() << "Max Pressure: ";
97 dumpRegSetPressure(MaxSetPressure, TRI);
98 dbgs() << "Live In: ";
99 for (const RegisterMaskPair &P : LiveInRegs) {
100 dbgs() << printVRegOrUnit(P.RegUnit, TRI);
101 if (!P.LaneMask.all())
102 dbgs() << ':' << PrintLaneMask(P.LaneMask);
103 dbgs() << ' ';
105 dbgs() << '\n';
106 dbgs() << "Live Out: ";
107 for (const RegisterMaskPair &P : LiveOutRegs) {
108 dbgs() << printVRegOrUnit(P.RegUnit, TRI);
109 if (!P.LaneMask.all())
110 dbgs() << ':' << PrintLaneMask(P.LaneMask);
111 dbgs() << ' ';
113 dbgs() << '\n';
116 LLVM_DUMP_METHOD
117 void RegPressureTracker::dump() const {
118 if (!isTopClosed() || !isBottomClosed()) {
119 dbgs() << "Curr Pressure: ";
120 dumpRegSetPressure(CurrSetPressure, TRI);
122 P.dump(TRI);
125 LLVM_DUMP_METHOD
126 void PressureDiff::dump(const TargetRegisterInfo &TRI) const {
127 const char *sep = "";
128 for (const PressureChange &Change : *this) {
129 if (!Change.isValid())
130 break;
131 dbgs() << sep << TRI.getRegPressureSetName(Change.getPSet())
132 << " " << Change.getUnitInc();
133 sep = " ";
135 dbgs() << '\n';
138 LLVM_DUMP_METHOD
139 void PressureChange::dump() const {
140 dbgs() << "[" << getPSetOrMax() << ", " << getUnitInc() << "]\n";
143 void RegPressureDelta::dump() const {
144 dbgs() << "[Excess=";
145 Excess.dump();
146 dbgs() << ", CriticalMax=";
147 CriticalMax.dump();
148 dbgs() << ", CurrentMax=";
149 CurrentMax.dump();
150 dbgs() << "]\n";
153 #endif
155 void RegPressureTracker::increaseRegPressure(Register RegUnit,
156 LaneBitmask PreviousMask,
157 LaneBitmask NewMask) {
158 if (PreviousMask.any() || NewMask.none())
159 return;
161 PSetIterator PSetI = MRI->getPressureSets(RegUnit);
162 unsigned Weight = PSetI.getWeight();
163 for (; PSetI.isValid(); ++PSetI) {
164 CurrSetPressure[*PSetI] += Weight;
165 P.MaxSetPressure[*PSetI] =
166 std::max(P.MaxSetPressure[*PSetI], CurrSetPressure[*PSetI]);
170 void RegPressureTracker::decreaseRegPressure(Register RegUnit,
171 LaneBitmask PreviousMask,
172 LaneBitmask NewMask) {
173 decreaseSetPressure(CurrSetPressure, *MRI, RegUnit, PreviousMask, NewMask);
176 /// Clear the result so it can be used for another round of pressure tracking.
177 void IntervalPressure::reset() {
178 TopIdx = BottomIdx = SlotIndex();
179 MaxSetPressure.clear();
180 LiveInRegs.clear();
181 LiveOutRegs.clear();
184 /// Clear the result so it can be used for another round of pressure tracking.
185 void RegionPressure::reset() {
186 TopPos = BottomPos = MachineBasicBlock::const_iterator();
187 MaxSetPressure.clear();
188 LiveInRegs.clear();
189 LiveOutRegs.clear();
192 /// If the current top is not less than or equal to the next index, open it.
193 /// We happen to need the SlotIndex for the next top for pressure update.
194 void IntervalPressure::openTop(SlotIndex NextTop) {
195 if (TopIdx <= NextTop)
196 return;
197 TopIdx = SlotIndex();
198 LiveInRegs.clear();
201 /// If the current top is the previous instruction (before receding), open it.
202 void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop) {
203 if (TopPos != PrevTop)
204 return;
205 TopPos = MachineBasicBlock::const_iterator();
206 LiveInRegs.clear();
209 /// If the current bottom is not greater than the previous index, open it.
210 void IntervalPressure::openBottom(SlotIndex PrevBottom) {
211 if (BottomIdx > PrevBottom)
212 return;
213 BottomIdx = SlotIndex();
214 LiveInRegs.clear();
217 /// If the current bottom is the previous instr (before advancing), open it.
218 void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom) {
219 if (BottomPos != PrevBottom)
220 return;
221 BottomPos = MachineBasicBlock::const_iterator();
222 LiveInRegs.clear();
225 void LiveRegSet::init(const MachineRegisterInfo &MRI) {
226 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
227 unsigned NumRegUnits = TRI.getNumRegs();
228 unsigned NumVirtRegs = MRI.getNumVirtRegs();
229 Regs.setUniverse(NumRegUnits + NumVirtRegs);
230 this->NumRegUnits = NumRegUnits;
233 void LiveRegSet::clear() {
234 Regs.clear();
237 static const LiveRange *getLiveRange(const LiveIntervals &LIS, unsigned Reg) {
238 if (Register::isVirtualRegister(Reg))
239 return &LIS.getInterval(Reg);
240 return LIS.getCachedRegUnit(Reg);
243 void RegPressureTracker::reset() {
244 MBB = nullptr;
245 LIS = nullptr;
247 CurrSetPressure.clear();
248 LiveThruPressure.clear();
249 P.MaxSetPressure.clear();
251 if (RequireIntervals)
252 static_cast<IntervalPressure&>(P).reset();
253 else
254 static_cast<RegionPressure&>(P).reset();
256 LiveRegs.clear();
257 UntiedDefs.clear();
260 /// Setup the RegPressureTracker.
262 /// TODO: Add support for pressure without LiveIntervals.
263 void RegPressureTracker::init(const MachineFunction *mf,
264 const RegisterClassInfo *rci,
265 const LiveIntervals *lis,
266 const MachineBasicBlock *mbb,
267 MachineBasicBlock::const_iterator pos,
268 bool TrackLaneMasks, bool TrackUntiedDefs) {
269 reset();
271 MF = mf;
272 TRI = MF->getSubtarget().getRegisterInfo();
273 RCI = rci;
274 MRI = &MF->getRegInfo();
275 MBB = mbb;
276 this->TrackUntiedDefs = TrackUntiedDefs;
277 this->TrackLaneMasks = TrackLaneMasks;
279 if (RequireIntervals) {
280 assert(lis && "IntervalPressure requires LiveIntervals");
281 LIS = lis;
284 CurrPos = pos;
285 CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0);
287 P.MaxSetPressure = CurrSetPressure;
289 LiveRegs.init(*MRI);
290 if (TrackUntiedDefs)
291 UntiedDefs.setUniverse(MRI->getNumVirtRegs());
294 /// Does this pressure result have a valid top position and live ins.
295 bool RegPressureTracker::isTopClosed() const {
296 if (RequireIntervals)
297 return static_cast<IntervalPressure&>(P).TopIdx.isValid();
298 return (static_cast<RegionPressure&>(P).TopPos ==
299 MachineBasicBlock::const_iterator());
302 /// Does this pressure result have a valid bottom position and live outs.
303 bool RegPressureTracker::isBottomClosed() const {
304 if (RequireIntervals)
305 return static_cast<IntervalPressure&>(P).BottomIdx.isValid();
306 return (static_cast<RegionPressure&>(P).BottomPos ==
307 MachineBasicBlock::const_iterator());
310 SlotIndex RegPressureTracker::getCurrSlot() const {
311 MachineBasicBlock::const_iterator IdxPos =
312 skipDebugInstructionsForward(CurrPos, MBB->end());
313 if (IdxPos == MBB->end())
314 return LIS->getMBBEndIdx(MBB);
315 return LIS->getInstructionIndex(*IdxPos).getRegSlot();
318 /// Set the boundary for the top of the region and summarize live ins.
319 void RegPressureTracker::closeTop() {
320 if (RequireIntervals)
321 static_cast<IntervalPressure&>(P).TopIdx = getCurrSlot();
322 else
323 static_cast<RegionPressure&>(P).TopPos = CurrPos;
325 assert(P.LiveInRegs.empty() && "inconsistent max pressure result");
326 P.LiveInRegs.reserve(LiveRegs.size());
327 LiveRegs.appendTo(P.LiveInRegs);
330 /// Set the boundary for the bottom of the region and summarize live outs.
331 void RegPressureTracker::closeBottom() {
332 if (RequireIntervals)
333 static_cast<IntervalPressure&>(P).BottomIdx = getCurrSlot();
334 else
335 static_cast<RegionPressure&>(P).BottomPos = CurrPos;
337 assert(P.LiveOutRegs.empty() && "inconsistent max pressure result");
338 P.LiveOutRegs.reserve(LiveRegs.size());
339 LiveRegs.appendTo(P.LiveOutRegs);
342 /// Finalize the region boundaries and record live ins and live outs.
343 void RegPressureTracker::closeRegion() {
344 if (!isTopClosed() && !isBottomClosed()) {
345 assert(LiveRegs.size() == 0 && "no region boundary");
346 return;
348 if (!isBottomClosed())
349 closeBottom();
350 else if (!isTopClosed())
351 closeTop();
352 // If both top and bottom are closed, do nothing.
355 /// The register tracker is unaware of global liveness so ignores normal
356 /// live-thru ranges. However, two-address or coalesced chains can also lead
357 /// to live ranges with no holes. Count these to inform heuristics that we
358 /// can never drop below this pressure.
359 void RegPressureTracker::initLiveThru(const RegPressureTracker &RPTracker) {
360 LiveThruPressure.assign(TRI->getNumRegPressureSets(), 0);
361 assert(isBottomClosed() && "need bottom-up tracking to intialize.");
362 for (const RegisterMaskPair &Pair : P.LiveOutRegs) {
363 Register RegUnit = Pair.RegUnit;
364 if (RegUnit.isVirtual() && !RPTracker.hasUntiedDef(RegUnit))
365 increaseSetPressure(LiveThruPressure, *MRI, RegUnit,
366 LaneBitmask::getNone(), Pair.LaneMask);
370 static LaneBitmask getRegLanes(ArrayRef<RegisterMaskPair> RegUnits,
371 Register RegUnit) {
372 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) {
373 return Other.RegUnit == RegUnit;
375 if (I == RegUnits.end())
376 return LaneBitmask::getNone();
377 return I->LaneMask;
380 static void addRegLanes(SmallVectorImpl<RegisterMaskPair> &RegUnits,
381 RegisterMaskPair Pair) {
382 Register RegUnit = Pair.RegUnit;
383 assert(Pair.LaneMask.any());
384 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) {
385 return Other.RegUnit == RegUnit;
387 if (I == RegUnits.end()) {
388 RegUnits.push_back(Pair);
389 } else {
390 I->LaneMask |= Pair.LaneMask;
394 static void setRegZero(SmallVectorImpl<RegisterMaskPair> &RegUnits,
395 Register RegUnit) {
396 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) {
397 return Other.RegUnit == RegUnit;
399 if (I == RegUnits.end()) {
400 RegUnits.push_back(RegisterMaskPair(RegUnit, LaneBitmask::getNone()));
401 } else {
402 I->LaneMask = LaneBitmask::getNone();
406 static void removeRegLanes(SmallVectorImpl<RegisterMaskPair> &RegUnits,
407 RegisterMaskPair Pair) {
408 Register RegUnit = Pair.RegUnit;
409 assert(Pair.LaneMask.any());
410 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) {
411 return Other.RegUnit == RegUnit;
413 if (I != RegUnits.end()) {
414 I->LaneMask &= ~Pair.LaneMask;
415 if (I->LaneMask.none())
416 RegUnits.erase(I);
420 static LaneBitmask
421 getLanesWithProperty(const LiveIntervals &LIS, const MachineRegisterInfo &MRI,
422 bool TrackLaneMasks, Register RegUnit, SlotIndex Pos,
423 LaneBitmask SafeDefault,
424 bool (*Property)(const LiveRange &LR, SlotIndex Pos)) {
425 if (RegUnit.isVirtual()) {
426 const LiveInterval &LI = LIS.getInterval(RegUnit);
427 LaneBitmask Result;
428 if (TrackLaneMasks && LI.hasSubRanges()) {
429 for (const LiveInterval::SubRange &SR : LI.subranges()) {
430 if (Property(SR, Pos))
431 Result |= SR.LaneMask;
433 } else if (Property(LI, Pos)) {
434 Result = TrackLaneMasks ? MRI.getMaxLaneMaskForVReg(RegUnit)
435 : LaneBitmask::getAll();
438 return Result;
439 } else {
440 const LiveRange *LR = LIS.getCachedRegUnit(RegUnit);
441 // Be prepared for missing liveranges: We usually do not compute liveranges
442 // for physical registers on targets with many registers (GPUs).
443 if (LR == nullptr)
444 return SafeDefault;
445 return Property(*LR, Pos) ? LaneBitmask::getAll() : LaneBitmask::getNone();
449 static LaneBitmask getLiveLanesAt(const LiveIntervals &LIS,
450 const MachineRegisterInfo &MRI,
451 bool TrackLaneMasks, Register RegUnit,
452 SlotIndex Pos) {
453 return getLanesWithProperty(LIS, MRI, TrackLaneMasks, RegUnit, Pos,
454 LaneBitmask::getAll(),
455 [](const LiveRange &LR, SlotIndex Pos) {
456 return LR.liveAt(Pos);
460 namespace {
462 /// Collect this instruction's unique uses and defs into SmallVectors for
463 /// processing defs and uses in order.
465 /// FIXME: always ignore tied opers
466 class RegisterOperandsCollector {
467 friend class llvm::RegisterOperands;
469 RegisterOperands &RegOpers;
470 const TargetRegisterInfo &TRI;
471 const MachineRegisterInfo &MRI;
472 bool IgnoreDead;
474 RegisterOperandsCollector(RegisterOperands &RegOpers,
475 const TargetRegisterInfo &TRI,
476 const MachineRegisterInfo &MRI, bool IgnoreDead)
477 : RegOpers(RegOpers), TRI(TRI), MRI(MRI), IgnoreDead(IgnoreDead) {}
479 void collectInstr(const MachineInstr &MI) const {
480 for (ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI)
481 collectOperand(*OperI);
483 // Remove redundant physreg dead defs.
484 for (const RegisterMaskPair &P : RegOpers.Defs)
485 removeRegLanes(RegOpers.DeadDefs, P);
488 void collectInstrLanes(const MachineInstr &MI) const {
489 for (ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI)
490 collectOperandLanes(*OperI);
492 // Remove redundant physreg dead defs.
493 for (const RegisterMaskPair &P : RegOpers.Defs)
494 removeRegLanes(RegOpers.DeadDefs, P);
497 /// Push this operand's register onto the correct vectors.
498 void collectOperand(const MachineOperand &MO) const {
499 if (!MO.isReg() || !MO.getReg())
500 return;
501 Register Reg = MO.getReg();
502 if (MO.isUse()) {
503 if (!MO.isUndef() && !MO.isInternalRead())
504 pushReg(Reg, RegOpers.Uses);
505 } else {
506 assert(MO.isDef());
507 // Subregister definitions may imply a register read.
508 if (MO.readsReg())
509 pushReg(Reg, RegOpers.Uses);
511 if (MO.isDead()) {
512 if (!IgnoreDead)
513 pushReg(Reg, RegOpers.DeadDefs);
514 } else
515 pushReg(Reg, RegOpers.Defs);
519 void pushReg(Register Reg,
520 SmallVectorImpl<RegisterMaskPair> &RegUnits) const {
521 if (Reg.isVirtual()) {
522 addRegLanes(RegUnits, RegisterMaskPair(Reg, LaneBitmask::getAll()));
523 } else if (MRI.isAllocatable(Reg)) {
524 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
525 addRegLanes(RegUnits, RegisterMaskPair(Unit, LaneBitmask::getAll()));
529 void collectOperandLanes(const MachineOperand &MO) const {
530 if (!MO.isReg() || !MO.getReg())
531 return;
532 Register Reg = MO.getReg();
533 unsigned SubRegIdx = MO.getSubReg();
534 if (MO.isUse()) {
535 if (!MO.isUndef() && !MO.isInternalRead())
536 pushRegLanes(Reg, SubRegIdx, RegOpers.Uses);
537 } else {
538 assert(MO.isDef());
539 // Treat read-undef subreg defs as definitions of the whole register.
540 if (MO.isUndef())
541 SubRegIdx = 0;
543 if (MO.isDead()) {
544 if (!IgnoreDead)
545 pushRegLanes(Reg, SubRegIdx, RegOpers.DeadDefs);
546 } else
547 pushRegLanes(Reg, SubRegIdx, RegOpers.Defs);
551 void pushRegLanes(Register Reg, unsigned SubRegIdx,
552 SmallVectorImpl<RegisterMaskPair> &RegUnits) const {
553 if (Reg.isVirtual()) {
554 LaneBitmask LaneMask = SubRegIdx != 0
555 ? TRI.getSubRegIndexLaneMask(SubRegIdx)
556 : MRI.getMaxLaneMaskForVReg(Reg);
557 addRegLanes(RegUnits, RegisterMaskPair(Reg, LaneMask));
558 } else if (MRI.isAllocatable(Reg)) {
559 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
560 addRegLanes(RegUnits, RegisterMaskPair(Unit, LaneBitmask::getAll()));
565 } // end anonymous namespace
567 void RegisterOperands::collect(const MachineInstr &MI,
568 const TargetRegisterInfo &TRI,
569 const MachineRegisterInfo &MRI,
570 bool TrackLaneMasks, bool IgnoreDead) {
571 RegisterOperandsCollector Collector(*this, TRI, MRI, IgnoreDead);
572 if (TrackLaneMasks)
573 Collector.collectInstrLanes(MI);
574 else
575 Collector.collectInstr(MI);
578 void RegisterOperands::detectDeadDefs(const MachineInstr &MI,
579 const LiveIntervals &LIS) {
580 SlotIndex SlotIdx = LIS.getInstructionIndex(MI);
581 for (auto *RI = Defs.begin(); RI != Defs.end(); /*empty*/) {
582 Register Reg = RI->RegUnit;
583 const LiveRange *LR = getLiveRange(LIS, Reg);
584 if (LR != nullptr) {
585 LiveQueryResult LRQ = LR->Query(SlotIdx);
586 if (LRQ.isDeadDef()) {
587 // LiveIntervals knows this is a dead even though it's MachineOperand is
588 // not flagged as such.
589 DeadDefs.push_back(*RI);
590 RI = Defs.erase(RI);
591 continue;
594 ++RI;
598 void RegisterOperands::adjustLaneLiveness(const LiveIntervals &LIS,
599 const MachineRegisterInfo &MRI,
600 SlotIndex Pos,
601 MachineInstr *AddFlagsMI) {
602 for (auto *I = Defs.begin(); I != Defs.end();) {
603 LaneBitmask LiveAfter = getLiveLanesAt(LIS, MRI, true, I->RegUnit,
604 Pos.getDeadSlot());
605 // If the def is all that is live after the instruction, then in case
606 // of a subregister def we need a read-undef flag.
607 Register RegUnit = I->RegUnit;
608 if (RegUnit.isVirtual() && AddFlagsMI != nullptr &&
609 (LiveAfter & ~I->LaneMask).none())
610 AddFlagsMI->setRegisterDefReadUndef(RegUnit);
612 LaneBitmask ActualDef = I->LaneMask & LiveAfter;
613 if (ActualDef.none()) {
614 I = Defs.erase(I);
615 } else {
616 I->LaneMask = ActualDef;
617 ++I;
620 for (auto *I = Uses.begin(); I != Uses.end();) {
621 LaneBitmask LiveBefore = getLiveLanesAt(LIS, MRI, true, I->RegUnit,
622 Pos.getBaseIndex());
623 LaneBitmask LaneMask = I->LaneMask & LiveBefore;
624 if (LaneMask.none()) {
625 I = Uses.erase(I);
626 } else {
627 I->LaneMask = LaneMask;
628 ++I;
631 if (AddFlagsMI != nullptr) {
632 for (const RegisterMaskPair &P : DeadDefs) {
633 Register RegUnit = P.RegUnit;
634 if (!RegUnit.isVirtual())
635 continue;
636 LaneBitmask LiveAfter = getLiveLanesAt(LIS, MRI, true, RegUnit,
637 Pos.getDeadSlot());
638 if (LiveAfter.none())
639 AddFlagsMI->setRegisterDefReadUndef(RegUnit);
644 /// Initialize an array of N PressureDiffs.
645 void PressureDiffs::init(unsigned N) {
646 Size = N;
647 if (N <= Max) {
648 memset(PDiffArray, 0, N * sizeof(PressureDiff));
649 return;
651 Max = Size;
652 free(PDiffArray);
653 PDiffArray = static_cast<PressureDiff*>(safe_calloc(N, sizeof(PressureDiff)));
656 void PressureDiffs::addInstruction(unsigned Idx,
657 const RegisterOperands &RegOpers,
658 const MachineRegisterInfo &MRI) {
659 PressureDiff &PDiff = (*this)[Idx];
660 assert(!PDiff.begin()->isValid() && "stale PDiff");
661 for (const RegisterMaskPair &P : RegOpers.Defs)
662 PDiff.addPressureChange(P.RegUnit, true, &MRI);
664 for (const RegisterMaskPair &P : RegOpers.Uses)
665 PDiff.addPressureChange(P.RegUnit, false, &MRI);
668 /// Add a change in pressure to the pressure diff of a given instruction.
669 void PressureDiff::addPressureChange(Register RegUnit, bool IsDec,
670 const MachineRegisterInfo *MRI) {
671 PSetIterator PSetI = MRI->getPressureSets(RegUnit);
672 int Weight = IsDec ? -PSetI.getWeight() : PSetI.getWeight();
673 for (; PSetI.isValid(); ++PSetI) {
674 // Find an existing entry in the pressure diff for this PSet.
675 PressureDiff::iterator I = nonconst_begin(), E = nonconst_end();
676 for (; I != E && I->isValid(); ++I) {
677 if (I->getPSet() >= *PSetI)
678 break;
680 // If all pressure sets are more constrained, skip the remaining PSets.
681 if (I == E)
682 break;
683 // Insert this PressureChange.
684 if (!I->isValid() || I->getPSet() != *PSetI) {
685 PressureChange PTmp = PressureChange(*PSetI);
686 for (PressureDiff::iterator J = I; J != E && PTmp.isValid(); ++J)
687 std::swap(*J, PTmp);
689 // Update the units for this pressure set.
690 unsigned NewUnitInc = I->getUnitInc() + Weight;
691 if (NewUnitInc != 0) {
692 I->setUnitInc(NewUnitInc);
693 } else {
694 // Remove entry
695 PressureDiff::iterator J;
696 for (J = std::next(I); J != E && J->isValid(); ++J, ++I)
697 *I = *J;
698 *I = PressureChange();
703 /// Force liveness of registers.
704 void RegPressureTracker::addLiveRegs(ArrayRef<RegisterMaskPair> Regs) {
705 for (const RegisterMaskPair &P : Regs) {
706 LaneBitmask PrevMask = LiveRegs.insert(P);
707 LaneBitmask NewMask = PrevMask | P.LaneMask;
708 increaseRegPressure(P.RegUnit, PrevMask, NewMask);
712 void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair,
713 SmallVectorImpl<RegisterMaskPair> &LiveInOrOut) {
714 assert(Pair.LaneMask.any());
716 Register RegUnit = Pair.RegUnit;
717 auto I = llvm::find_if(LiveInOrOut, [RegUnit](const RegisterMaskPair &Other) {
718 return Other.RegUnit == RegUnit;
720 LaneBitmask PrevMask;
721 LaneBitmask NewMask;
722 if (I == LiveInOrOut.end()) {
723 PrevMask = LaneBitmask::getNone();
724 NewMask = Pair.LaneMask;
725 LiveInOrOut.push_back(Pair);
726 } else {
727 PrevMask = I->LaneMask;
728 NewMask = PrevMask | Pair.LaneMask;
729 I->LaneMask = NewMask;
731 increaseSetPressure(P.MaxSetPressure, *MRI, RegUnit, PrevMask, NewMask);
734 void RegPressureTracker::discoverLiveIn(RegisterMaskPair Pair) {
735 discoverLiveInOrOut(Pair, P.LiveInRegs);
738 void RegPressureTracker::discoverLiveOut(RegisterMaskPair Pair) {
739 discoverLiveInOrOut(Pair, P.LiveOutRegs);
742 void RegPressureTracker::bumpDeadDefs(ArrayRef<RegisterMaskPair> DeadDefs) {
743 for (const RegisterMaskPair &P : DeadDefs) {
744 Register Reg = P.RegUnit;
745 LaneBitmask LiveMask = LiveRegs.contains(Reg);
746 LaneBitmask BumpedMask = LiveMask | P.LaneMask;
747 increaseRegPressure(Reg, LiveMask, BumpedMask);
749 for (const RegisterMaskPair &P : DeadDefs) {
750 Register Reg = P.RegUnit;
751 LaneBitmask LiveMask = LiveRegs.contains(Reg);
752 LaneBitmask BumpedMask = LiveMask | P.LaneMask;
753 decreaseRegPressure(Reg, BumpedMask, LiveMask);
757 /// Recede across the previous instruction. If LiveUses is provided, record any
758 /// RegUnits that are made live by the current instruction's uses. This includes
759 /// registers that are both defined and used by the instruction. If a pressure
760 /// difference pointer is provided record the changes is pressure caused by this
761 /// instruction independent of liveness.
762 void RegPressureTracker::recede(const RegisterOperands &RegOpers,
763 SmallVectorImpl<RegisterMaskPair> *LiveUses) {
764 assert(!CurrPos->isDebugOrPseudoInstr());
766 // Boost pressure for all dead defs together.
767 bumpDeadDefs(RegOpers.DeadDefs);
769 // Kill liveness at live defs.
770 // TODO: consider earlyclobbers?
771 for (const RegisterMaskPair &Def : RegOpers.Defs) {
772 Register Reg = Def.RegUnit;
774 LaneBitmask PreviousMask = LiveRegs.erase(Def);
775 LaneBitmask NewMask = PreviousMask & ~Def.LaneMask;
777 LaneBitmask LiveOut = Def.LaneMask & ~PreviousMask;
778 if (LiveOut.any()) {
779 discoverLiveOut(RegisterMaskPair(Reg, LiveOut));
780 // Retroactively model effects on pressure of the live out lanes.
781 increaseSetPressure(CurrSetPressure, *MRI, Reg, LaneBitmask::getNone(),
782 LiveOut);
783 PreviousMask = LiveOut;
786 if (NewMask.none()) {
787 // Add a 0 entry to LiveUses as a marker that the complete vreg has become
788 // dead.
789 if (TrackLaneMasks && LiveUses != nullptr)
790 setRegZero(*LiveUses, Reg);
793 decreaseRegPressure(Reg, PreviousMask, NewMask);
796 SlotIndex SlotIdx;
797 if (RequireIntervals)
798 SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot();
800 // Generate liveness for uses.
801 for (const RegisterMaskPair &Use : RegOpers.Uses) {
802 Register Reg = Use.RegUnit;
803 assert(Use.LaneMask.any());
804 LaneBitmask PreviousMask = LiveRegs.insert(Use);
805 LaneBitmask NewMask = PreviousMask | Use.LaneMask;
806 if (NewMask == PreviousMask)
807 continue;
809 // Did the register just become live?
810 if (PreviousMask.none()) {
811 if (LiveUses != nullptr) {
812 if (!TrackLaneMasks) {
813 addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask));
814 } else {
815 auto I =
816 llvm::find_if(*LiveUses, [Reg](const RegisterMaskPair Other) {
817 return Other.RegUnit == Reg;
819 bool IsRedef = I != LiveUses->end();
820 if (IsRedef) {
821 // ignore re-defs here...
822 assert(I->LaneMask.none());
823 removeRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask));
824 } else {
825 addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask));
830 // Discover live outs if this may be the first occurance of this register.
831 if (RequireIntervals) {
832 LaneBitmask LiveOut = getLiveThroughAt(Reg, SlotIdx);
833 if (LiveOut.any())
834 discoverLiveOut(RegisterMaskPair(Reg, LiveOut));
838 increaseRegPressure(Reg, PreviousMask, NewMask);
840 if (TrackUntiedDefs) {
841 for (const RegisterMaskPair &Def : RegOpers.Defs) {
842 Register RegUnit = Def.RegUnit;
843 if (RegUnit.isVirtual() &&
844 (LiveRegs.contains(RegUnit) & Def.LaneMask).none())
845 UntiedDefs.insert(RegUnit);
850 void RegPressureTracker::recedeSkipDebugValues() {
851 assert(CurrPos != MBB->begin());
852 if (!isBottomClosed())
853 closeBottom();
855 // Open the top of the region using block iterators.
856 if (!RequireIntervals && isTopClosed())
857 static_cast<RegionPressure&>(P).openTop(CurrPos);
859 // Find the previous instruction.
860 CurrPos = prev_nodbg(CurrPos, MBB->begin());
862 SlotIndex SlotIdx;
863 if (RequireIntervals && !CurrPos->isDebugOrPseudoInstr())
864 SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot();
866 // Open the top of the region using slot indexes.
867 if (RequireIntervals && isTopClosed())
868 static_cast<IntervalPressure&>(P).openTop(SlotIdx);
871 void RegPressureTracker::recede(SmallVectorImpl<RegisterMaskPair> *LiveUses) {
872 recedeSkipDebugValues();
873 if (CurrPos->isDebugInstr() || CurrPos->isPseudoProbe()) {
874 // It's possible to only have debug_value and pseudo probe instructions and
875 // hit the start of the block.
876 assert(CurrPos == MBB->begin());
877 return;
880 const MachineInstr &MI = *CurrPos;
881 RegisterOperands RegOpers;
882 RegOpers.collect(MI, *TRI, *MRI, TrackLaneMasks, false);
883 if (TrackLaneMasks) {
884 SlotIndex SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot();
885 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx);
886 } else if (RequireIntervals) {
887 RegOpers.detectDeadDefs(MI, *LIS);
890 recede(RegOpers, LiveUses);
893 /// Advance across the current instruction.
894 void RegPressureTracker::advance(const RegisterOperands &RegOpers) {
895 assert(!TrackUntiedDefs && "unsupported mode");
896 assert(CurrPos != MBB->end());
897 if (!isTopClosed())
898 closeTop();
900 SlotIndex SlotIdx;
901 if (RequireIntervals)
902 SlotIdx = getCurrSlot();
904 // Open the bottom of the region using slot indexes.
905 if (isBottomClosed()) {
906 if (RequireIntervals)
907 static_cast<IntervalPressure&>(P).openBottom(SlotIdx);
908 else
909 static_cast<RegionPressure&>(P).openBottom(CurrPos);
912 for (const RegisterMaskPair &Use : RegOpers.Uses) {
913 Register Reg = Use.RegUnit;
914 LaneBitmask LiveMask = LiveRegs.contains(Reg);
915 LaneBitmask LiveIn = Use.LaneMask & ~LiveMask;
916 if (LiveIn.any()) {
917 discoverLiveIn(RegisterMaskPair(Reg, LiveIn));
918 increaseRegPressure(Reg, LiveMask, LiveMask | LiveIn);
919 LiveRegs.insert(RegisterMaskPair(Reg, LiveIn));
921 // Kill liveness at last uses.
922 if (RequireIntervals) {
923 LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx);
924 if (LastUseMask.any()) {
925 LiveRegs.erase(RegisterMaskPair(Reg, LastUseMask));
926 decreaseRegPressure(Reg, LiveMask, LiveMask & ~LastUseMask);
931 // Generate liveness for defs.
932 for (const RegisterMaskPair &Def : RegOpers.Defs) {
933 LaneBitmask PreviousMask = LiveRegs.insert(Def);
934 LaneBitmask NewMask = PreviousMask | Def.LaneMask;
935 increaseRegPressure(Def.RegUnit, PreviousMask, NewMask);
938 // Boost pressure for all dead defs together.
939 bumpDeadDefs(RegOpers.DeadDefs);
941 // Find the next instruction.
942 CurrPos = next_nodbg(CurrPos, MBB->end());
945 void RegPressureTracker::advance() {
946 const MachineInstr &MI = *CurrPos;
947 RegisterOperands RegOpers;
948 RegOpers.collect(MI, *TRI, *MRI, TrackLaneMasks, false);
949 if (TrackLaneMasks) {
950 SlotIndex SlotIdx = getCurrSlot();
951 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx);
953 advance(RegOpers);
956 /// Find the max change in excess pressure across all sets.
957 static void computeExcessPressureDelta(ArrayRef<unsigned> OldPressureVec,
958 ArrayRef<unsigned> NewPressureVec,
959 RegPressureDelta &Delta,
960 const RegisterClassInfo *RCI,
961 ArrayRef<unsigned> LiveThruPressureVec) {
962 Delta.Excess = PressureChange();
963 for (unsigned i = 0, e = OldPressureVec.size(); i < e; ++i) {
964 unsigned POld = OldPressureVec[i];
965 unsigned PNew = NewPressureVec[i];
966 int PDiff = (int)PNew - (int)POld;
967 if (!PDiff) // No change in this set in the common case.
968 continue;
969 // Only consider change beyond the limit.
970 unsigned Limit = RCI->getRegPressureSetLimit(i);
971 if (!LiveThruPressureVec.empty())
972 Limit += LiveThruPressureVec[i];
974 if (Limit > POld) {
975 if (Limit > PNew)
976 PDiff = 0; // Under the limit
977 else
978 PDiff = PNew - Limit; // Just exceeded limit.
979 } else if (Limit > PNew)
980 PDiff = Limit - POld; // Just obeyed limit.
982 if (PDiff) {
983 Delta.Excess = PressureChange(i);
984 Delta.Excess.setUnitInc(PDiff);
985 break;
990 /// Find the max change in max pressure that either surpasses a critical PSet
991 /// limit or exceeds the current MaxPressureLimit.
993 /// FIXME: comparing each element of the old and new MaxPressure vectors here is
994 /// silly. It's done now to demonstrate the concept but will go away with a
995 /// RegPressureTracker API change to work with pressure differences.
996 static void computeMaxPressureDelta(ArrayRef<unsigned> OldMaxPressureVec,
997 ArrayRef<unsigned> NewMaxPressureVec,
998 ArrayRef<PressureChange> CriticalPSets,
999 ArrayRef<unsigned> MaxPressureLimit,
1000 RegPressureDelta &Delta) {
1001 Delta.CriticalMax = PressureChange();
1002 Delta.CurrentMax = PressureChange();
1004 unsigned CritIdx = 0, CritEnd = CriticalPSets.size();
1005 for (unsigned i = 0, e = OldMaxPressureVec.size(); i < e; ++i) {
1006 unsigned POld = OldMaxPressureVec[i];
1007 unsigned PNew = NewMaxPressureVec[i];
1008 if (PNew == POld) // No change in this set in the common case.
1009 continue;
1011 if (!Delta.CriticalMax.isValid()) {
1012 while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < i)
1013 ++CritIdx;
1015 if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == i) {
1016 int PDiff = (int)PNew - (int)CriticalPSets[CritIdx].getUnitInc();
1017 if (PDiff > 0) {
1018 Delta.CriticalMax = PressureChange(i);
1019 Delta.CriticalMax.setUnitInc(PDiff);
1023 // Find the first increase above MaxPressureLimit.
1024 // (Ignores negative MDiff).
1025 if (!Delta.CurrentMax.isValid() && PNew > MaxPressureLimit[i]) {
1026 Delta.CurrentMax = PressureChange(i);
1027 Delta.CurrentMax.setUnitInc(PNew - POld);
1028 if (CritIdx == CritEnd || Delta.CriticalMax.isValid())
1029 break;
1034 /// Record the upward impact of a single instruction on current register
1035 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1036 /// not discover live in/outs.
1038 /// This is intended for speculative queries. It leaves pressure inconsistent
1039 /// with the current position, so must be restored by the caller.
1040 void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) {
1041 assert(!MI->isDebugOrPseudoInstr() && "Expect a nondebug instruction.");
1043 SlotIndex SlotIdx;
1044 if (RequireIntervals)
1045 SlotIdx = LIS->getInstructionIndex(*MI).getRegSlot();
1047 // Account for register pressure similar to RegPressureTracker::recede().
1048 RegisterOperands RegOpers;
1049 RegOpers.collect(*MI, *TRI, *MRI, TrackLaneMasks, /*IgnoreDead=*/true);
1050 assert(RegOpers.DeadDefs.size() == 0);
1051 if (TrackLaneMasks)
1052 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx);
1053 else if (RequireIntervals)
1054 RegOpers.detectDeadDefs(*MI, *LIS);
1056 // Boost max pressure for all dead defs together.
1057 // Since CurrSetPressure and MaxSetPressure
1058 bumpDeadDefs(RegOpers.DeadDefs);
1060 // Kill liveness at live defs.
1061 for (const RegisterMaskPair &P : RegOpers.Defs) {
1062 Register Reg = P.RegUnit;
1063 LaneBitmask LiveLanes = LiveRegs.contains(Reg);
1064 LaneBitmask UseLanes = getRegLanes(RegOpers.Uses, Reg);
1065 LaneBitmask DefLanes = P.LaneMask;
1066 LaneBitmask LiveAfter = (LiveLanes & ~DefLanes) | UseLanes;
1067 decreaseRegPressure(Reg, LiveLanes, LiveAfter);
1069 // Generate liveness for uses.
1070 for (const RegisterMaskPair &P : RegOpers.Uses) {
1071 Register Reg = P.RegUnit;
1072 LaneBitmask LiveLanes = LiveRegs.contains(Reg);
1073 LaneBitmask LiveAfter = LiveLanes | P.LaneMask;
1074 increaseRegPressure(Reg, LiveLanes, LiveAfter);
1078 /// Consider the pressure increase caused by traversing this instruction
1079 /// bottom-up. Find the pressure set with the most change beyond its pressure
1080 /// limit based on the tracker's current pressure, and return the change in
1081 /// number of register units of that pressure set introduced by this
1082 /// instruction.
1084 /// This assumes that the current LiveOut set is sufficient.
1086 /// This is expensive for an on-the-fly query because it calls
1087 /// bumpUpwardPressure to recompute the pressure sets based on current
1088 /// liveness. This mainly exists to verify correctness, e.g. with
1089 /// -verify-misched. getUpwardPressureDelta is the fast version of this query
1090 /// that uses the per-SUnit cache of the PressureDiff.
1091 void RegPressureTracker::
1092 getMaxUpwardPressureDelta(const MachineInstr *MI, PressureDiff *PDiff,
1093 RegPressureDelta &Delta,
1094 ArrayRef<PressureChange> CriticalPSets,
1095 ArrayRef<unsigned> MaxPressureLimit) {
1096 // Snapshot Pressure.
1097 // FIXME: The snapshot heap space should persist. But I'm planning to
1098 // summarize the pressure effect so we don't need to snapshot at all.
1099 std::vector<unsigned> SavedPressure = CurrSetPressure;
1100 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure;
1102 bumpUpwardPressure(MI);
1104 computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI,
1105 LiveThruPressure);
1106 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets,
1107 MaxPressureLimit, Delta);
1108 assert(Delta.CriticalMax.getUnitInc() >= 0 &&
1109 Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure");
1111 // Restore the tracker's state.
1112 P.MaxSetPressure.swap(SavedMaxPressure);
1113 CurrSetPressure.swap(SavedPressure);
1115 #ifndef NDEBUG
1116 if (!PDiff)
1117 return;
1119 // Check if the alternate algorithm yields the same result.
1120 RegPressureDelta Delta2;
1121 getUpwardPressureDelta(MI, *PDiff, Delta2, CriticalPSets, MaxPressureLimit);
1122 if (Delta != Delta2) {
1123 dbgs() << "PDiff: ";
1124 PDiff->dump(*TRI);
1125 dbgs() << "DELTA: " << *MI;
1126 if (Delta.Excess.isValid())
1127 dbgs() << "Excess1 " << TRI->getRegPressureSetName(Delta.Excess.getPSet())
1128 << " " << Delta.Excess.getUnitInc() << "\n";
1129 if (Delta.CriticalMax.isValid())
1130 dbgs() << "Critic1 " << TRI->getRegPressureSetName(Delta.CriticalMax.getPSet())
1131 << " " << Delta.CriticalMax.getUnitInc() << "\n";
1132 if (Delta.CurrentMax.isValid())
1133 dbgs() << "CurrMx1 " << TRI->getRegPressureSetName(Delta.CurrentMax.getPSet())
1134 << " " << Delta.CurrentMax.getUnitInc() << "\n";
1135 if (Delta2.Excess.isValid())
1136 dbgs() << "Excess2 " << TRI->getRegPressureSetName(Delta2.Excess.getPSet())
1137 << " " << Delta2.Excess.getUnitInc() << "\n";
1138 if (Delta2.CriticalMax.isValid())
1139 dbgs() << "Critic2 " << TRI->getRegPressureSetName(Delta2.CriticalMax.getPSet())
1140 << " " << Delta2.CriticalMax.getUnitInc() << "\n";
1141 if (Delta2.CurrentMax.isValid())
1142 dbgs() << "CurrMx2 " << TRI->getRegPressureSetName(Delta2.CurrentMax.getPSet())
1143 << " " << Delta2.CurrentMax.getUnitInc() << "\n";
1144 llvm_unreachable("RegP Delta Mismatch");
1146 #endif
1149 /// This is the fast version of querying register pressure that does not
1150 /// directly depend on current liveness.
1152 /// @param Delta captures information needed for heuristics.
1154 /// @param CriticalPSets Are the pressure sets that are known to exceed some
1155 /// limit within the region, not necessarily at the current position.
1157 /// @param MaxPressureLimit Is the max pressure within the region, not
1158 /// necessarily at the current position.
1159 void RegPressureTracker::
1160 getUpwardPressureDelta(const MachineInstr *MI, /*const*/ PressureDiff &PDiff,
1161 RegPressureDelta &Delta,
1162 ArrayRef<PressureChange> CriticalPSets,
1163 ArrayRef<unsigned> MaxPressureLimit) const {
1164 unsigned CritIdx = 0, CritEnd = CriticalPSets.size();
1165 for (PressureDiff::const_iterator
1166 PDiffI = PDiff.begin(), PDiffE = PDiff.end();
1167 PDiffI != PDiffE && PDiffI->isValid(); ++PDiffI) {
1169 unsigned PSetID = PDiffI->getPSet();
1170 unsigned Limit = RCI->getRegPressureSetLimit(PSetID);
1171 if (!LiveThruPressure.empty())
1172 Limit += LiveThruPressure[PSetID];
1174 unsigned POld = CurrSetPressure[PSetID];
1175 unsigned MOld = P.MaxSetPressure[PSetID];
1176 unsigned MNew = MOld;
1177 // Ignore DeadDefs here because they aren't captured by PressureChange.
1178 unsigned PNew = POld + PDiffI->getUnitInc();
1179 assert((PDiffI->getUnitInc() >= 0) == (PNew >= POld)
1180 && "PSet overflow/underflow");
1181 if (PNew > MOld)
1182 MNew = PNew;
1183 // Check if current pressure has exceeded the limit.
1184 if (!Delta.Excess.isValid()) {
1185 unsigned ExcessInc = 0;
1186 if (PNew > Limit)
1187 ExcessInc = POld > Limit ? PNew - POld : PNew - Limit;
1188 else if (POld > Limit)
1189 ExcessInc = Limit - POld;
1190 if (ExcessInc) {
1191 Delta.Excess = PressureChange(PSetID);
1192 Delta.Excess.setUnitInc(ExcessInc);
1195 // Check if max pressure has exceeded a critical pressure set max.
1196 if (MNew == MOld)
1197 continue;
1198 if (!Delta.CriticalMax.isValid()) {
1199 while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < PSetID)
1200 ++CritIdx;
1202 if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == PSetID) {
1203 int CritInc = (int)MNew - (int)CriticalPSets[CritIdx].getUnitInc();
1204 if (CritInc > 0 && CritInc <= std::numeric_limits<int16_t>::max()) {
1205 Delta.CriticalMax = PressureChange(PSetID);
1206 Delta.CriticalMax.setUnitInc(CritInc);
1210 // Check if max pressure has exceeded the current max.
1211 if (!Delta.CurrentMax.isValid() && MNew > MaxPressureLimit[PSetID]) {
1212 Delta.CurrentMax = PressureChange(PSetID);
1213 Delta.CurrentMax.setUnitInc(MNew - MOld);
1218 /// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx).
1219 /// The query starts with a lane bitmask which gets lanes/bits removed for every
1220 /// use we find.
1221 static LaneBitmask findUseBetween(unsigned Reg, LaneBitmask LastUseMask,
1222 SlotIndex PriorUseIdx, SlotIndex NextUseIdx,
1223 const MachineRegisterInfo &MRI,
1224 const LiveIntervals *LIS) {
1225 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
1226 for (const MachineOperand &MO : MRI.use_nodbg_operands(Reg)) {
1227 if (MO.isUndef())
1228 continue;
1229 const MachineInstr *MI = MO.getParent();
1230 SlotIndex InstSlot = LIS->getInstructionIndex(*MI).getRegSlot();
1231 if (InstSlot >= PriorUseIdx && InstSlot < NextUseIdx) {
1232 unsigned SubRegIdx = MO.getSubReg();
1233 LaneBitmask UseMask = TRI.getSubRegIndexLaneMask(SubRegIdx);
1234 LastUseMask &= ~UseMask;
1235 if (LastUseMask.none())
1236 return LaneBitmask::getNone();
1239 return LastUseMask;
1242 LaneBitmask RegPressureTracker::getLiveLanesAt(Register RegUnit,
1243 SlotIndex Pos) const {
1244 assert(RequireIntervals);
1245 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit, Pos,
1246 LaneBitmask::getAll(),
1247 [](const LiveRange &LR, SlotIndex Pos) {
1248 return LR.liveAt(Pos);
1252 LaneBitmask RegPressureTracker::getLastUsedLanes(Register RegUnit,
1253 SlotIndex Pos) const {
1254 assert(RequireIntervals);
1255 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit,
1256 Pos.getBaseIndex(), LaneBitmask::getNone(),
1257 [](const LiveRange &LR, SlotIndex Pos) {
1258 const LiveRange::Segment *S = LR.getSegmentContaining(Pos);
1259 return S != nullptr && S->end == Pos.getRegSlot();
1263 LaneBitmask RegPressureTracker::getLiveThroughAt(Register RegUnit,
1264 SlotIndex Pos) const {
1265 assert(RequireIntervals);
1266 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit, Pos,
1267 LaneBitmask::getNone(),
1268 [](const LiveRange &LR, SlotIndex Pos) {
1269 const LiveRange::Segment *S = LR.getSegmentContaining(Pos);
1270 return S != nullptr && S->start < Pos.getRegSlot(true) &&
1271 S->end != Pos.getDeadSlot();
1275 /// Record the downward impact of a single instruction on current register
1276 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1277 /// not discover live in/outs.
1279 /// This is intended for speculative queries. It leaves pressure inconsistent
1280 /// with the current position, so must be restored by the caller.
1281 void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) {
1282 assert(!MI->isDebugOrPseudoInstr() && "Expect a nondebug instruction.");
1284 SlotIndex SlotIdx;
1285 if (RequireIntervals)
1286 SlotIdx = LIS->getInstructionIndex(*MI).getRegSlot();
1288 // Account for register pressure similar to RegPressureTracker::recede().
1289 RegisterOperands RegOpers;
1290 RegOpers.collect(*MI, *TRI, *MRI, TrackLaneMasks, false);
1291 if (TrackLaneMasks)
1292 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx);
1294 if (RequireIntervals) {
1295 for (const RegisterMaskPair &Use : RegOpers.Uses) {
1296 Register Reg = Use.RegUnit;
1297 LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx);
1298 if (LastUseMask.none())
1299 continue;
1300 // The LastUseMask is queried from the liveness information of instruction
1301 // which may be further down the schedule. Some lanes may actually not be
1302 // last uses for the current position.
1303 // FIXME: allow the caller to pass in the list of vreg uses that remain
1304 // to be bottom-scheduled to avoid searching uses at each query.
1305 SlotIndex CurrIdx = getCurrSlot();
1306 LastUseMask
1307 = findUseBetween(Reg, LastUseMask, CurrIdx, SlotIdx, *MRI, LIS);
1308 if (LastUseMask.none())
1309 continue;
1311 LaneBitmask LiveMask = LiveRegs.contains(Reg);
1312 LaneBitmask NewMask = LiveMask & ~LastUseMask;
1313 decreaseRegPressure(Reg, LiveMask, NewMask);
1317 // Generate liveness for defs.
1318 for (const RegisterMaskPair &Def : RegOpers.Defs) {
1319 Register Reg = Def.RegUnit;
1320 LaneBitmask LiveMask = LiveRegs.contains(Reg);
1321 LaneBitmask NewMask = LiveMask | Def.LaneMask;
1322 increaseRegPressure(Reg, LiveMask, NewMask);
1325 // Boost pressure for all dead defs together.
1326 bumpDeadDefs(RegOpers.DeadDefs);
1329 /// Consider the pressure increase caused by traversing this instruction
1330 /// top-down. Find the register class with the most change in its pressure limit
1331 /// based on the tracker's current pressure, and return the number of excess
1332 /// register units of that pressure set introduced by this instruction.
1334 /// This assumes that the current LiveIn set is sufficient.
1336 /// This is expensive for an on-the-fly query because it calls
1337 /// bumpDownwardPressure to recompute the pressure sets based on current
1338 /// liveness. We don't yet have a fast version of downward pressure tracking
1339 /// analogous to getUpwardPressureDelta.
1340 void RegPressureTracker::
1341 getMaxDownwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta,
1342 ArrayRef<PressureChange> CriticalPSets,
1343 ArrayRef<unsigned> MaxPressureLimit) {
1344 // Snapshot Pressure.
1345 std::vector<unsigned> SavedPressure = CurrSetPressure;
1346 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure;
1348 bumpDownwardPressure(MI);
1350 computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI,
1351 LiveThruPressure);
1352 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets,
1353 MaxPressureLimit, Delta);
1354 assert(Delta.CriticalMax.getUnitInc() >= 0 &&
1355 Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure");
1357 // Restore the tracker's state.
1358 P.MaxSetPressure.swap(SavedMaxPressure);
1359 CurrSetPressure.swap(SavedPressure);
1362 /// Get the pressure of each PSet after traversing this instruction bottom-up.
1363 void RegPressureTracker::
1364 getUpwardPressure(const MachineInstr *MI,
1365 std::vector<unsigned> &PressureResult,
1366 std::vector<unsigned> &MaxPressureResult) {
1367 // Snapshot pressure.
1368 PressureResult = CurrSetPressure;
1369 MaxPressureResult = P.MaxSetPressure;
1371 bumpUpwardPressure(MI);
1373 // Current pressure becomes the result. Restore current pressure.
1374 P.MaxSetPressure.swap(MaxPressureResult);
1375 CurrSetPressure.swap(PressureResult);
1378 /// Get the pressure of each PSet after traversing this instruction top-down.
1379 void RegPressureTracker::
1380 getDownwardPressure(const MachineInstr *MI,
1381 std::vector<unsigned> &PressureResult,
1382 std::vector<unsigned> &MaxPressureResult) {
1383 // Snapshot pressure.
1384 PressureResult = CurrSetPressure;
1385 MaxPressureResult = P.MaxSetPressure;
1387 bumpDownwardPressure(MI);
1389 // Current pressure becomes the result. Restore current pressure.
1390 P.MaxSetPressure.swap(MaxPressureResult);
1391 CurrSetPressure.swap(PressureResult);