1 //===- RegisterPressure.cpp - Dynamic Register Pressure -------------------===//
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
7 //===----------------------------------------------------------------------===//
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"
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())
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())
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)
81 void llvm::dumpRegSetPressure(ArrayRef
<unsigned> SetPressure
,
82 const TargetRegisterInfo
*TRI
) {
84 for (unsigned i
= 0, e
= SetPressure
.size(); i
< e
; ++i
) {
85 if (SetPressure
[i
] != 0) {
86 dbgs() << TRI
->getRegPressureSetName(i
) << "=" << SetPressure
[i
] << '\n';
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
);
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
);
117 void RegPressureTracker::dump() const {
118 if (!isTopClosed() || !isBottomClosed()) {
119 dbgs() << "Curr Pressure: ";
120 dumpRegSetPressure(CurrSetPressure
, TRI
);
126 void PressureDiff::dump(const TargetRegisterInfo
&TRI
) const {
127 const char *sep
= "";
128 for (const PressureChange
&Change
: *this) {
129 if (!Change
.isValid())
131 dbgs() << sep
<< TRI
.getRegPressureSetName(Change
.getPSet())
132 << " " << Change
.getUnitInc();
139 void PressureChange::dump() const {
140 dbgs() << "[" << getPSetOrMax() << ", " << getUnitInc() << "]\n";
143 void RegPressureDelta::dump() const {
144 dbgs() << "[Excess=";
146 dbgs() << ", CriticalMax=";
148 dbgs() << ", CurrentMax=";
155 void RegPressureTracker::increaseRegPressure(Register RegUnit
,
156 LaneBitmask PreviousMask
,
157 LaneBitmask NewMask
) {
158 if (PreviousMask
.any() || NewMask
.none())
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();
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();
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
)
197 TopIdx
= SlotIndex();
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
)
205 TopPos
= MachineBasicBlock::const_iterator();
209 /// If the current bottom is not greater than the previous index, open it.
210 void IntervalPressure::openBottom(SlotIndex PrevBottom
) {
211 if (BottomIdx
> PrevBottom
)
213 BottomIdx
= SlotIndex();
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
)
221 BottomPos
= MachineBasicBlock::const_iterator();
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() {
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() {
247 CurrSetPressure
.clear();
248 LiveThruPressure
.clear();
249 P
.MaxSetPressure
.clear();
251 if (RequireIntervals
)
252 static_cast<IntervalPressure
&>(P
).reset();
254 static_cast<RegionPressure
&>(P
).reset();
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
) {
272 TRI
= MF
->getSubtarget().getRegisterInfo();
274 MRI
= &MF
->getRegInfo();
276 this->TrackUntiedDefs
= TrackUntiedDefs
;
277 this->TrackLaneMasks
= TrackLaneMasks
;
279 if (RequireIntervals
) {
280 assert(lis
&& "IntervalPressure requires LiveIntervals");
285 CurrSetPressure
.assign(TRI
->getNumRegPressureSets(), 0);
287 P
.MaxSetPressure
= CurrSetPressure
;
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();
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();
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");
348 if (!isBottomClosed())
350 else if (!isTopClosed())
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 (Register::isVirtualRegister(RegUnit
)
365 && !RPTracker
.hasUntiedDef(RegUnit
))
366 increaseSetPressure(LiveThruPressure
, *MRI
, RegUnit
,
367 LaneBitmask::getNone(), Pair
.LaneMask
);
371 static LaneBitmask
getRegLanes(ArrayRef
<RegisterMaskPair
> RegUnits
,
373 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
374 return Other
.RegUnit
== RegUnit
;
376 if (I
== RegUnits
.end())
377 return LaneBitmask::getNone();
381 static void addRegLanes(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
382 RegisterMaskPair Pair
) {
383 Register RegUnit
= Pair
.RegUnit
;
384 assert(Pair
.LaneMask
.any());
385 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
386 return Other
.RegUnit
== RegUnit
;
388 if (I
== RegUnits
.end()) {
389 RegUnits
.push_back(Pair
);
391 I
->LaneMask
|= Pair
.LaneMask
;
395 static void setRegZero(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
397 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
398 return Other
.RegUnit
== RegUnit
;
400 if (I
== RegUnits
.end()) {
401 RegUnits
.push_back(RegisterMaskPair(RegUnit
, LaneBitmask::getNone()));
403 I
->LaneMask
= LaneBitmask::getNone();
407 static void removeRegLanes(SmallVectorImpl
<RegisterMaskPair
> &RegUnits
,
408 RegisterMaskPair Pair
) {
409 Register RegUnit
= Pair
.RegUnit
;
410 assert(Pair
.LaneMask
.any());
411 auto I
= llvm::find_if(RegUnits
, [RegUnit
](const RegisterMaskPair Other
) {
412 return Other
.RegUnit
== RegUnit
;
414 if (I
!= RegUnits
.end()) {
415 I
->LaneMask
&= ~Pair
.LaneMask
;
416 if (I
->LaneMask
.none())
422 getLanesWithProperty(const LiveIntervals
&LIS
, const MachineRegisterInfo
&MRI
,
423 bool TrackLaneMasks
, Register RegUnit
, SlotIndex Pos
,
424 LaneBitmask SafeDefault
,
425 bool (*Property
)(const LiveRange
&LR
, SlotIndex Pos
)) {
426 if (RegUnit
.isVirtual()) {
427 const LiveInterval
&LI
= LIS
.getInterval(RegUnit
);
429 if (TrackLaneMasks
&& LI
.hasSubRanges()) {
430 for (const LiveInterval::SubRange
&SR
: LI
.subranges()) {
431 if (Property(SR
, Pos
))
432 Result
|= SR
.LaneMask
;
434 } else if (Property(LI
, Pos
)) {
435 Result
= TrackLaneMasks
? MRI
.getMaxLaneMaskForVReg(RegUnit
)
436 : LaneBitmask::getAll();
441 const LiveRange
*LR
= LIS
.getCachedRegUnit(RegUnit
);
442 // Be prepared for missing liveranges: We usually do not compute liveranges
443 // for physical registers on targets with many registers (GPUs).
446 return Property(*LR
, Pos
) ? LaneBitmask::getAll() : LaneBitmask::getNone();
450 static LaneBitmask
getLiveLanesAt(const LiveIntervals
&LIS
,
451 const MachineRegisterInfo
&MRI
,
452 bool TrackLaneMasks
, Register RegUnit
,
454 return getLanesWithProperty(LIS
, MRI
, TrackLaneMasks
, RegUnit
, Pos
,
455 LaneBitmask::getAll(),
456 [](const LiveRange
&LR
, SlotIndex Pos
) {
457 return LR
.liveAt(Pos
);
463 /// Collect this instruction's unique uses and defs into SmallVectors for
464 /// processing defs and uses in order.
466 /// FIXME: always ignore tied opers
467 class RegisterOperandsCollector
{
468 friend class llvm::RegisterOperands
;
470 RegisterOperands
&RegOpers
;
471 const TargetRegisterInfo
&TRI
;
472 const MachineRegisterInfo
&MRI
;
475 RegisterOperandsCollector(RegisterOperands
&RegOpers
,
476 const TargetRegisterInfo
&TRI
,
477 const MachineRegisterInfo
&MRI
, bool IgnoreDead
)
478 : RegOpers(RegOpers
), TRI(TRI
), MRI(MRI
), IgnoreDead(IgnoreDead
) {}
480 void collectInstr(const MachineInstr
&MI
) const {
481 for (ConstMIBundleOperands
OperI(MI
); OperI
.isValid(); ++OperI
)
482 collectOperand(*OperI
);
484 // Remove redundant physreg dead defs.
485 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
486 removeRegLanes(RegOpers
.DeadDefs
, P
);
489 void collectInstrLanes(const MachineInstr
&MI
) const {
490 for (ConstMIBundleOperands
OperI(MI
); OperI
.isValid(); ++OperI
)
491 collectOperandLanes(*OperI
);
493 // Remove redundant physreg dead defs.
494 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
495 removeRegLanes(RegOpers
.DeadDefs
, P
);
498 /// Push this operand's register onto the correct vectors.
499 void collectOperand(const MachineOperand
&MO
) const {
500 if (!MO
.isReg() || !MO
.getReg())
502 Register Reg
= MO
.getReg();
504 if (!MO
.isUndef() && !MO
.isInternalRead())
505 pushReg(Reg
, RegOpers
.Uses
);
508 // Subregister definitions may imply a register read.
510 pushReg(Reg
, RegOpers
.Uses
);
514 pushReg(Reg
, RegOpers
.DeadDefs
);
516 pushReg(Reg
, RegOpers
.Defs
);
520 void pushReg(Register Reg
,
521 SmallVectorImpl
<RegisterMaskPair
> &RegUnits
) const {
522 if (Reg
.isVirtual()) {
523 addRegLanes(RegUnits
, RegisterMaskPair(Reg
, LaneBitmask::getAll()));
524 } else if (MRI
.isAllocatable(Reg
)) {
525 for (MCRegUnitIterator
Units(Reg
.asMCReg(), &TRI
); Units
.isValid();
527 addRegLanes(RegUnits
, RegisterMaskPair(*Units
, LaneBitmask::getAll()));
531 void collectOperandLanes(const MachineOperand
&MO
) const {
532 if (!MO
.isReg() || !MO
.getReg())
534 Register Reg
= MO
.getReg();
535 unsigned SubRegIdx
= MO
.getSubReg();
537 if (!MO
.isUndef() && !MO
.isInternalRead())
538 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.Uses
);
541 // Treat read-undef subreg defs as definitions of the whole register.
547 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.DeadDefs
);
549 pushRegLanes(Reg
, SubRegIdx
, RegOpers
.Defs
);
553 void pushRegLanes(Register Reg
, unsigned SubRegIdx
,
554 SmallVectorImpl
<RegisterMaskPair
> &RegUnits
) const {
555 if (Reg
.isVirtual()) {
556 LaneBitmask LaneMask
= SubRegIdx
!= 0
557 ? TRI
.getSubRegIndexLaneMask(SubRegIdx
)
558 : MRI
.getMaxLaneMaskForVReg(Reg
);
559 addRegLanes(RegUnits
, RegisterMaskPair(Reg
, LaneMask
));
560 } else if (MRI
.isAllocatable(Reg
)) {
561 for (MCRegUnitIterator
Units(Reg
.asMCReg(), &TRI
); Units
.isValid();
563 addRegLanes(RegUnits
, RegisterMaskPair(*Units
, LaneBitmask::getAll()));
568 } // end anonymous namespace
570 void RegisterOperands::collect(const MachineInstr
&MI
,
571 const TargetRegisterInfo
&TRI
,
572 const MachineRegisterInfo
&MRI
,
573 bool TrackLaneMasks
, bool IgnoreDead
) {
574 RegisterOperandsCollector
Collector(*this, TRI
, MRI
, IgnoreDead
);
576 Collector
.collectInstrLanes(MI
);
578 Collector
.collectInstr(MI
);
581 void RegisterOperands::detectDeadDefs(const MachineInstr
&MI
,
582 const LiveIntervals
&LIS
) {
583 SlotIndex SlotIdx
= LIS
.getInstructionIndex(MI
);
584 for (auto *RI
= Defs
.begin(); RI
!= Defs
.end(); /*empty*/) {
585 Register Reg
= RI
->RegUnit
;
586 const LiveRange
*LR
= getLiveRange(LIS
, Reg
);
588 LiveQueryResult LRQ
= LR
->Query(SlotIdx
);
589 if (LRQ
.isDeadDef()) {
590 // LiveIntervals knows this is a dead even though it's MachineOperand is
591 // not flagged as such.
592 DeadDefs
.push_back(*RI
);
601 void RegisterOperands::adjustLaneLiveness(const LiveIntervals
&LIS
,
602 const MachineRegisterInfo
&MRI
,
604 MachineInstr
*AddFlagsMI
) {
605 for (auto *I
= Defs
.begin(); I
!= Defs
.end();) {
606 LaneBitmask LiveAfter
= getLiveLanesAt(LIS
, MRI
, true, I
->RegUnit
,
608 // If the def is all that is live after the instruction, then in case
609 // of a subregister def we need a read-undef flag.
610 Register RegUnit
= I
->RegUnit
;
611 if (Register::isVirtualRegister(RegUnit
) &&
612 AddFlagsMI
!= nullptr && (LiveAfter
& ~I
->LaneMask
).none())
613 AddFlagsMI
->setRegisterDefReadUndef(RegUnit
);
615 LaneBitmask ActualDef
= I
->LaneMask
& LiveAfter
;
616 if (ActualDef
.none()) {
619 I
->LaneMask
= ActualDef
;
623 for (auto *I
= Uses
.begin(); I
!= Uses
.end();) {
624 LaneBitmask LiveBefore
= getLiveLanesAt(LIS
, MRI
, true, I
->RegUnit
,
626 LaneBitmask LaneMask
= I
->LaneMask
& LiveBefore
;
627 if (LaneMask
.none()) {
630 I
->LaneMask
= LaneMask
;
634 if (AddFlagsMI
!= nullptr) {
635 for (const RegisterMaskPair
&P
: DeadDefs
) {
636 Register RegUnit
= P
.RegUnit
;
637 if (!Register::isVirtualRegister(RegUnit
))
639 LaneBitmask LiveAfter
= getLiveLanesAt(LIS
, MRI
, true, RegUnit
,
641 if (LiveAfter
.none())
642 AddFlagsMI
->setRegisterDefReadUndef(RegUnit
);
647 /// Initialize an array of N PressureDiffs.
648 void PressureDiffs::init(unsigned N
) {
651 memset(PDiffArray
, 0, N
* sizeof(PressureDiff
));
656 PDiffArray
= static_cast<PressureDiff
*>(safe_calloc(N
, sizeof(PressureDiff
)));
659 void PressureDiffs::addInstruction(unsigned Idx
,
660 const RegisterOperands
&RegOpers
,
661 const MachineRegisterInfo
&MRI
) {
662 PressureDiff
&PDiff
= (*this)[Idx
];
663 assert(!PDiff
.begin()->isValid() && "stale PDiff");
664 for (const RegisterMaskPair
&P
: RegOpers
.Defs
)
665 PDiff
.addPressureChange(P
.RegUnit
, true, &MRI
);
667 for (const RegisterMaskPair
&P
: RegOpers
.Uses
)
668 PDiff
.addPressureChange(P
.RegUnit
, false, &MRI
);
671 /// Add a change in pressure to the pressure diff of a given instruction.
672 void PressureDiff::addPressureChange(Register RegUnit
, bool IsDec
,
673 const MachineRegisterInfo
*MRI
) {
674 PSetIterator PSetI
= MRI
->getPressureSets(RegUnit
);
675 int Weight
= IsDec
? -PSetI
.getWeight() : PSetI
.getWeight();
676 for (; PSetI
.isValid(); ++PSetI
) {
677 // Find an existing entry in the pressure diff for this PSet.
678 PressureDiff::iterator I
= nonconst_begin(), E
= nonconst_end();
679 for (; I
!= E
&& I
->isValid(); ++I
) {
680 if (I
->getPSet() >= *PSetI
)
683 // If all pressure sets are more constrained, skip the remaining PSets.
686 // Insert this PressureChange.
687 if (!I
->isValid() || I
->getPSet() != *PSetI
) {
688 PressureChange PTmp
= PressureChange(*PSetI
);
689 for (PressureDiff::iterator J
= I
; J
!= E
&& PTmp
.isValid(); ++J
)
692 // Update the units for this pressure set.
693 unsigned NewUnitInc
= I
->getUnitInc() + Weight
;
694 if (NewUnitInc
!= 0) {
695 I
->setUnitInc(NewUnitInc
);
698 PressureDiff::iterator J
;
699 for (J
= std::next(I
); J
!= E
&& J
->isValid(); ++J
, ++I
)
701 *I
= PressureChange();
706 /// Force liveness of registers.
707 void RegPressureTracker::addLiveRegs(ArrayRef
<RegisterMaskPair
> Regs
) {
708 for (const RegisterMaskPair
&P
: Regs
) {
709 LaneBitmask PrevMask
= LiveRegs
.insert(P
);
710 LaneBitmask NewMask
= PrevMask
| P
.LaneMask
;
711 increaseRegPressure(P
.RegUnit
, PrevMask
, NewMask
);
715 void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair
,
716 SmallVectorImpl
<RegisterMaskPair
> &LiveInOrOut
) {
717 assert(Pair
.LaneMask
.any());
719 Register RegUnit
= Pair
.RegUnit
;
720 auto I
= llvm::find_if(LiveInOrOut
, [RegUnit
](const RegisterMaskPair
&Other
) {
721 return Other
.RegUnit
== RegUnit
;
723 LaneBitmask PrevMask
;
725 if (I
== LiveInOrOut
.end()) {
726 PrevMask
= LaneBitmask::getNone();
727 NewMask
= Pair
.LaneMask
;
728 LiveInOrOut
.push_back(Pair
);
730 PrevMask
= I
->LaneMask
;
731 NewMask
= PrevMask
| Pair
.LaneMask
;
732 I
->LaneMask
= NewMask
;
734 increaseSetPressure(P
.MaxSetPressure
, *MRI
, RegUnit
, PrevMask
, NewMask
);
737 void RegPressureTracker::discoverLiveIn(RegisterMaskPair Pair
) {
738 discoverLiveInOrOut(Pair
, P
.LiveInRegs
);
741 void RegPressureTracker::discoverLiveOut(RegisterMaskPair Pair
) {
742 discoverLiveInOrOut(Pair
, P
.LiveOutRegs
);
745 void RegPressureTracker::bumpDeadDefs(ArrayRef
<RegisterMaskPair
> DeadDefs
) {
746 for (const RegisterMaskPair
&P
: DeadDefs
) {
747 Register Reg
= P
.RegUnit
;
748 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
749 LaneBitmask BumpedMask
= LiveMask
| P
.LaneMask
;
750 increaseRegPressure(Reg
, LiveMask
, BumpedMask
);
752 for (const RegisterMaskPair
&P
: DeadDefs
) {
753 Register Reg
= P
.RegUnit
;
754 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
755 LaneBitmask BumpedMask
= LiveMask
| P
.LaneMask
;
756 decreaseRegPressure(Reg
, BumpedMask
, LiveMask
);
760 /// Recede across the previous instruction. If LiveUses is provided, record any
761 /// RegUnits that are made live by the current instruction's uses. This includes
762 /// registers that are both defined and used by the instruction. If a pressure
763 /// difference pointer is provided record the changes is pressure caused by this
764 /// instruction independent of liveness.
765 void RegPressureTracker::recede(const RegisterOperands
&RegOpers
,
766 SmallVectorImpl
<RegisterMaskPair
> *LiveUses
) {
767 assert(!CurrPos
->isDebugOrPseudoInstr());
769 // Boost pressure for all dead defs together.
770 bumpDeadDefs(RegOpers
.DeadDefs
);
772 // Kill liveness at live defs.
773 // TODO: consider earlyclobbers?
774 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
775 Register Reg
= Def
.RegUnit
;
777 LaneBitmask PreviousMask
= LiveRegs
.erase(Def
);
778 LaneBitmask NewMask
= PreviousMask
& ~Def
.LaneMask
;
780 LaneBitmask LiveOut
= Def
.LaneMask
& ~PreviousMask
;
782 discoverLiveOut(RegisterMaskPair(Reg
, LiveOut
));
783 // Retroactively model effects on pressure of the live out lanes.
784 increaseSetPressure(CurrSetPressure
, *MRI
, Reg
, LaneBitmask::getNone(),
786 PreviousMask
= LiveOut
;
789 if (NewMask
.none()) {
790 // Add a 0 entry to LiveUses as a marker that the complete vreg has become
792 if (TrackLaneMasks
&& LiveUses
!= nullptr)
793 setRegZero(*LiveUses
, Reg
);
796 decreaseRegPressure(Reg
, PreviousMask
, NewMask
);
800 if (RequireIntervals
)
801 SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
803 // Generate liveness for uses.
804 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
805 Register Reg
= Use
.RegUnit
;
806 assert(Use
.LaneMask
.any());
807 LaneBitmask PreviousMask
= LiveRegs
.insert(Use
);
808 LaneBitmask NewMask
= PreviousMask
| Use
.LaneMask
;
809 if (NewMask
== PreviousMask
)
812 // Did the register just become live?
813 if (PreviousMask
.none()) {
814 if (LiveUses
!= nullptr) {
815 if (!TrackLaneMasks
) {
816 addRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
819 llvm::find_if(*LiveUses
, [Reg
](const RegisterMaskPair Other
) {
820 return Other
.RegUnit
== Reg
;
822 bool IsRedef
= I
!= LiveUses
->end();
824 // ignore re-defs here...
825 assert(I
->LaneMask
.none());
826 removeRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
828 addRegLanes(*LiveUses
, RegisterMaskPair(Reg
, NewMask
));
833 // Discover live outs if this may be the first occurance of this register.
834 if (RequireIntervals
) {
835 LaneBitmask LiveOut
= getLiveThroughAt(Reg
, SlotIdx
);
837 discoverLiveOut(RegisterMaskPair(Reg
, LiveOut
));
841 increaseRegPressure(Reg
, PreviousMask
, NewMask
);
843 if (TrackUntiedDefs
) {
844 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
845 Register RegUnit
= Def
.RegUnit
;
846 if (Register::isVirtualRegister(RegUnit
) &&
847 (LiveRegs
.contains(RegUnit
) & Def
.LaneMask
).none())
848 UntiedDefs
.insert(RegUnit
);
853 void RegPressureTracker::recedeSkipDebugValues() {
854 assert(CurrPos
!= MBB
->begin());
855 if (!isBottomClosed())
858 // Open the top of the region using block iterators.
859 if (!RequireIntervals
&& isTopClosed())
860 static_cast<RegionPressure
&>(P
).openTop(CurrPos
);
862 // Find the previous instruction.
863 CurrPos
= prev_nodbg(CurrPos
, MBB
->begin());
866 if (RequireIntervals
&& !CurrPos
->isDebugOrPseudoInstr())
867 SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
869 // Open the top of the region using slot indexes.
870 if (RequireIntervals
&& isTopClosed())
871 static_cast<IntervalPressure
&>(P
).openTop(SlotIdx
);
874 void RegPressureTracker::recede(SmallVectorImpl
<RegisterMaskPair
> *LiveUses
) {
875 recedeSkipDebugValues();
876 if (CurrPos
->isDebugInstr() || CurrPos
->isPseudoProbe()) {
877 // It's possible to only have debug_value and pseudo probe instructions and
878 // hit the start of the block.
879 assert(CurrPos
== MBB
->begin());
883 const MachineInstr
&MI
= *CurrPos
;
884 RegisterOperands RegOpers
;
885 RegOpers
.collect(MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
886 if (TrackLaneMasks
) {
887 SlotIndex SlotIdx
= LIS
->getInstructionIndex(*CurrPos
).getRegSlot();
888 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
889 } else if (RequireIntervals
) {
890 RegOpers
.detectDeadDefs(MI
, *LIS
);
893 recede(RegOpers
, LiveUses
);
896 /// Advance across the current instruction.
897 void RegPressureTracker::advance(const RegisterOperands
&RegOpers
) {
898 assert(!TrackUntiedDefs
&& "unsupported mode");
899 assert(CurrPos
!= MBB
->end());
904 if (RequireIntervals
)
905 SlotIdx
= getCurrSlot();
907 // Open the bottom of the region using slot indexes.
908 if (isBottomClosed()) {
909 if (RequireIntervals
)
910 static_cast<IntervalPressure
&>(P
).openBottom(SlotIdx
);
912 static_cast<RegionPressure
&>(P
).openBottom(CurrPos
);
915 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
916 Register Reg
= Use
.RegUnit
;
917 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
918 LaneBitmask LiveIn
= Use
.LaneMask
& ~LiveMask
;
920 discoverLiveIn(RegisterMaskPair(Reg
, LiveIn
));
921 increaseRegPressure(Reg
, LiveMask
, LiveMask
| LiveIn
);
922 LiveRegs
.insert(RegisterMaskPair(Reg
, LiveIn
));
924 // Kill liveness at last uses.
925 if (RequireIntervals
) {
926 LaneBitmask LastUseMask
= getLastUsedLanes(Reg
, SlotIdx
);
927 if (LastUseMask
.any()) {
928 LiveRegs
.erase(RegisterMaskPair(Reg
, LastUseMask
));
929 decreaseRegPressure(Reg
, LiveMask
, LiveMask
& ~LastUseMask
);
934 // Generate liveness for defs.
935 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
936 LaneBitmask PreviousMask
= LiveRegs
.insert(Def
);
937 LaneBitmask NewMask
= PreviousMask
| Def
.LaneMask
;
938 increaseRegPressure(Def
.RegUnit
, PreviousMask
, NewMask
);
941 // Boost pressure for all dead defs together.
942 bumpDeadDefs(RegOpers
.DeadDefs
);
944 // Find the next instruction.
945 CurrPos
= next_nodbg(CurrPos
, MBB
->end());
948 void RegPressureTracker::advance() {
949 const MachineInstr
&MI
= *CurrPos
;
950 RegisterOperands RegOpers
;
951 RegOpers
.collect(MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
952 if (TrackLaneMasks
) {
953 SlotIndex SlotIdx
= getCurrSlot();
954 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
959 /// Find the max change in excess pressure across all sets.
960 static void computeExcessPressureDelta(ArrayRef
<unsigned> OldPressureVec
,
961 ArrayRef
<unsigned> NewPressureVec
,
962 RegPressureDelta
&Delta
,
963 const RegisterClassInfo
*RCI
,
964 ArrayRef
<unsigned> LiveThruPressureVec
) {
965 Delta
.Excess
= PressureChange();
966 for (unsigned i
= 0, e
= OldPressureVec
.size(); i
< e
; ++i
) {
967 unsigned POld
= OldPressureVec
[i
];
968 unsigned PNew
= NewPressureVec
[i
];
969 int PDiff
= (int)PNew
- (int)POld
;
970 if (!PDiff
) // No change in this set in the common case.
972 // Only consider change beyond the limit.
973 unsigned Limit
= RCI
->getRegPressureSetLimit(i
);
974 if (!LiveThruPressureVec
.empty())
975 Limit
+= LiveThruPressureVec
[i
];
979 PDiff
= 0; // Under the limit
981 PDiff
= PNew
- Limit
; // Just exceeded limit.
982 } else if (Limit
> PNew
)
983 PDiff
= Limit
- POld
; // Just obeyed limit.
986 Delta
.Excess
= PressureChange(i
);
987 Delta
.Excess
.setUnitInc(PDiff
);
993 /// Find the max change in max pressure that either surpasses a critical PSet
994 /// limit or exceeds the current MaxPressureLimit.
996 /// FIXME: comparing each element of the old and new MaxPressure vectors here is
997 /// silly. It's done now to demonstrate the concept but will go away with a
998 /// RegPressureTracker API change to work with pressure differences.
999 static void computeMaxPressureDelta(ArrayRef
<unsigned> OldMaxPressureVec
,
1000 ArrayRef
<unsigned> NewMaxPressureVec
,
1001 ArrayRef
<PressureChange
> CriticalPSets
,
1002 ArrayRef
<unsigned> MaxPressureLimit
,
1003 RegPressureDelta
&Delta
) {
1004 Delta
.CriticalMax
= PressureChange();
1005 Delta
.CurrentMax
= PressureChange();
1007 unsigned CritIdx
= 0, CritEnd
= CriticalPSets
.size();
1008 for (unsigned i
= 0, e
= OldMaxPressureVec
.size(); i
< e
; ++i
) {
1009 unsigned POld
= OldMaxPressureVec
[i
];
1010 unsigned PNew
= NewMaxPressureVec
[i
];
1011 if (PNew
== POld
) // No change in this set in the common case.
1014 if (!Delta
.CriticalMax
.isValid()) {
1015 while (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() < i
)
1018 if (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() == i
) {
1019 int PDiff
= (int)PNew
- (int)CriticalPSets
[CritIdx
].getUnitInc();
1021 Delta
.CriticalMax
= PressureChange(i
);
1022 Delta
.CriticalMax
.setUnitInc(PDiff
);
1026 // Find the first increase above MaxPressureLimit.
1027 // (Ignores negative MDiff).
1028 if (!Delta
.CurrentMax
.isValid() && PNew
> MaxPressureLimit
[i
]) {
1029 Delta
.CurrentMax
= PressureChange(i
);
1030 Delta
.CurrentMax
.setUnitInc(PNew
- POld
);
1031 if (CritIdx
== CritEnd
|| Delta
.CriticalMax
.isValid())
1037 /// Record the upward impact of a single instruction on current register
1038 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1039 /// not discover live in/outs.
1041 /// This is intended for speculative queries. It leaves pressure inconsistent
1042 /// with the current position, so must be restored by the caller.
1043 void RegPressureTracker::bumpUpwardPressure(const MachineInstr
*MI
) {
1044 assert(!MI
->isDebugOrPseudoInstr() && "Expect a nondebug instruction.");
1047 if (RequireIntervals
)
1048 SlotIdx
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1050 // Account for register pressure similar to RegPressureTracker::recede().
1051 RegisterOperands RegOpers
;
1052 RegOpers
.collect(*MI
, *TRI
, *MRI
, TrackLaneMasks
, /*IgnoreDead=*/true);
1053 assert(RegOpers
.DeadDefs
.size() == 0);
1055 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
1056 else if (RequireIntervals
)
1057 RegOpers
.detectDeadDefs(*MI
, *LIS
);
1059 // Boost max pressure for all dead defs together.
1060 // Since CurrSetPressure and MaxSetPressure
1061 bumpDeadDefs(RegOpers
.DeadDefs
);
1063 // Kill liveness at live defs.
1064 for (const RegisterMaskPair
&P
: RegOpers
.Defs
) {
1065 Register Reg
= P
.RegUnit
;
1066 LaneBitmask LiveLanes
= LiveRegs
.contains(Reg
);
1067 LaneBitmask UseLanes
= getRegLanes(RegOpers
.Uses
, Reg
);
1068 LaneBitmask DefLanes
= P
.LaneMask
;
1069 LaneBitmask LiveAfter
= (LiveLanes
& ~DefLanes
) | UseLanes
;
1070 decreaseRegPressure(Reg
, LiveLanes
, LiveAfter
);
1072 // Generate liveness for uses.
1073 for (const RegisterMaskPair
&P
: RegOpers
.Uses
) {
1074 Register Reg
= P
.RegUnit
;
1075 LaneBitmask LiveLanes
= LiveRegs
.contains(Reg
);
1076 LaneBitmask LiveAfter
= LiveLanes
| P
.LaneMask
;
1077 increaseRegPressure(Reg
, LiveLanes
, LiveAfter
);
1081 /// Consider the pressure increase caused by traversing this instruction
1082 /// bottom-up. Find the pressure set with the most change beyond its pressure
1083 /// limit based on the tracker's current pressure, and return the change in
1084 /// number of register units of that pressure set introduced by this
1087 /// This assumes that the current LiveOut set is sufficient.
1089 /// This is expensive for an on-the-fly query because it calls
1090 /// bumpUpwardPressure to recompute the pressure sets based on current
1091 /// liveness. This mainly exists to verify correctness, e.g. with
1092 /// -verify-misched. getUpwardPressureDelta is the fast version of this query
1093 /// that uses the per-SUnit cache of the PressureDiff.
1094 void RegPressureTracker::
1095 getMaxUpwardPressureDelta(const MachineInstr
*MI
, PressureDiff
*PDiff
,
1096 RegPressureDelta
&Delta
,
1097 ArrayRef
<PressureChange
> CriticalPSets
,
1098 ArrayRef
<unsigned> MaxPressureLimit
) {
1099 // Snapshot Pressure.
1100 // FIXME: The snapshot heap space should persist. But I'm planning to
1101 // summarize the pressure effect so we don't need to snapshot at all.
1102 std::vector
<unsigned> SavedPressure
= CurrSetPressure
;
1103 std::vector
<unsigned> SavedMaxPressure
= P
.MaxSetPressure
;
1105 bumpUpwardPressure(MI
);
1107 computeExcessPressureDelta(SavedPressure
, CurrSetPressure
, Delta
, RCI
,
1109 computeMaxPressureDelta(SavedMaxPressure
, P
.MaxSetPressure
, CriticalPSets
,
1110 MaxPressureLimit
, Delta
);
1111 assert(Delta
.CriticalMax
.getUnitInc() >= 0 &&
1112 Delta
.CurrentMax
.getUnitInc() >= 0 && "cannot decrease max pressure");
1114 // Restore the tracker's state.
1115 P
.MaxSetPressure
.swap(SavedMaxPressure
);
1116 CurrSetPressure
.swap(SavedPressure
);
1122 // Check if the alternate algorithm yields the same result.
1123 RegPressureDelta Delta2
;
1124 getUpwardPressureDelta(MI
, *PDiff
, Delta2
, CriticalPSets
, MaxPressureLimit
);
1125 if (Delta
!= Delta2
) {
1126 dbgs() << "PDiff: ";
1128 dbgs() << "DELTA: " << *MI
;
1129 if (Delta
.Excess
.isValid())
1130 dbgs() << "Excess1 " << TRI
->getRegPressureSetName(Delta
.Excess
.getPSet())
1131 << " " << Delta
.Excess
.getUnitInc() << "\n";
1132 if (Delta
.CriticalMax
.isValid())
1133 dbgs() << "Critic1 " << TRI
->getRegPressureSetName(Delta
.CriticalMax
.getPSet())
1134 << " " << Delta
.CriticalMax
.getUnitInc() << "\n";
1135 if (Delta
.CurrentMax
.isValid())
1136 dbgs() << "CurrMx1 " << TRI
->getRegPressureSetName(Delta
.CurrentMax
.getPSet())
1137 << " " << Delta
.CurrentMax
.getUnitInc() << "\n";
1138 if (Delta2
.Excess
.isValid())
1139 dbgs() << "Excess2 " << TRI
->getRegPressureSetName(Delta2
.Excess
.getPSet())
1140 << " " << Delta2
.Excess
.getUnitInc() << "\n";
1141 if (Delta2
.CriticalMax
.isValid())
1142 dbgs() << "Critic2 " << TRI
->getRegPressureSetName(Delta2
.CriticalMax
.getPSet())
1143 << " " << Delta2
.CriticalMax
.getUnitInc() << "\n";
1144 if (Delta2
.CurrentMax
.isValid())
1145 dbgs() << "CurrMx2 " << TRI
->getRegPressureSetName(Delta2
.CurrentMax
.getPSet())
1146 << " " << Delta2
.CurrentMax
.getUnitInc() << "\n";
1147 llvm_unreachable("RegP Delta Mismatch");
1152 /// This is the fast version of querying register pressure that does not
1153 /// directly depend on current liveness.
1155 /// @param Delta captures information needed for heuristics.
1157 /// @param CriticalPSets Are the pressure sets that are known to exceed some
1158 /// limit within the region, not necessarily at the current position.
1160 /// @param MaxPressureLimit Is the max pressure within the region, not
1161 /// necessarily at the current position.
1162 void RegPressureTracker::
1163 getUpwardPressureDelta(const MachineInstr
*MI
, /*const*/ PressureDiff
&PDiff
,
1164 RegPressureDelta
&Delta
,
1165 ArrayRef
<PressureChange
> CriticalPSets
,
1166 ArrayRef
<unsigned> MaxPressureLimit
) const {
1167 unsigned CritIdx
= 0, CritEnd
= CriticalPSets
.size();
1168 for (PressureDiff::const_iterator
1169 PDiffI
= PDiff
.begin(), PDiffE
= PDiff
.end();
1170 PDiffI
!= PDiffE
&& PDiffI
->isValid(); ++PDiffI
) {
1172 unsigned PSetID
= PDiffI
->getPSet();
1173 unsigned Limit
= RCI
->getRegPressureSetLimit(PSetID
);
1174 if (!LiveThruPressure
.empty())
1175 Limit
+= LiveThruPressure
[PSetID
];
1177 unsigned POld
= CurrSetPressure
[PSetID
];
1178 unsigned MOld
= P
.MaxSetPressure
[PSetID
];
1179 unsigned MNew
= MOld
;
1180 // Ignore DeadDefs here because they aren't captured by PressureChange.
1181 unsigned PNew
= POld
+ PDiffI
->getUnitInc();
1182 assert((PDiffI
->getUnitInc() >= 0) == (PNew
>= POld
)
1183 && "PSet overflow/underflow");
1186 // Check if current pressure has exceeded the limit.
1187 if (!Delta
.Excess
.isValid()) {
1188 unsigned ExcessInc
= 0;
1190 ExcessInc
= POld
> Limit
? PNew
- POld
: PNew
- Limit
;
1191 else if (POld
> Limit
)
1192 ExcessInc
= Limit
- POld
;
1194 Delta
.Excess
= PressureChange(PSetID
);
1195 Delta
.Excess
.setUnitInc(ExcessInc
);
1198 // Check if max pressure has exceeded a critical pressure set max.
1201 if (!Delta
.CriticalMax
.isValid()) {
1202 while (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() < PSetID
)
1205 if (CritIdx
!= CritEnd
&& CriticalPSets
[CritIdx
].getPSet() == PSetID
) {
1206 int CritInc
= (int)MNew
- (int)CriticalPSets
[CritIdx
].getUnitInc();
1207 if (CritInc
> 0 && CritInc
<= std::numeric_limits
<int16_t>::max()) {
1208 Delta
.CriticalMax
= PressureChange(PSetID
);
1209 Delta
.CriticalMax
.setUnitInc(CritInc
);
1213 // Check if max pressure has exceeded the current max.
1214 if (!Delta
.CurrentMax
.isValid() && MNew
> MaxPressureLimit
[PSetID
]) {
1215 Delta
.CurrentMax
= PressureChange(PSetID
);
1216 Delta
.CurrentMax
.setUnitInc(MNew
- MOld
);
1221 /// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx).
1222 /// The query starts with a lane bitmask which gets lanes/bits removed for every
1224 static LaneBitmask
findUseBetween(unsigned Reg
, LaneBitmask LastUseMask
,
1225 SlotIndex PriorUseIdx
, SlotIndex NextUseIdx
,
1226 const MachineRegisterInfo
&MRI
,
1227 const LiveIntervals
*LIS
) {
1228 const TargetRegisterInfo
&TRI
= *MRI
.getTargetRegisterInfo();
1229 for (const MachineOperand
&MO
: MRI
.use_nodbg_operands(Reg
)) {
1232 const MachineInstr
*MI
= MO
.getParent();
1233 SlotIndex InstSlot
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1234 if (InstSlot
>= PriorUseIdx
&& InstSlot
< NextUseIdx
) {
1235 unsigned SubRegIdx
= MO
.getSubReg();
1236 LaneBitmask UseMask
= TRI
.getSubRegIndexLaneMask(SubRegIdx
);
1237 LastUseMask
&= ~UseMask
;
1238 if (LastUseMask
.none())
1239 return LaneBitmask::getNone();
1245 LaneBitmask
RegPressureTracker::getLiveLanesAt(Register RegUnit
,
1246 SlotIndex Pos
) const {
1247 assert(RequireIntervals
);
1248 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
, Pos
,
1249 LaneBitmask::getAll(),
1250 [](const LiveRange
&LR
, SlotIndex Pos
) {
1251 return LR
.liveAt(Pos
);
1255 LaneBitmask
RegPressureTracker::getLastUsedLanes(Register RegUnit
,
1256 SlotIndex Pos
) const {
1257 assert(RequireIntervals
);
1258 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
,
1259 Pos
.getBaseIndex(), LaneBitmask::getNone(),
1260 [](const LiveRange
&LR
, SlotIndex Pos
) {
1261 const LiveRange::Segment
*S
= LR
.getSegmentContaining(Pos
);
1262 return S
!= nullptr && S
->end
== Pos
.getRegSlot();
1266 LaneBitmask
RegPressureTracker::getLiveThroughAt(Register RegUnit
,
1267 SlotIndex Pos
) const {
1268 assert(RequireIntervals
);
1269 return getLanesWithProperty(*LIS
, *MRI
, TrackLaneMasks
, RegUnit
, Pos
,
1270 LaneBitmask::getNone(),
1271 [](const LiveRange
&LR
, SlotIndex Pos
) {
1272 const LiveRange::Segment
*S
= LR
.getSegmentContaining(Pos
);
1273 return S
!= nullptr && S
->start
< Pos
.getRegSlot(true) &&
1274 S
->end
!= Pos
.getDeadSlot();
1278 /// Record the downward impact of a single instruction on current register
1279 /// pressure. Unlike the advance/recede pressure tracking interface, this does
1280 /// not discover live in/outs.
1282 /// This is intended for speculative queries. It leaves pressure inconsistent
1283 /// with the current position, so must be restored by the caller.
1284 void RegPressureTracker::bumpDownwardPressure(const MachineInstr
*MI
) {
1285 assert(!MI
->isDebugOrPseudoInstr() && "Expect a nondebug instruction.");
1288 if (RequireIntervals
)
1289 SlotIdx
= LIS
->getInstructionIndex(*MI
).getRegSlot();
1291 // Account for register pressure similar to RegPressureTracker::recede().
1292 RegisterOperands RegOpers
;
1293 RegOpers
.collect(*MI
, *TRI
, *MRI
, TrackLaneMasks
, false);
1295 RegOpers
.adjustLaneLiveness(*LIS
, *MRI
, SlotIdx
);
1297 if (RequireIntervals
) {
1298 for (const RegisterMaskPair
&Use
: RegOpers
.Uses
) {
1299 Register Reg
= Use
.RegUnit
;
1300 LaneBitmask LastUseMask
= getLastUsedLanes(Reg
, SlotIdx
);
1301 if (LastUseMask
.none())
1303 // The LastUseMask is queried from the liveness information of instruction
1304 // which may be further down the schedule. Some lanes may actually not be
1305 // last uses for the current position.
1306 // FIXME: allow the caller to pass in the list of vreg uses that remain
1307 // to be bottom-scheduled to avoid searching uses at each query.
1308 SlotIndex CurrIdx
= getCurrSlot();
1310 = findUseBetween(Reg
, LastUseMask
, CurrIdx
, SlotIdx
, *MRI
, LIS
);
1311 if (LastUseMask
.none())
1314 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
1315 LaneBitmask NewMask
= LiveMask
& ~LastUseMask
;
1316 decreaseRegPressure(Reg
, LiveMask
, NewMask
);
1320 // Generate liveness for defs.
1321 for (const RegisterMaskPair
&Def
: RegOpers
.Defs
) {
1322 Register Reg
= Def
.RegUnit
;
1323 LaneBitmask LiveMask
= LiveRegs
.contains(Reg
);
1324 LaneBitmask NewMask
= LiveMask
| Def
.LaneMask
;
1325 increaseRegPressure(Reg
, LiveMask
, NewMask
);
1328 // Boost pressure for all dead defs together.
1329 bumpDeadDefs(RegOpers
.DeadDefs
);
1332 /// Consider the pressure increase caused by traversing this instruction
1333 /// top-down. Find the register class with the most change in its pressure limit
1334 /// based on the tracker's current pressure, and return the number of excess
1335 /// register units of that pressure set introduced by this instruction.
1337 /// This assumes that the current LiveIn set is sufficient.
1339 /// This is expensive for an on-the-fly query because it calls
1340 /// bumpDownwardPressure to recompute the pressure sets based on current
1341 /// liveness. We don't yet have a fast version of downward pressure tracking
1342 /// analogous to getUpwardPressureDelta.
1343 void RegPressureTracker::
1344 getMaxDownwardPressureDelta(const MachineInstr
*MI
, RegPressureDelta
&Delta
,
1345 ArrayRef
<PressureChange
> CriticalPSets
,
1346 ArrayRef
<unsigned> MaxPressureLimit
) {
1347 // Snapshot Pressure.
1348 std::vector
<unsigned> SavedPressure
= CurrSetPressure
;
1349 std::vector
<unsigned> SavedMaxPressure
= P
.MaxSetPressure
;
1351 bumpDownwardPressure(MI
);
1353 computeExcessPressureDelta(SavedPressure
, CurrSetPressure
, Delta
, RCI
,
1355 computeMaxPressureDelta(SavedMaxPressure
, P
.MaxSetPressure
, CriticalPSets
,
1356 MaxPressureLimit
, Delta
);
1357 assert(Delta
.CriticalMax
.getUnitInc() >= 0 &&
1358 Delta
.CurrentMax
.getUnitInc() >= 0 && "cannot decrease max pressure");
1360 // Restore the tracker's state.
1361 P
.MaxSetPressure
.swap(SavedMaxPressure
);
1362 CurrSetPressure
.swap(SavedPressure
);
1365 /// Get the pressure of each PSet after traversing this instruction bottom-up.
1366 void RegPressureTracker::
1367 getUpwardPressure(const MachineInstr
*MI
,
1368 std::vector
<unsigned> &PressureResult
,
1369 std::vector
<unsigned> &MaxPressureResult
) {
1370 // Snapshot pressure.
1371 PressureResult
= CurrSetPressure
;
1372 MaxPressureResult
= P
.MaxSetPressure
;
1374 bumpUpwardPressure(MI
);
1376 // Current pressure becomes the result. Restore current pressure.
1377 P
.MaxSetPressure
.swap(MaxPressureResult
);
1378 CurrSetPressure
.swap(PressureResult
);
1381 /// Get the pressure of each PSet after traversing this instruction top-down.
1382 void RegPressureTracker::
1383 getDownwardPressure(const MachineInstr
*MI
,
1384 std::vector
<unsigned> &PressureResult
,
1385 std::vector
<unsigned> &MaxPressureResult
) {
1386 // Snapshot pressure.
1387 PressureResult
= CurrSetPressure
;
1388 MaxPressureResult
= P
.MaxSetPressure
;
1390 bumpDownwardPressure(MI
);
1392 // Current pressure becomes the result. Restore current pressure.
1393 P
.MaxSetPressure
.swap(MaxPressureResult
);
1394 CurrSetPressure
.swap(PressureResult
);