1 //===- RegisterPressure.cpp - Dynamic Register Pressure -------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the RegisterPressure class which can be used to track
11 // MachineInstr level register pressure.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/CodeGen/RegisterPressure.h"
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/CodeGen/LiveInterval.h"
20 #include "llvm/CodeGen/LiveIntervals.h"
21 #include "llvm/CodeGen/MachineBasicBlock.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineInstr.h"
24 #include "llvm/CodeGen/MachineInstrBundle.h"
25 #include "llvm/CodeGen/MachineOperand.h"
26 #include "llvm/CodeGen/MachineRegisterInfo.h"
27 #include "llvm/CodeGen/RegisterClassInfo.h"
28 #include "llvm/CodeGen/SlotIndexes.h"
29 #include "llvm/CodeGen/TargetRegisterInfo.h"
30 #include "llvm/CodeGen/TargetSubtargetInfo.h"
31 #include "llvm/Config/llvm-config.h"
32 #include "llvm/MC/LaneBitmask.h"
33 #include "llvm/MC/MCRegisterInfo.h"
34 #include "llvm/Support/Compiler.h"
35 #include "llvm/Support/Debug.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include "llvm/Support/raw_ostream.h"
50 /// Increase pressure for each pressure set provided by TargetRegisterInfo.
51 static void increaseSetPressure(std::vector
<unsigned> &CurrSetPressure
,
52 const MachineRegisterInfo
&MRI
, unsigned Reg
,
53 LaneBitmask PrevMask
, LaneBitmask NewMask
) {
54 assert((PrevMask
& ~NewMask
).none() && "Must not remove bits");
55 if (PrevMask
.any() || NewMask
.none())
58 PSetIterator PSetI
= MRI
.getPressureSets(Reg
);
59 unsigned Weight
= PSetI
.getWeight();
60 for (; PSetI
.isValid(); ++PSetI
)
61 CurrSetPressure
[*PSetI
] += Weight
;
64 /// Decrease pressure for each pressure set provided by TargetRegisterInfo.
65 static void decreaseSetPressure(std::vector
<unsigned> &CurrSetPressure
,
66 const MachineRegisterInfo
&MRI
, unsigned Reg
,
67 LaneBitmask PrevMask
, LaneBitmask NewMask
) {
68 //assert((NewMask & !PrevMask) == 0 && "Must not add bits");
69 if (NewMask
.any() || PrevMask
.none())
72 PSetIterator PSetI
= MRI
.getPressureSets(Reg
);
73 unsigned Weight
= PSetI
.getWeight();
74 for (; PSetI
.isValid(); ++PSetI
) {
75 assert(CurrSetPressure
[*PSetI
] >= Weight
&& "register pressure underflow");
76 CurrSetPressure
[*PSetI
] -= Weight
;
80 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
82 void llvm::dumpRegSetPressure(ArrayRef
<unsigned> SetPressure
,
83 const TargetRegisterInfo
*TRI
) {
85 for (unsigned i
= 0, e
= SetPressure
.size(); i
< e
; ++i
) {
86 if (SetPressure
[i
] != 0) {
87 dbgs() << TRI
->getRegPressureSetName(i
) << "=" << SetPressure
[i
] << '\n';
96 void RegisterPressure::dump(const TargetRegisterInfo
*TRI
) const {
97 dbgs() << "Max Pressure: ";
98 dumpRegSetPressure(MaxSetPressure
, TRI
);
99 dbgs() << "Live In: ";
100 for (const RegisterMaskPair
&P
: LiveInRegs
) {
101 dbgs() << printVRegOrUnit(P
.RegUnit
, TRI
);
102 if (!P
.LaneMask
.all())
103 dbgs() << ':' << PrintLaneMask(P
.LaneMask
);
107 dbgs() << "Live Out: ";
108 for (const RegisterMaskPair
&P
: LiveOutRegs
) {
109 dbgs() << printVRegOrUnit(P
.RegUnit
, TRI
);
110 if (!P
.LaneMask
.all())
111 dbgs() << ':' << PrintLaneMask(P
.LaneMask
);
118 void RegPressureTracker::dump() const {
119 if (!isTopClosed() || !isBottomClosed()) {
120 dbgs() << "Curr Pressure: ";
121 dumpRegSetPressure(CurrSetPressure
, TRI
);
127 void PressureDiff::dump(const TargetRegisterInfo
&TRI
) const {
128 const char *sep
= "";
129 for (const PressureChange
&Change
: *this) {
130 if (!Change
.isValid())
132 dbgs() << sep
<< TRI
.getRegPressureSetName(Change
.getPSet())
133 << " " << Change
.getUnitInc();
140 void RegPressureTracker::increaseRegPressure(unsigned RegUnit
,
141 LaneBitmask PreviousMask
,
142 LaneBitmask NewMask
) {
143 if (PreviousMask
.any() || NewMask
.none())
146 PSetIterator PSetI
= MRI
->getPressureSets(RegUnit
);
147 unsigned Weight
= PSetI
.getWeight();
148 for (; PSetI
.isValid(); ++PSetI
) {
149 CurrSetPressure
[*PSetI
] += Weight
;
150 P
.MaxSetPressure
[*PSetI
] =
151 std::max(P
.MaxSetPressure
[*PSetI
], CurrSetPressure
[*PSetI
]);
155 void RegPressureTracker::decreaseRegPressure(unsigned RegUnit
,
156 LaneBitmask PreviousMask
,
157 LaneBitmask NewMask
) {
158 decreaseSetPressure(CurrSetPressure
, *MRI
, RegUnit
, PreviousMask
, NewMask
);
161 /// Clear the result so it can be used for another round of pressure tracking.
162 void IntervalPressure::reset() {
163 TopIdx
= BottomIdx
= SlotIndex();
164 MaxSetPressure
.clear();
169 /// Clear the result so it can be used for another round of pressure tracking.
170 void RegionPressure::reset() {
171 TopPos
= BottomPos
= MachineBasicBlock::const_iterator();
172 MaxSetPressure
.clear();
177 /// If the current top is not less than or equal to the next index, open it.
178 /// We happen to need the SlotIndex for the next top for pressure update.
179 void IntervalPressure::openTop(SlotIndex NextTop
) {
180 if (TopIdx
<= NextTop
)
182 TopIdx
= SlotIndex();
186 /// If the current top is the previous instruction (before receding), open it.
187 void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop
) {
188 if (TopPos
!= PrevTop
)
190 TopPos
= MachineBasicBlock::const_iterator();
194 /// If the current bottom is not greater than the previous index, open it.
195 void IntervalPressure::openBottom(SlotIndex PrevBottom
) {
196 if (BottomIdx
> PrevBottom
)
198 BottomIdx
= SlotIndex();
202 /// If the current bottom is the previous instr (before advancing), open it.
203 void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom
) {
204 if (BottomPos
!= PrevBottom
)
206 BottomPos
= MachineBasicBlock::const_iterator();
210 void LiveRegSet::init(const MachineRegisterInfo
&MRI
) {
211 const TargetRegisterInfo
&TRI
= *MRI
.getTargetRegisterInfo();
212 unsigned NumRegUnits
= TRI
.getNumRegs();
213 unsigned NumVirtRegs
= MRI
.getNumVirtRegs();
214 Regs
.setUniverse(NumRegUnits
+ NumVirtRegs
);
215 this->NumRegUnits
= NumRegUnits
;
218 void LiveRegSet::clear() {
222 static const LiveRange
*getLiveRange(const LiveIntervals
&LIS
, unsigned Reg
) {
223 if (TargetRegisterInfo::isVirtualRegister(Reg
))
224 return &LIS
.getInterval(Reg
);
225 return LIS
.getCachedRegUnit(Reg
);
228 void RegPressureTracker::reset() {
232 CurrSetPressure
.clear();
233 LiveThruPressure
.clear();
234 P
.MaxSetPressure
.clear();
236 if (RequireIntervals
)
237 static_cast<IntervalPressure
&>(P
).reset();
239 static_cast<RegionPressure
&>(P
).reset();
245 /// Setup the RegPressureTracker.
247 /// TODO: Add support for pressure without LiveIntervals.
248 void RegPressureTracker::init(const MachineFunction
*mf
,
249 const RegisterClassInfo
*rci
,
250 const LiveIntervals
*lis
,
251 const MachineBasicBlock
*mbb
,
252 MachineBasicBlock::const_iterator pos
,
253 bool TrackLaneMasks
, bool TrackUntiedDefs
) {
257 TRI
= MF
->getSubtarget().getRegisterInfo();
259 MRI
= &MF
->getRegInfo();
261 this->TrackUntiedDefs
= TrackUntiedDefs
;
262 this->TrackLaneMasks
= TrackLaneMasks
;
264 if (RequireIntervals
) {
265 assert(lis
&& "IntervalPressure requires LiveIntervals");
270 CurrSetPressure
.assign(TRI
->getNumRegPressureSets(), 0);
272 P
.MaxSetPressure
= CurrSetPressure
;
276 UntiedDefs
.setUniverse(MRI
->getNumVirtRegs());
279 /// Does this pressure result have a valid top position and live ins.
280 bool RegPressureTracker::isTopClosed() const {
281 if (RequireIntervals
)
282 return static_cast<IntervalPressure
&>(P
).TopIdx
.isValid();
283 return (static_cast<RegionPressure
&>(P
).TopPos
==
284 MachineBasicBlock::const_iterator());
287 /// Does this pressure result have a valid bottom position and live outs.
288 bool RegPressureTracker::isBottomClosed() const {
289 if (RequireIntervals
)
290 return static_cast<IntervalPressure
&>(P
).BottomIdx
.isValid();
291 return (static_cast<RegionPressure
&>(P
).BottomPos
==
292 MachineBasicBlock::const_iterator());
295 SlotIndex
RegPressureTracker::getCurrSlot() const {
296 MachineBasicBlock::const_iterator IdxPos
=
297 skipDebugInstructionsForward(CurrPos
, MBB
->end());
298 if (IdxPos
== MBB
->end())
299 return LIS
->getMBBEndIdx(MBB
);
300 return LIS
->getInstructionIndex(*IdxPos
).getRegSlot();
303 /// Set the boundary for the top of the region and summarize live ins.
304 void RegPressureTracker::closeTop() {
305 if (RequireIntervals
)
306 static_cast<IntervalPressure
&>(P
).TopIdx
= getCurrSlot();
308 static_cast<RegionPressure
&>(P
).TopPos
= CurrPos
;
310 assert(P
.LiveInRegs
.empty() && "inconsistent max pressure result");
311 P
.LiveInRegs
.reserve(LiveRegs
.size());
312 LiveRegs
.appendTo(P
.LiveInRegs
);
315 /// Set the boundary for the bottom of the region and summarize live outs.
316 void RegPressureTracker::closeBottom() {
317 if (RequireIntervals
)
318 static_cast<IntervalPressure
&>(P
).BottomIdx
= getCurrSlot();
320 static_cast<RegionPressure
&>(P
).BottomPos
= CurrPos
;
322 assert(P
.LiveOutRegs
.empty() && "inconsistent max pressure result");
323 P
.LiveOutRegs
.reserve(LiveRegs
.size());
324 LiveRegs
.appendTo(P
.LiveOutRegs
);
327 /// Finalize the region boundaries and record live ins and live outs.
328 void RegPressureTracker::closeRegion() {
329 if (!isTopClosed() && !isBottomClosed()) {
330 assert(LiveRegs
.size() == 0 && "no region boundary");
333 if (!isBottomClosed())
335 else if (!isTopClosed())
337 // If both top and bottom are closed, do nothing.
340 /// The register tracker is unaware of global liveness so ignores normal
341 /// live-thru ranges. However, two-address or coalesced chains can also lead
342 /// to live ranges with no holes. Count these to inform heuristics that we
343 /// can never drop below this pressure.
344 void RegPressureTracker::initLiveThru(const RegPressureTracker
&RPTracker
) {
345 LiveThruPressure
.assign(TRI
->getNumRegPressureSets(), 0);
346 assert(isBottomClosed() && "need bottom-up tracking to intialize.");
347 for (const RegisterMaskPair
&Pair
: P
.LiveOutRegs
) {
348 unsigned RegUnit
= Pair
.RegUnit
;
349 if (TargetRegisterInfo::isVirtualRegister(RegUnit
)
350 && !RPTracker
.hasUntiedDef(RegUnit
))
351 increaseSetPressure(LiveThruPressure
, *MRI
, RegUnit
,
352 LaneBitmask::getNone(), Pair
.LaneMask
);
356 static LaneBitmask
getRegLanes(ArrayRef
<RegisterMaskPair
> RegUnits
,
358 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
359 return Other
.RegUnit
== RegUnit
;
361 if (I
== RegUnits
.end())
362 return LaneBitmask::getNone();
366 static void addRegLanes(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
367 RegisterMaskPair Pair
) {
368 unsigned RegUnit
= Pair
.RegUnit
;
369 assert(Pair
.LaneMask
.any());
370 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
371 return Other
.RegUnit
== RegUnit
;
373 if (I
== RegUnits
.end()) {
374 RegUnits
.push_back(Pair
);
376 I
->LaneMask
|= Pair
.LaneMask
;
380 static void setRegZero(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
382 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
383 return Other
.RegUnit
== RegUnit
;
385 if (I
== RegUnits
.end()) {
386 RegUnits
.push_back(RegisterMaskPair(RegUnit
, LaneBitmask::getNone()));
388 I
->LaneMask
= LaneBitmask::getNone();
392 static void removeRegLanes(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
393 RegisterMaskPair Pair
) {
394 unsigned RegUnit
= Pair
.RegUnit
;
395 assert(Pair
.LaneMask
.any());
396 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
397 return Other
.RegUnit
== RegUnit
;
399 if (I
!= RegUnits
.end()) {
400 I
->LaneMask
&= ~Pair
.LaneMask
;
401 if (I
->LaneMask
.none())
406 static LaneBitmask
getLanesWithProperty(const LiveIntervals
&LIS
,
407 const MachineRegisterInfo
&MRI
, bool TrackLaneMasks
, unsigned RegUnit
,
408 SlotIndex Pos
, LaneBitmask SafeDefault
,
409 bool(*Property
)(const LiveRange
&LR
, SlotIndex Pos
)) {
410 if (TargetRegisterInfo::isVirtualRegister(RegUnit
)) {
411 const LiveInterval
&LI
= LIS
.getInterval(RegUnit
);
413 if (TrackLaneMasks
&& LI
.hasSubRanges()) {
414 for (const LiveInterval::SubRange
&SR
: LI
.subranges()) {
415 if (Property(SR
, Pos
))
416 Result
|= SR
.LaneMask
;
418 } else if (Property(LI
, Pos
)) {
419 Result
= TrackLaneMasks
? MRI
.getMaxLaneMaskForVReg(RegUnit
)
420 : LaneBitmask::getAll();
425 const LiveRange
*LR
= LIS
.getCachedRegUnit(RegUnit
);
426 // Be prepared for missing liveranges: We usually do not compute liveranges
427 // for physical registers on targets with many registers (GPUs).
430 return Property(*LR
, Pos
) ? LaneBitmask::getAll() : LaneBitmask::getNone();
434 static LaneBitmask
getLiveLanesAt(const LiveIntervals
&LIS
,
435 const MachineRegisterInfo
&MRI
,
436 bool TrackLaneMasks
, unsigned RegUnit
,
438 return getLanesWithProperty(LIS
, MRI
, TrackLaneMasks
, RegUnit
, Pos
,
439 LaneBitmask::getAll(),
440 [](const LiveRange
&LR
, SlotIndex Pos
) {
441 return LR
.liveAt(Pos
);
448 /// Collect this instruction's unique uses and defs into SmallVectors for
449 /// processing defs and uses in order.
451 /// FIXME: always ignore tied opers
452 class RegisterOperandsCollector
{
453 friend class llvm::RegisterOperands
;
455 RegisterOperands
&RegOpers
;
456 const TargetRegisterInfo
&TRI
;
457 const MachineRegisterInfo
&MRI
;
460 RegisterOperandsCollector(RegisterOperands
&RegOpers
,
461 const TargetRegisterInfo
&TRI
,
462 const MachineRegisterInfo
&MRI
, bool IgnoreDead
)
463 : RegOpers(RegOpers
), TRI(TRI
), MRI(MRI
), IgnoreDead(IgnoreDead
) {}
465 void collectInstr(const MachineInstr
&MI
) const {
466 for (ConstMIBundleOperands
OperI(MI
); OperI
.isValid(); ++OperI
)
467 collectOperand(*OperI
);
469 // Remove redundant physreg dead defs.
470 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
471 removeRegLanes(RegOpers
.DeadDefs
, P
);
474 void collectInstrLanes(const MachineInstr
&MI
) const {
475 for (ConstMIBundleOperands
OperI(MI
); OperI
.isValid(); ++OperI
)
476 collectOperandLanes(*OperI
);
478 // Remove redundant physreg dead defs.
479 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
480 removeRegLanes(RegOpers
.DeadDefs
, P
);
483 /// Push this operand's register onto the correct vectors.
484 void collectOperand(const MachineOperand
&MO
) const {
485 if (!MO
.isReg() || !MO
.getReg())
487 unsigned Reg
= MO
.getReg();
489 if (!MO
.isUndef() && !MO
.isInternalRead())
490 pushReg(Reg
, RegOpers
.Uses
);
493 // Subregister definitions may imply a register read.
495 pushReg(Reg
, RegOpers
.Uses
);
499 pushReg(Reg
, RegOpers
.DeadDefs
);
501 pushReg(Reg
, RegOpers
.Defs
);
505 void pushReg(unsigned Reg
,
506 SmallVectorImpl
<RegisterMaskPair
> &RegUnits
) const {
507 if (TargetRegisterInfo::isVirtualRegister(Reg
)) {
508 addRegLanes(RegUnits
, RegisterMaskPair(Reg
, LaneBitmask::getAll()));
509 } else if (MRI
.isAllocatable(Reg
)) {
510 for (MCRegUnitIterator
Units(Reg
, &TRI
); Units
.isValid(); ++Units
)
511 addRegLanes(RegUnits
, RegisterMaskPair(*Units
, LaneBitmask::getAll()));
515 void collectOperandLanes(const MachineOperand
&MO
) const {
516 if (!MO
.isReg() || !MO
.getReg())
518 unsigned Reg
= MO
.getReg();
519 unsigned SubRegIdx
= MO
.getSubReg();
521 if (!MO
.isUndef() && !MO
.isInternalRead())
522 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.Uses
);
525 // Treat read-undef subreg defs as definitions of the whole register.
531 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.DeadDefs
);
533 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.Defs
);
537 void pushRegLanes(unsigned Reg
, unsigned SubRegIdx
,
538 SmallVectorImpl
<RegisterMaskPair
> &RegUnits
) const {
539 if (TargetRegisterInfo::isVirtualRegister(Reg
)) {
540 LaneBitmask LaneMask
= SubRegIdx
!= 0
541 ? TRI
.getSubRegIndexLaneMask(SubRegIdx
)
542 : MRI
.getMaxLaneMaskForVReg(Reg
);
543 addRegLanes(RegUnits
, RegisterMaskPair(Reg
, LaneMask
));
544 } else if (MRI
.isAllocatable(Reg
)) {
545 for (MCRegUnitIterator
Units(Reg
, &TRI
); Units
.isValid(); ++Units
)
546 addRegLanes(RegUnits
, RegisterMaskPair(*Units
, LaneBitmask::getAll()));
551 } // end anonymous namespace
553 void RegisterOperands::collect(const MachineInstr
&MI
,
554 const TargetRegisterInfo
&TRI
,
555 const MachineRegisterInfo
&MRI
,
556 bool TrackLaneMasks
, bool IgnoreDead
) {
557 RegisterOperandsCollector
Collector(*this, TRI
, MRI
, IgnoreDead
);
559 Collector
.collectInstrLanes(MI
);
561 Collector
.collectInstr(MI
);
564 void RegisterOperands::detectDeadDefs(const MachineInstr
&MI
,
565 const LiveIntervals
&LIS
) {
566 SlotIndex SlotIdx
= LIS
.getInstructionIndex(MI
);
567 for (auto RI
= Defs
.begin(); RI
!= Defs
.end(); /*empty*/) {
568 unsigned Reg
= RI
->RegUnit
;
569 const LiveRange
*LR
= getLiveRange(LIS
, Reg
);
571 LiveQueryResult LRQ
= LR
->Query(SlotIdx
);
572 if (LRQ
.isDeadDef()) {
573 // LiveIntervals knows this is a dead even though it's MachineOperand is
574 // not flagged as such.
575 DeadDefs
.push_back(*RI
);
584 void RegisterOperands::adjustLaneLiveness(const LiveIntervals
&LIS
,
585 const MachineRegisterInfo
&MRI
,
587 MachineInstr
*AddFlagsMI
) {
588 for (auto I
= Defs
.begin(); I
!= Defs
.end(); ) {
589 LaneBitmask LiveAfter
= getLiveLanesAt(LIS
, MRI
, true, I
->RegUnit
,
591 // If the def is all that is live after the instruction, then in case
592 // of a subregister def we need a read-undef flag.
593 unsigned RegUnit
= I
->RegUnit
;
594 if (TargetRegisterInfo::isVirtualRegister(RegUnit
) &&
595 AddFlagsMI
!= nullptr && (LiveAfter
& ~I
->LaneMask
).none())
596 AddFlagsMI
->setRegisterDefReadUndef(RegUnit
);
598 LaneBitmask ActualDef
= I
->LaneMask
& LiveAfter
;
599 if (ActualDef
.none()) {
602 I
->LaneMask
= ActualDef
;
606 for (auto I
= Uses
.begin(); I
!= Uses
.end(); ) {
607 LaneBitmask LiveBefore
= getLiveLanesAt(LIS
, MRI
, true, I
->RegUnit
,
609 LaneBitmask LaneMask
= I
->LaneMask
& LiveBefore
;
610 if (LaneMask
.none()) {
613 I
->LaneMask
= LaneMask
;
617 if (AddFlagsMI
!= nullptr) {
618 for (const RegisterMaskPair
&P
: DeadDefs
) {
619 unsigned RegUnit
= P
.RegUnit
;
620 if (!TargetRegisterInfo::isVirtualRegister(RegUnit
))
622 LaneBitmask LiveAfter
= getLiveLanesAt(LIS
, MRI
, true, RegUnit
,
624 if (LiveAfter
.none())
625 AddFlagsMI
->setRegisterDefReadUndef(RegUnit
);
630 /// Initialize an array of N PressureDiffs.
631 void PressureDiffs::init(unsigned N
) {
634 memset(PDiffArray
, 0, N
* sizeof(PressureDiff
));
639 PDiffArray
= static_cast<PressureDiff
*>(safe_calloc(N
, sizeof(PressureDiff
)));
642 void PressureDiffs::addInstruction(unsigned Idx
,
643 const RegisterOperands
&RegOpers
,
644 const MachineRegisterInfo
&MRI
) {
645 PressureDiff
&PDiff
= (*this)[Idx
];
646 assert(!PDiff
.begin()->isValid() && "stale PDiff");
647 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
648 PDiff
.addPressureChange(P
.RegUnit
, true, &MRI
);
650 for (const RegisterMaskPair
&P
: RegOpers
.Uses
)
651 PDiff
.addPressureChange(P
.RegUnit
, false, &MRI
);
654 /// Add a change in pressure to the pressure diff of a given instruction.
655 void PressureDiff::addPressureChange(unsigned RegUnit
, bool IsDec
,
656 const MachineRegisterInfo
*MRI
) {
657 PSetIterator PSetI
= MRI
->getPressureSets(RegUnit
);
658 int Weight
= IsDec
? -PSetI
.getWeight() : PSetI
.getWeight();
659 for (; PSetI
.isValid(); ++PSetI
) {
660 // Find an existing entry in the pressure diff for this PSet.
661 PressureDiff::iterator I
= nonconst_begin(), E
= nonconst_end();
662 for (; I
!= E
&& I
->isValid(); ++I
) {
663 if (I
->getPSet() >= *PSetI
)
666 // If all pressure sets are more constrained, skip the remaining PSets.
669 // Insert this PressureChange.
670 if (!I
->isValid() || I
->getPSet() != *PSetI
) {
671 PressureChange PTmp
= PressureChange(*PSetI
);
672 for (PressureDiff::iterator J
= I
; J
!= E
&& PTmp
.isValid(); ++J
)
675 // Update the units for this pressure set.
676 unsigned NewUnitInc
= I
->getUnitInc() + Weight
;
677 if (NewUnitInc
!= 0) {
678 I
->setUnitInc(NewUnitInc
);
681 PressureDiff::iterator J
;
682 for (J
= std::next(I
); J
!= E
&& J
->isValid(); ++J
, ++I
)
684 *I
= PressureChange();
689 /// Force liveness of registers.
690 void RegPressureTracker::addLiveRegs(ArrayRef
<RegisterMaskPair
> Regs
) {
691 for (const RegisterMaskPair
&P
: Regs
) {
692 LaneBitmask PrevMask
= LiveRegs
.insert(P
);
693 LaneBitmask NewMask
= PrevMask
| P
.LaneMask
;
694 increaseRegPressure(P
.RegUnit
, PrevMask
, NewMask
);
698 void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair
,
699 SmallVectorImpl
<RegisterMaskPair
> &LiveInOrOut
) {
700 assert(Pair
.LaneMask
.any());
702 unsigned RegUnit
= Pair
.RegUnit
;
703 auto I
= llvm::find_if(LiveInOrOut
, [RegUnit
](const RegisterMaskPair
&Other
) {
704 return Other
.RegUnit
== RegUnit
;
706 LaneBitmask PrevMask
;
708 if (I
== LiveInOrOut
.end()) {
709 PrevMask
= LaneBitmask::getNone();
710 NewMask
= Pair
.LaneMask
;
711 LiveInOrOut
.push_back(Pair
);
713 PrevMask
= I
->LaneMask
;
714 NewMask
= PrevMask
| Pair
.LaneMask
;
715 I
->LaneMask
= NewMask
;
717 increaseSetPressure(P
.MaxSetPressure
, *MRI
, RegUnit
, PrevMask
, NewMask
);
720 void RegPressureTracker::discoverLiveIn(RegisterMaskPair Pair
) {
721 discoverLiveInOrOut(Pair
, P
.LiveInRegs
);
724 void RegPressureTracker::discoverLiveOut(RegisterMaskPair Pair
) {
725 discoverLiveInOrOut(Pair
, P
.LiveOutRegs
);
728 void RegPressureTracker::bumpDeadDefs(ArrayRef
<RegisterMaskPair
> DeadDefs
) {
729 for (const RegisterMaskPair
&P
: DeadDefs
) {
730 unsigned Reg
= P
.RegUnit
;
731 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
732 LaneBitmask BumpedMask
= LiveMask
| P
.LaneMask
;
733 increaseRegPressure(Reg
, LiveMask
, BumpedMask
);
735 for (const RegisterMaskPair
&P
: DeadDefs
) {
736 unsigned Reg
= P
.RegUnit
;
737 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
738 LaneBitmask BumpedMask
= LiveMask
| P
.LaneMask
;
739 decreaseRegPressure(Reg
, BumpedMask
, LiveMask
);
743 /// Recede across the previous instruction. If LiveUses is provided, record any
744 /// RegUnits that are made live by the current instruction's uses. This includes
745 /// registers that are both defined and used by the instruction. If a pressure
746 /// difference pointer is provided record the changes is pressure caused by this
747 /// instruction independent of liveness.
748 void RegPressureTracker::recede(const RegisterOperands
&RegOpers
,
749 SmallVectorImpl
<RegisterMaskPair
> *LiveUses
) {
750 assert(!CurrPos
->isDebugInstr());
752 // Boost pressure for all dead defs together.
753 bumpDeadDefs(RegOpers
.DeadDefs
);
755 // Kill liveness at live defs.
756 // TODO: consider earlyclobbers?
757 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
758 unsigned Reg
= Def
.RegUnit
;
760 LaneBitmask PreviousMask
= LiveRegs
.erase(Def
);
761 LaneBitmask NewMask
= PreviousMask
& ~Def
.LaneMask
;
763 LaneBitmask LiveOut
= Def
.LaneMask
& ~PreviousMask
;
765 discoverLiveOut(RegisterMaskPair(Reg
, LiveOut
));
766 // Retroactively model effects on pressure of the live out lanes.
767 increaseSetPressure(CurrSetPressure
, *MRI
, Reg
, LaneBitmask::getNone(),
769 PreviousMask
= LiveOut
;
772 if (NewMask
.none()) {
773 // Add a 0 entry to LiveUses as a marker that the complete vreg has become
775 if (TrackLaneMasks
&& LiveUses
!= nullptr)
776 setRegZero(*LiveUses
, Reg
);
779 decreaseRegPressure(Reg
, PreviousMask
, NewMask
);
783 if (RequireIntervals
)
784 SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
786 // Generate liveness for uses.
787 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
788 unsigned Reg
= Use
.RegUnit
;
789 assert(Use
.LaneMask
.any());
790 LaneBitmask PreviousMask
= LiveRegs
.insert(Use
);
791 LaneBitmask NewMask
= PreviousMask
| Use
.LaneMask
;
792 if (NewMask
== PreviousMask
)
795 // Did the register just become live?
796 if (PreviousMask
.none()) {
797 if (LiveUses
!= nullptr) {
798 if (!TrackLaneMasks
) {
799 addRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
802 llvm::find_if(*LiveUses
, [Reg
](const RegisterMaskPair Other
) {
803 return Other
.RegUnit
== Reg
;
805 bool IsRedef
= I
!= LiveUses
->end();
807 // ignore re-defs here...
808 assert(I
->LaneMask
.none());
809 removeRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
811 addRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
816 // Discover live outs if this may be the first occurance of this register.
817 if (RequireIntervals
) {
818 LaneBitmask LiveOut
= getLiveThroughAt(Reg
, SlotIdx
);
820 discoverLiveOut(RegisterMaskPair(Reg
, LiveOut
));
824 increaseRegPressure(Reg
, PreviousMask
, NewMask
);
826 if (TrackUntiedDefs
) {
827 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
828 unsigned RegUnit
= Def
.RegUnit
;
829 if (TargetRegisterInfo::isVirtualRegister(RegUnit
) &&
830 (LiveRegs
.contains(RegUnit
) & Def
.LaneMask
).none())
831 UntiedDefs
.insert(RegUnit
);
836 void RegPressureTracker::recedeSkipDebugValues() {
837 assert(CurrPos
!= MBB
->begin());
838 if (!isBottomClosed())
841 // Open the top of the region using block iterators.
842 if (!RequireIntervals
&& isTopClosed())
843 static_cast<RegionPressure
&>(P
).openTop(CurrPos
);
845 // Find the previous instruction.
846 CurrPos
= skipDebugInstructionsBackward(std::prev(CurrPos
), MBB
->begin());
849 if (RequireIntervals
)
850 SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
852 // Open the top of the region using slot indexes.
853 if (RequireIntervals
&& isTopClosed())
854 static_cast<IntervalPressure
&>(P
).openTop(SlotIdx
);
857 void RegPressureTracker::recede(SmallVectorImpl
<RegisterMaskPair
> *LiveUses
) {
858 recedeSkipDebugValues();
860 const MachineInstr
&MI
= *CurrPos
;
861 RegisterOperands RegOpers
;
862 RegOpers
.collect(MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
863 if (TrackLaneMasks
) {
864 SlotIndex SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
865 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
866 } else if (RequireIntervals
) {
867 RegOpers
.detectDeadDefs(MI
, *LIS
);
870 recede(RegOpers
, LiveUses
);
873 /// Advance across the current instruction.
874 void RegPressureTracker::advance(const RegisterOperands
&RegOpers
) {
875 assert(!TrackUntiedDefs
&& "unsupported mode");
876 assert(CurrPos
!= MBB
->end());
881 if (RequireIntervals
)
882 SlotIdx
= getCurrSlot();
884 // Open the bottom of the region using slot indexes.
885 if (isBottomClosed()) {
886 if (RequireIntervals
)
887 static_cast<IntervalPressure
&>(P
).openBottom(SlotIdx
);
889 static_cast<RegionPressure
&>(P
).openBottom(CurrPos
);
892 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
893 unsigned Reg
= Use
.RegUnit
;
894 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
895 LaneBitmask LiveIn
= Use
.LaneMask
& ~LiveMask
;
897 discoverLiveIn(RegisterMaskPair(Reg
, LiveIn
));
898 increaseRegPressure(Reg
, LiveMask
, LiveMask
| LiveIn
);
899 LiveRegs
.insert(RegisterMaskPair(Reg
, LiveIn
));
901 // Kill liveness at last uses.
902 if (RequireIntervals
) {
903 LaneBitmask LastUseMask
= getLastUsedLanes(Reg
, SlotIdx
);
904 if (LastUseMask
.any()) {
905 LiveRegs
.erase(RegisterMaskPair(Reg
, LastUseMask
));
906 decreaseRegPressure(Reg
, LiveMask
, LiveMask
& ~LastUseMask
);
911 // Generate liveness for defs.
912 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
913 LaneBitmask PreviousMask
= LiveRegs
.insert(Def
);
914 LaneBitmask NewMask
= PreviousMask
| Def
.LaneMask
;
915 increaseRegPressure(Def
.RegUnit
, PreviousMask
, NewMask
);
918 // Boost pressure for all dead defs together.
919 bumpDeadDefs(RegOpers
.DeadDefs
);
921 // Find the next instruction.
922 CurrPos
= skipDebugInstructionsForward(std::next(CurrPos
), MBB
->end());
925 void RegPressureTracker::advance() {
926 const MachineInstr
&MI
= *CurrPos
;
927 RegisterOperands RegOpers
;
928 RegOpers
.collect(MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
929 if (TrackLaneMasks
) {
930 SlotIndex SlotIdx
= getCurrSlot();
931 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
936 /// Find the max change in excess pressure across all sets.
937 static void computeExcessPressureDelta(ArrayRef
<unsigned> OldPressureVec
,
938 ArrayRef
<unsigned> NewPressureVec
,
939 RegPressureDelta
&Delta
,
940 const RegisterClassInfo
*RCI
,
941 ArrayRef
<unsigned> LiveThruPressureVec
) {
942 Delta
.Excess
= PressureChange();
943 for (unsigned i
= 0, e
= OldPressureVec
.size(); i
< e
; ++i
) {
944 unsigned POld
= OldPressureVec
[i
];
945 unsigned PNew
= NewPressureVec
[i
];
946 int PDiff
= (int)PNew
- (int)POld
;
947 if (!PDiff
) // No change in this set in the common case.
949 // Only consider change beyond the limit.
950 unsigned Limit
= RCI
->getRegPressureSetLimit(i
);
951 if (!LiveThruPressureVec
.empty())
952 Limit
+= LiveThruPressureVec
[i
];
956 PDiff
= 0; // Under the limit
958 PDiff
= PNew
- Limit
; // Just exceeded limit.
959 } else if (Limit
> PNew
)
960 PDiff
= Limit
- POld
; // Just obeyed limit.
963 Delta
.Excess
= PressureChange(i
);
964 Delta
.Excess
.setUnitInc(PDiff
);
970 /// Find the max change in max pressure that either surpasses a critical PSet
971 /// limit or exceeds the current MaxPressureLimit.
973 /// FIXME: comparing each element of the old and new MaxPressure vectors here is
974 /// silly. It's done now to demonstrate the concept but will go away with a
975 /// RegPressureTracker API change to work with pressure differences.
976 static void computeMaxPressureDelta(ArrayRef
<unsigned> OldMaxPressureVec
,
977 ArrayRef
<unsigned> NewMaxPressureVec
,
978 ArrayRef
<PressureChange
> CriticalPSets
,
979 ArrayRef
<unsigned> MaxPressureLimit
,
980 RegPressureDelta
&Delta
) {
981 Delta
.CriticalMax
= PressureChange();
982 Delta
.CurrentMax
= PressureChange();
984 unsigned CritIdx
= 0, CritEnd
= CriticalPSets
.size();
985 for (unsigned i
= 0, e
= OldMaxPressureVec
.size(); i
< e
; ++i
) {
986 unsigned POld
= OldMaxPressureVec
[i
];
987 unsigned PNew
= NewMaxPressureVec
[i
];
988 if (PNew
== POld
) // No change in this set in the common case.
991 if (!Delta
.CriticalMax
.isValid()) {
992 while (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() < i
)
995 if (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() == i
) {
996 int PDiff
= (int)PNew
- (int)CriticalPSets
[CritIdx
].getUnitInc();
998 Delta
.CriticalMax
= PressureChange(i
);
999 Delta
.CriticalMax
.setUnitInc(PDiff
);
1003 // Find the first increase above MaxPressureLimit.
1004 // (Ignores negative MDiff).
1005 if (!Delta
.CurrentMax
.isValid() && PNew
> MaxPressureLimit
[i
]) {
1006 Delta
.CurrentMax
= PressureChange(i
);
1007 Delta
.CurrentMax
.setUnitInc(PNew
- POld
);
1008 if (CritIdx
== CritEnd
|| Delta
.CriticalMax
.isValid())
1014 /// Record the upward impact of a single instruction on current register
1015 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1016 /// not discover live in/outs.
1018 /// This is intended for speculative queries. It leaves pressure inconsistent
1019 /// with the current position, so must be restored by the caller.
1020 void RegPressureTracker::bumpUpwardPressure(const MachineInstr
*MI
) {
1021 assert(!MI
->isDebugInstr() && "Expect a nondebug instruction.");
1024 if (RequireIntervals
)
1025 SlotIdx
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1027 // Account for register pressure similar to RegPressureTracker::recede().
1028 RegisterOperands RegOpers
;
1029 RegOpers
.collect(*MI
, *TRI
, *MRI
, TrackLaneMasks
, /*IgnoreDead=*/true);
1030 assert(RegOpers
.DeadDefs
.size() == 0);
1032 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
1033 else if (RequireIntervals
)
1034 RegOpers
.detectDeadDefs(*MI
, *LIS
);
1036 // Boost max pressure for all dead defs together.
1037 // Since CurrSetPressure and MaxSetPressure
1038 bumpDeadDefs(RegOpers
.DeadDefs
);
1040 // Kill liveness at live defs.
1041 for (const RegisterMaskPair
&P
: RegOpers
.Defs
) {
1042 unsigned Reg
= P
.RegUnit
;
1043 LaneBitmask LiveLanes
= LiveRegs
.contains(Reg
);
1044 LaneBitmask UseLanes
= getRegLanes(RegOpers
.Uses
, Reg
);
1045 LaneBitmask DefLanes
= P
.LaneMask
;
1046 LaneBitmask LiveAfter
= (LiveLanes
& ~DefLanes
) | UseLanes
;
1047 decreaseRegPressure(Reg
, LiveLanes
, LiveAfter
);
1049 // Generate liveness for uses.
1050 for (const RegisterMaskPair
&P
: RegOpers
.Uses
) {
1051 unsigned Reg
= P
.RegUnit
;
1052 LaneBitmask LiveLanes
= LiveRegs
.contains(Reg
);
1053 LaneBitmask LiveAfter
= LiveLanes
| P
.LaneMask
;
1054 increaseRegPressure(Reg
, LiveLanes
, LiveAfter
);
1058 /// Consider the pressure increase caused by traversing this instruction
1059 /// bottom-up. Find the pressure set with the most change beyond its pressure
1060 /// limit based on the tracker's current pressure, and return the change in
1061 /// number of register units of that pressure set introduced by this
1064 /// This assumes that the current LiveOut set is sufficient.
1066 /// This is expensive for an on-the-fly query because it calls
1067 /// bumpUpwardPressure to recompute the pressure sets based on current
1068 /// liveness. This mainly exists to verify correctness, e.g. with
1069 /// -verify-misched. getUpwardPressureDelta is the fast version of this query
1070 /// that uses the per-SUnit cache of the PressureDiff.
1071 void RegPressureTracker::
1072 getMaxUpwardPressureDelta(const MachineInstr
*MI
, PressureDiff
*PDiff
,
1073 RegPressureDelta
&Delta
,
1074 ArrayRef
<PressureChange
> CriticalPSets
,
1075 ArrayRef
<unsigned> MaxPressureLimit
) {
1076 // Snapshot Pressure.
1077 // FIXME: The snapshot heap space should persist. But I'm planning to
1078 // summarize the pressure effect so we don't need to snapshot at all.
1079 std::vector
<unsigned> SavedPressure
= CurrSetPressure
;
1080 std::vector
<unsigned> SavedMaxPressure
= P
.MaxSetPressure
;
1082 bumpUpwardPressure(MI
);
1084 computeExcessPressureDelta(SavedPressure
, CurrSetPressure
, Delta
, RCI
,
1086 computeMaxPressureDelta(SavedMaxPressure
, P
.MaxSetPressure
, CriticalPSets
,
1087 MaxPressureLimit
, Delta
);
1088 assert(Delta
.CriticalMax
.getUnitInc() >= 0 &&
1089 Delta
.CurrentMax
.getUnitInc() >= 0 && "cannot decrease max pressure");
1091 // Restore the tracker's state.
1092 P
.MaxSetPressure
.swap(SavedMaxPressure
);
1093 CurrSetPressure
.swap(SavedPressure
);
1099 // Check if the alternate algorithm yields the same result.
1100 RegPressureDelta Delta2
;
1101 getUpwardPressureDelta(MI
, *PDiff
, Delta2
, CriticalPSets
, MaxPressureLimit
);
1102 if (Delta
!= Delta2
) {
1103 dbgs() << "PDiff: ";
1105 dbgs() << "DELTA: " << *MI
;
1106 if (Delta
.Excess
.isValid())
1107 dbgs() << "Excess1 " << TRI
->getRegPressureSetName(Delta
.Excess
.getPSet())
1108 << " " << Delta
.Excess
.getUnitInc() << "\n";
1109 if (Delta
.CriticalMax
.isValid())
1110 dbgs() << "Critic1 " << TRI
->getRegPressureSetName(Delta
.CriticalMax
.getPSet())
1111 << " " << Delta
.CriticalMax
.getUnitInc() << "\n";
1112 if (Delta
.CurrentMax
.isValid())
1113 dbgs() << "CurrMx1 " << TRI
->getRegPressureSetName(Delta
.CurrentMax
.getPSet())
1114 << " " << Delta
.CurrentMax
.getUnitInc() << "\n";
1115 if (Delta2
.Excess
.isValid())
1116 dbgs() << "Excess2 " << TRI
->getRegPressureSetName(Delta2
.Excess
.getPSet())
1117 << " " << Delta2
.Excess
.getUnitInc() << "\n";
1118 if (Delta2
.CriticalMax
.isValid())
1119 dbgs() << "Critic2 " << TRI
->getRegPressureSetName(Delta2
.CriticalMax
.getPSet())
1120 << " " << Delta2
.CriticalMax
.getUnitInc() << "\n";
1121 if (Delta2
.CurrentMax
.isValid())
1122 dbgs() << "CurrMx2 " << TRI
->getRegPressureSetName(Delta2
.CurrentMax
.getPSet())
1123 << " " << Delta2
.CurrentMax
.getUnitInc() << "\n";
1124 llvm_unreachable("RegP Delta Mismatch");
1129 /// This is the fast version of querying register pressure that does not
1130 /// directly depend on current liveness.
1132 /// @param Delta captures information needed for heuristics.
1134 /// @param CriticalPSets Are the pressure sets that are known to exceed some
1135 /// limit within the region, not necessarily at the current position.
1137 /// @param MaxPressureLimit Is the max pressure within the region, not
1138 /// necessarily at the current position.
1139 void RegPressureTracker::
1140 getUpwardPressureDelta(const MachineInstr
*MI
, /*const*/ PressureDiff
&PDiff
,
1141 RegPressureDelta
&Delta
,
1142 ArrayRef
<PressureChange
> CriticalPSets
,
1143 ArrayRef
<unsigned> MaxPressureLimit
) const {
1144 unsigned CritIdx
= 0, CritEnd
= CriticalPSets
.size();
1145 for (PressureDiff::const_iterator
1146 PDiffI
= PDiff
.begin(), PDiffE
= PDiff
.end();
1147 PDiffI
!= PDiffE
&& PDiffI
->isValid(); ++PDiffI
) {
1149 unsigned PSetID
= PDiffI
->getPSet();
1150 unsigned Limit
= RCI
->getRegPressureSetLimit(PSetID
);
1151 if (!LiveThruPressure
.empty())
1152 Limit
+= LiveThruPressure
[PSetID
];
1154 unsigned POld
= CurrSetPressure
[PSetID
];
1155 unsigned MOld
= P
.MaxSetPressure
[PSetID
];
1156 unsigned MNew
= MOld
;
1157 // Ignore DeadDefs here because they aren't captured by PressureChange.
1158 unsigned PNew
= POld
+ PDiffI
->getUnitInc();
1159 assert((PDiffI
->getUnitInc() >= 0) == (PNew
>= POld
)
1160 && "PSet overflow/underflow");
1163 // Check if current pressure has exceeded the limit.
1164 if (!Delta
.Excess
.isValid()) {
1165 unsigned ExcessInc
= 0;
1167 ExcessInc
= POld
> Limit
? PNew
- POld
: PNew
- Limit
;
1168 else if (POld
> Limit
)
1169 ExcessInc
= Limit
- POld
;
1171 Delta
.Excess
= PressureChange(PSetID
);
1172 Delta
.Excess
.setUnitInc(ExcessInc
);
1175 // Check if max pressure has exceeded a critical pressure set max.
1178 if (!Delta
.CriticalMax
.isValid()) {
1179 while (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() < PSetID
)
1182 if (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() == PSetID
) {
1183 int CritInc
= (int)MNew
- (int)CriticalPSets
[CritIdx
].getUnitInc();
1184 if (CritInc
> 0 && CritInc
<= std::numeric_limits
<int16_t>::max()) {
1185 Delta
.CriticalMax
= PressureChange(PSetID
);
1186 Delta
.CriticalMax
.setUnitInc(CritInc
);
1190 // Check if max pressure has exceeded the current max.
1191 if (!Delta
.CurrentMax
.isValid() && MNew
> MaxPressureLimit
[PSetID
]) {
1192 Delta
.CurrentMax
= PressureChange(PSetID
);
1193 Delta
.CurrentMax
.setUnitInc(MNew
- MOld
);
1198 /// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx).
1199 /// The query starts with a lane bitmask which gets lanes/bits removed for every
1201 static LaneBitmask
findUseBetween(unsigned Reg
, LaneBitmask LastUseMask
,
1202 SlotIndex PriorUseIdx
, SlotIndex NextUseIdx
,
1203 const MachineRegisterInfo
&MRI
,
1204 const LiveIntervals
*LIS
) {
1205 const TargetRegisterInfo
&TRI
= *MRI
.getTargetRegisterInfo();
1206 for (const MachineOperand
&MO
: MRI
.use_nodbg_operands(Reg
)) {
1209 const MachineInstr
*MI
= MO
.getParent();
1210 SlotIndex InstSlot
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1211 if (InstSlot
>= PriorUseIdx
&& InstSlot
< NextUseIdx
) {
1212 unsigned SubRegIdx
= MO
.getSubReg();
1213 LaneBitmask UseMask
= TRI
.getSubRegIndexLaneMask(SubRegIdx
);
1214 LastUseMask
&= ~UseMask
;
1215 if (LastUseMask
.none())
1216 return LaneBitmask::getNone();
1222 LaneBitmask
RegPressureTracker::getLiveLanesAt(unsigned RegUnit
,
1223 SlotIndex Pos
) const {
1224 assert(RequireIntervals
);
1225 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
, Pos
,
1226 LaneBitmask::getAll(),
1227 [](const LiveRange
&LR
, SlotIndex Pos
) {
1228 return LR
.liveAt(Pos
);
1232 LaneBitmask
RegPressureTracker::getLastUsedLanes(unsigned RegUnit
,
1233 SlotIndex Pos
) const {
1234 assert(RequireIntervals
);
1235 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
,
1236 Pos
.getBaseIndex(), LaneBitmask::getNone(),
1237 [](const LiveRange
&LR
, SlotIndex Pos
) {
1238 const LiveRange::Segment
*S
= LR
.getSegmentContaining(Pos
);
1239 return S
!= nullptr && S
->end
== Pos
.getRegSlot();
1243 LaneBitmask
RegPressureTracker::getLiveThroughAt(unsigned RegUnit
,
1244 SlotIndex Pos
) const {
1245 assert(RequireIntervals
);
1246 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
, Pos
,
1247 LaneBitmask::getNone(),
1248 [](const LiveRange
&LR
, SlotIndex Pos
) {
1249 const LiveRange::Segment
*S
= LR
.getSegmentContaining(Pos
);
1250 return S
!= nullptr && S
->start
< Pos
.getRegSlot(true) &&
1251 S
->end
!= Pos
.getDeadSlot();
1255 /// Record the downward impact of a single instruction on current register
1256 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1257 /// not discover live in/outs.
1259 /// This is intended for speculative queries. It leaves pressure inconsistent
1260 /// with the current position, so must be restored by the caller.
1261 void RegPressureTracker::bumpDownwardPressure(const MachineInstr
*MI
) {
1262 assert(!MI
->isDebugInstr() && "Expect a nondebug instruction.");
1265 if (RequireIntervals
)
1266 SlotIdx
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1268 // Account for register pressure similar to RegPressureTracker::recede().
1269 RegisterOperands RegOpers
;
1270 RegOpers
.collect(*MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
1272 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
1274 if (RequireIntervals
) {
1275 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
1276 unsigned Reg
= Use
.RegUnit
;
1277 LaneBitmask LastUseMask
= getLastUsedLanes(Reg
, SlotIdx
);
1278 if (LastUseMask
.none())
1280 // The LastUseMask is queried from the liveness information of instruction
1281 // which may be further down the schedule. Some lanes may actually not be
1282 // last uses for the current position.
1283 // FIXME: allow the caller to pass in the list of vreg uses that remain
1284 // to be bottom-scheduled to avoid searching uses at each query.
1285 SlotIndex CurrIdx
= getCurrSlot();
1287 = findUseBetween(Reg
, LastUseMask
, CurrIdx
, SlotIdx
, *MRI
, LIS
);
1288 if (LastUseMask
.none())
1291 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
1292 LaneBitmask NewMask
= LiveMask
& ~LastUseMask
;
1293 decreaseRegPressure(Reg
, LiveMask
, NewMask
);
1297 // Generate liveness for defs.
1298 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
1299 unsigned Reg
= Def
.RegUnit
;
1300 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
1301 LaneBitmask NewMask
= LiveMask
| Def
.LaneMask
;
1302 increaseRegPressure(Reg
, LiveMask
, NewMask
);
1305 // Boost pressure for all dead defs together.
1306 bumpDeadDefs(RegOpers
.DeadDefs
);
1309 /// Consider the pressure increase caused by traversing this instruction
1310 /// top-down. Find the register class with the most change in its pressure limit
1311 /// based on the tracker's current pressure, and return the number of excess
1312 /// register units of that pressure set introduced by this instruction.
1314 /// This assumes that the current LiveIn set is sufficient.
1316 /// This is expensive for an on-the-fly query because it calls
1317 /// bumpDownwardPressure to recompute the pressure sets based on current
1318 /// liveness. We don't yet have a fast version of downward pressure tracking
1319 /// analogous to getUpwardPressureDelta.
1320 void RegPressureTracker::
1321 getMaxDownwardPressureDelta(const MachineInstr
*MI
, RegPressureDelta
&Delta
,
1322 ArrayRef
<PressureChange
> CriticalPSets
,
1323 ArrayRef
<unsigned> MaxPressureLimit
) {
1324 // Snapshot Pressure.
1325 std::vector
<unsigned> SavedPressure
= CurrSetPressure
;
1326 std::vector
<unsigned> SavedMaxPressure
= P
.MaxSetPressure
;
1328 bumpDownwardPressure(MI
);
1330 computeExcessPressureDelta(SavedPressure
, CurrSetPressure
, Delta
, RCI
,
1332 computeMaxPressureDelta(SavedMaxPressure
, P
.MaxSetPressure
, CriticalPSets
,
1333 MaxPressureLimit
, Delta
);
1334 assert(Delta
.CriticalMax
.getUnitInc() >= 0 &&
1335 Delta
.CurrentMax
.getUnitInc() >= 0 && "cannot decrease max pressure");
1337 // Restore the tracker's state.
1338 P
.MaxSetPressure
.swap(SavedMaxPressure
);
1339 CurrSetPressure
.swap(SavedPressure
);
1342 /// Get the pressure of each PSet after traversing this instruction bottom-up.
1343 void RegPressureTracker::
1344 getUpwardPressure(const MachineInstr
*MI
,
1345 std::vector
<unsigned> &PressureResult
,
1346 std::vector
<unsigned> &MaxPressureResult
) {
1347 // Snapshot pressure.
1348 PressureResult
= CurrSetPressure
;
1349 MaxPressureResult
= P
.MaxSetPressure
;
1351 bumpUpwardPressure(MI
);
1353 // Current pressure becomes the result. Restore current pressure.
1354 P
.MaxSetPressure
.swap(MaxPressureResult
);
1355 CurrSetPressure
.swap(PressureResult
);
1358 /// Get the pressure of each PSet after traversing this instruction top-down.
1359 void RegPressureTracker::
1360 getDownwardPressure(const MachineInstr
*MI
,
1361 std::vector
<unsigned> &PressureResult
,
1362 std::vector
<unsigned> &MaxPressureResult
) {
1363 // Snapshot pressure.
1364 PressureResult
= CurrSetPressure
;
1365 MaxPressureResult
= P
.MaxSetPressure
;
1367 bumpDownwardPressure(MI
);
1369 // Current pressure becomes the result. Restore current pressure.
1370 P
.MaxSetPressure
.swap(MaxPressureResult
);
1371 CurrSetPressure
.swap(PressureResult
);