Home | History | Annotate | Download | only in CodeGen
      1 //===-- RegisterPressure.cpp - Dynamic Register Pressure ------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the RegisterPressure class which can be used to track
     11 // MachineInstr level register pressure.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/CodeGen/RegisterPressure.h"
     16 #include "llvm/CodeGen/LiveInterval.h"
     17 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
     18 #include "llvm/CodeGen/MachineRegisterInfo.h"
     19 #include "llvm/CodeGen/RegisterClassInfo.h"
     20 #include "llvm/Support/Debug.h"
     21 #include "llvm/Support/raw_ostream.h"
     22 
     23 using namespace llvm;
     24 
     25 /// Increase pressure for each pressure set provided by TargetRegisterInfo.
     26 static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure,
     27                                 PSetIterator PSetI) {
     28   unsigned Weight = PSetI.getWeight();
     29   for (; PSetI.isValid(); ++PSetI)
     30     CurrSetPressure[*PSetI] += Weight;
     31 }
     32 
     33 /// Decrease pressure for each pressure set provided by TargetRegisterInfo.
     34 static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure,
     35                                 PSetIterator PSetI) {
     36   unsigned Weight = PSetI.getWeight();
     37   for (; PSetI.isValid(); ++PSetI) {
     38     assert(CurrSetPressure[*PSetI] >= Weight && "register pressure underflow");
     39     CurrSetPressure[*PSetI] -= Weight;
     40   }
     41 }
     42 
     43 LLVM_DUMP_METHOD
     44 void llvm::dumpRegSetPressure(ArrayRef<unsigned> SetPressure,
     45                               const TargetRegisterInfo *TRI) {
     46   bool Empty = true;
     47   for (unsigned i = 0, e = SetPressure.size(); i < e; ++i) {
     48     if (SetPressure[i] != 0) {
     49       dbgs() << TRI->getRegPressureSetName(i) << "=" << SetPressure[i] << '\n';
     50       Empty = false;
     51     }
     52   }
     53   if (Empty)
     54     dbgs() << "\n";
     55 }
     56 
     57 LLVM_DUMP_METHOD
     58 void RegisterPressure::dump(const TargetRegisterInfo *TRI) const {
     59   dbgs() << "Max Pressure: ";
     60   dumpRegSetPressure(MaxSetPressure, TRI);
     61   dbgs() << "Live In: ";
     62   for (unsigned Reg : LiveInRegs)
     63     dbgs() << PrintVRegOrUnit(Reg, TRI) << " ";
     64   dbgs() << '\n';
     65   dbgs() << "Live Out: ";
     66   for (unsigned Reg : LiveOutRegs)
     67     dbgs() << PrintVRegOrUnit(Reg, TRI) << " ";
     68   dbgs() << '\n';
     69 }
     70 
     71 LLVM_DUMP_METHOD
     72 void RegPressureTracker::dump() const {
     73   if (!isTopClosed() || !isBottomClosed()) {
     74     dbgs() << "Curr Pressure: ";
     75     dumpRegSetPressure(CurrSetPressure, TRI);
     76   }
     77   P.dump(TRI);
     78 }
     79 
     80 void PressureDiff::dump(const TargetRegisterInfo &TRI) const {
     81   const char *sep = "";
     82   for (const PressureChange &Change : *this) {
     83     if (!Change.isValid())
     84       break;
     85     dbgs() << sep << TRI.getRegPressureSetName(Change.getPSet())
     86            << " " << Change.getUnitInc();
     87     sep = "    ";
     88   }
     89   dbgs() << '\n';
     90 }
     91 
     92 /// Increase the current pressure as impacted by these registers and bump
     93 /// the high water mark if needed.
     94 void RegPressureTracker::increaseRegPressure(ArrayRef<unsigned> RegUnits) {
     95   for (unsigned RegUnit : RegUnits) {
     96     PSetIterator PSetI = MRI->getPressureSets(RegUnit);
     97     unsigned Weight = PSetI.getWeight();
     98     for (; PSetI.isValid(); ++PSetI) {
     99       CurrSetPressure[*PSetI] += Weight;
    100       if (CurrSetPressure[*PSetI] > P.MaxSetPressure[*PSetI]) {
    101         P.MaxSetPressure[*PSetI] = CurrSetPressure[*PSetI];
    102       }
    103     }
    104   }
    105 }
    106 
    107 /// Simply decrease the current pressure as impacted by these registers.
    108 void RegPressureTracker::decreaseRegPressure(ArrayRef<unsigned> RegUnits) {
    109   for (unsigned RegUnit : RegUnits)
    110     decreaseSetPressure(CurrSetPressure, MRI->getPressureSets(RegUnit));
    111 }
    112 
    113 /// Clear the result so it can be used for another round of pressure tracking.
    114 void IntervalPressure::reset() {
    115   TopIdx = BottomIdx = SlotIndex();
    116   MaxSetPressure.clear();
    117   LiveInRegs.clear();
    118   LiveOutRegs.clear();
    119 }
    120 
    121 /// Clear the result so it can be used for another round of pressure tracking.
    122 void RegionPressure::reset() {
    123   TopPos = BottomPos = MachineBasicBlock::const_iterator();
    124   MaxSetPressure.clear();
    125   LiveInRegs.clear();
    126   LiveOutRegs.clear();
    127 }
    128 
    129 /// If the current top is not less than or equal to the next index, open it.
    130 /// We happen to need the SlotIndex for the next top for pressure update.
    131 void IntervalPressure::openTop(SlotIndex NextTop) {
    132   if (TopIdx <= NextTop)
    133     return;
    134   TopIdx = SlotIndex();
    135   LiveInRegs.clear();
    136 }
    137 
    138 /// If the current top is the previous instruction (before receding), open it.
    139 void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop) {
    140   if (TopPos != PrevTop)
    141     return;
    142   TopPos = MachineBasicBlock::const_iterator();
    143   LiveInRegs.clear();
    144 }
    145 
    146 /// If the current bottom is not greater than the previous index, open it.
    147 void IntervalPressure::openBottom(SlotIndex PrevBottom) {
    148   if (BottomIdx > PrevBottom)
    149     return;
    150   BottomIdx = SlotIndex();
    151   LiveInRegs.clear();
    152 }
    153 
    154 /// If the current bottom is the previous instr (before advancing), open it.
    155 void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom) {
    156   if (BottomPos != PrevBottom)
    157     return;
    158   BottomPos = MachineBasicBlock::const_iterator();
    159   LiveInRegs.clear();
    160 }
    161 
    162 void LiveRegSet::init(const MachineRegisterInfo &MRI) {
    163   const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
    164   unsigned NumRegUnits = TRI.getNumRegs();
    165   unsigned NumVirtRegs = MRI.getNumVirtRegs();
    166   Regs.setUniverse(NumRegUnits + NumVirtRegs);
    167   this->NumRegUnits = NumRegUnits;
    168 }
    169 
    170 void LiveRegSet::clear() {
    171   Regs.clear();
    172 }
    173 
    174 static const LiveRange *getLiveRange(const LiveIntervals &LIS, unsigned Reg) {
    175   if (TargetRegisterInfo::isVirtualRegister(Reg))
    176     return &LIS.getInterval(Reg);
    177   return LIS.getCachedRegUnit(Reg);
    178 }
    179 
    180 void RegPressureTracker::reset() {
    181   MBB = nullptr;
    182   LIS = nullptr;
    183 
    184   CurrSetPressure.clear();
    185   LiveThruPressure.clear();
    186   P.MaxSetPressure.clear();
    187 
    188   if (RequireIntervals)
    189     static_cast<IntervalPressure&>(P).reset();
    190   else
    191     static_cast<RegionPressure&>(P).reset();
    192 
    193   LiveRegs.clear();
    194   UntiedDefs.clear();
    195 }
    196 
    197 /// Setup the RegPressureTracker.
    198 ///
    199 /// TODO: Add support for pressure without LiveIntervals.
    200 void RegPressureTracker::init(const MachineFunction *mf,
    201                               const RegisterClassInfo *rci,
    202                               const LiveIntervals *lis,
    203                               const MachineBasicBlock *mbb,
    204                               MachineBasicBlock::const_iterator pos,
    205                               bool ShouldTrackUntiedDefs)
    206 {
    207   reset();
    208 
    209   MF = mf;
    210   TRI = MF->getSubtarget().getRegisterInfo();
    211   RCI = rci;
    212   MRI = &MF->getRegInfo();
    213   MBB = mbb;
    214   TrackUntiedDefs = ShouldTrackUntiedDefs;
    215 
    216   if (RequireIntervals) {
    217     assert(lis && "IntervalPressure requires LiveIntervals");
    218     LIS = lis;
    219   }
    220 
    221   CurrPos = pos;
    222   CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0);
    223 
    224   P.MaxSetPressure = CurrSetPressure;
    225 
    226   LiveRegs.init(*MRI);
    227   if (TrackUntiedDefs)
    228     UntiedDefs.setUniverse(MRI->getNumVirtRegs());
    229 }
    230 
    231 /// Does this pressure result have a valid top position and live ins.
    232 bool RegPressureTracker::isTopClosed() const {
    233   if (RequireIntervals)
    234     return static_cast<IntervalPressure&>(P).TopIdx.isValid();
    235   return (static_cast<RegionPressure&>(P).TopPos ==
    236           MachineBasicBlock::const_iterator());
    237 }
    238 
    239 /// Does this pressure result have a valid bottom position and live outs.
    240 bool RegPressureTracker::isBottomClosed() const {
    241   if (RequireIntervals)
    242     return static_cast<IntervalPressure&>(P).BottomIdx.isValid();
    243   return (static_cast<RegionPressure&>(P).BottomPos ==
    244           MachineBasicBlock::const_iterator());
    245 }
    246 
    247 
    248 SlotIndex RegPressureTracker::getCurrSlot() const {
    249   MachineBasicBlock::const_iterator IdxPos = CurrPos;
    250   while (IdxPos != MBB->end() && IdxPos->isDebugValue())
    251     ++IdxPos;
    252   if (IdxPos == MBB->end())
    253     return LIS->getMBBEndIdx(MBB);
    254   return LIS->getInstructionIndex(IdxPos).getRegSlot();
    255 }
    256 
    257 /// Set the boundary for the top of the region and summarize live ins.
    258 void RegPressureTracker::closeTop() {
    259   if (RequireIntervals)
    260     static_cast<IntervalPressure&>(P).TopIdx = getCurrSlot();
    261   else
    262     static_cast<RegionPressure&>(P).TopPos = CurrPos;
    263 
    264   assert(P.LiveInRegs.empty() && "inconsistent max pressure result");
    265   P.LiveInRegs.reserve(LiveRegs.size());
    266   LiveRegs.appendTo(P.LiveInRegs);
    267 }
    268 
    269 /// Set the boundary for the bottom of the region and summarize live outs.
    270 void RegPressureTracker::closeBottom() {
    271   if (RequireIntervals)
    272     static_cast<IntervalPressure&>(P).BottomIdx = getCurrSlot();
    273   else
    274     static_cast<RegionPressure&>(P).BottomPos = CurrPos;
    275 
    276   assert(P.LiveOutRegs.empty() && "inconsistent max pressure result");
    277   P.LiveOutRegs.reserve(LiveRegs.size());
    278   LiveRegs.appendTo(P.LiveOutRegs);
    279 }
    280 
    281 /// Finalize the region boundaries and record live ins and live outs.
    282 void RegPressureTracker::closeRegion() {
    283   if (!isTopClosed() && !isBottomClosed()) {
    284     assert(LiveRegs.size() == 0 && "no region boundary");
    285     return;
    286   }
    287   if (!isBottomClosed())
    288     closeBottom();
    289   else if (!isTopClosed())
    290     closeTop();
    291   // If both top and bottom are closed, do nothing.
    292 }
    293 
    294 /// The register tracker is unaware of global liveness so ignores normal
    295 /// live-thru ranges. However, two-address or coalesced chains can also lead
    296 /// to live ranges with no holes. Count these to inform heuristics that we
    297 /// can never drop below this pressure.
    298 void RegPressureTracker::initLiveThru(const RegPressureTracker &RPTracker) {
    299   LiveThruPressure.assign(TRI->getNumRegPressureSets(), 0);
    300   assert(isBottomClosed() && "need bottom-up tracking to intialize.");
    301   for (unsigned Reg : P.LiveOutRegs) {
    302     if (TargetRegisterInfo::isVirtualRegister(Reg)
    303         && !RPTracker.hasUntiedDef(Reg)) {
    304       increaseSetPressure(LiveThruPressure, MRI->getPressureSets(Reg));
    305     }
    306   }
    307 }
    308 
    309 /// \brief Convenient wrapper for checking membership in RegisterOperands.
    310 /// (std::count() doesn't have an early exit).
    311 static bool containsReg(ArrayRef<unsigned> RegUnits, unsigned RegUnit) {
    312   return std::find(RegUnits.begin(), RegUnits.end(), RegUnit) != RegUnits.end();
    313 }
    314 
    315 namespace {
    316 
    317 /// List of register defined and used by a machine instruction.
    318 class RegisterOperands {
    319 public:
    320   SmallVector<unsigned, 8> Uses;
    321   SmallVector<unsigned, 8> Defs;
    322   SmallVector<unsigned, 8> DeadDefs;
    323 
    324   void collect(const MachineInstr &MI, const TargetRegisterInfo &TRI,
    325                const MachineRegisterInfo &MRI, bool IgnoreDead = false);
    326 
    327   /// Use liveness information to find dead defs not marked with a dead flag
    328   /// and move them to the DeadDefs vector.
    329   void detectDeadDefs(const MachineInstr &MI, const LiveIntervals &LIS);
    330 };
    331 
    332 /// Collect this instruction's unique uses and defs into SmallVectors for
    333 /// processing defs and uses in order.
    334 ///
    335 /// FIXME: always ignore tied opers
    336 class RegisterOperandsCollector {
    337   RegisterOperands &RegOpers;
    338   const TargetRegisterInfo &TRI;
    339   const MachineRegisterInfo &MRI;
    340   bool IgnoreDead;
    341 
    342   RegisterOperandsCollector(RegisterOperands &RegOpers,
    343                             const TargetRegisterInfo &TRI,
    344                             const MachineRegisterInfo &MRI,
    345                             bool IgnoreDead)
    346     : RegOpers(RegOpers), TRI(TRI), MRI(MRI), IgnoreDead(IgnoreDead) {}
    347 
    348   void collectInstr(const MachineInstr &MI) const {
    349     for (ConstMIBundleOperands OperI(&MI); OperI.isValid(); ++OperI)
    350       collectOperand(*OperI);
    351 
    352     // Remove redundant physreg dead defs.
    353     SmallVectorImpl<unsigned>::iterator I =
    354       std::remove_if(RegOpers.DeadDefs.begin(), RegOpers.DeadDefs.end(),
    355                      std::bind1st(std::ptr_fun(containsReg), RegOpers.Defs));
    356     RegOpers.DeadDefs.erase(I, RegOpers.DeadDefs.end());
    357   }
    358 
    359   /// Push this operand's register onto the correct vectors.
    360   void collectOperand(const MachineOperand &MO) const {
    361     if (!MO.isReg() || !MO.getReg())
    362       return;
    363     unsigned Reg = MO.getReg();
    364     if (MO.readsReg())
    365       pushRegUnits(Reg, RegOpers.Uses);
    366     if (MO.isDef()) {
    367       if (MO.isDead()) {
    368         if (!IgnoreDead)
    369           pushRegUnits(Reg, RegOpers.DeadDefs);
    370       } else
    371         pushRegUnits(Reg, RegOpers.Defs);
    372     }
    373   }
    374 
    375   void pushRegUnits(unsigned Reg, SmallVectorImpl<unsigned> &RegUnits) const {
    376     if (TargetRegisterInfo::isVirtualRegister(Reg)) {
    377       if (containsReg(RegUnits, Reg))
    378         return;
    379       RegUnits.push_back(Reg);
    380     } else if (MRI.isAllocatable(Reg)) {
    381       for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units) {
    382         if (containsReg(RegUnits, *Units))
    383           continue;
    384         RegUnits.push_back(*Units);
    385       }
    386     }
    387   }
    388 
    389   friend class RegisterOperands;
    390 };
    391 
    392 void RegisterOperands::collect(const MachineInstr &MI,
    393                                const TargetRegisterInfo &TRI,
    394                                const MachineRegisterInfo &MRI,
    395                                bool IgnoreDead) {
    396   RegisterOperandsCollector Collector(*this, TRI, MRI, IgnoreDead);
    397   Collector.collectInstr(MI);
    398 }
    399 
    400 void RegisterOperands::detectDeadDefs(const MachineInstr &MI,
    401                                       const LiveIntervals &LIS) {
    402   SlotIndex SlotIdx = LIS.getInstructionIndex(&MI);
    403   for (SmallVectorImpl<unsigned>::iterator RI = Defs.begin();
    404        RI != Defs.end(); /*empty*/) {
    405     unsigned Reg = *RI;
    406     const LiveRange *LR = getLiveRange(LIS, Reg);
    407     if (LR != nullptr) {
    408       LiveQueryResult LRQ = LR->Query(SlotIdx);
    409       if (LRQ.isDeadDef()) {
    410         // LiveIntervals knows this is a dead even though it's MachineOperand is
    411         // not flagged as such.
    412         DeadDefs.push_back(Reg);
    413         RI = Defs.erase(RI);
    414         continue;
    415       }
    416     }
    417     ++RI;
    418   }
    419 }
    420 
    421 } // namespace
    422 
    423 /// Initialize an array of N PressureDiffs.
    424 void PressureDiffs::init(unsigned N) {
    425   Size = N;
    426   if (N <= Max) {
    427     memset(PDiffArray, 0, N * sizeof(PressureDiff));
    428     return;
    429   }
    430   Max = Size;
    431   free(PDiffArray);
    432   PDiffArray = reinterpret_cast<PressureDiff*>(calloc(N, sizeof(PressureDiff)));
    433 }
    434 
    435 /// Add a change in pressure to the pressure diff of a given instruction.
    436 void PressureDiff::addPressureChange(unsigned RegUnit, bool IsDec,
    437                                      const MachineRegisterInfo *MRI) {
    438   PSetIterator PSetI = MRI->getPressureSets(RegUnit);
    439   int Weight = IsDec ? -PSetI.getWeight() : PSetI.getWeight();
    440   for (; PSetI.isValid(); ++PSetI) {
    441     // Find an existing entry in the pressure diff for this PSet.
    442     PressureDiff::iterator I = nonconst_begin(), E = nonconst_end();
    443     for (; I != E && I->isValid(); ++I) {
    444       if (I->getPSet() >= *PSetI)
    445         break;
    446     }
    447     // If all pressure sets are more constrained, skip the remaining PSets.
    448     if (I == E)
    449       break;
    450     // Insert this PressureChange.
    451     if (!I->isValid() || I->getPSet() != *PSetI) {
    452       PressureChange PTmp = PressureChange(*PSetI);
    453       for (PressureDiff::iterator J = I; J != E && PTmp.isValid(); ++J)
    454         std::swap(*J, PTmp);
    455     }
    456     // Update the units for this pressure set.
    457     unsigned NewUnitInc = I->getUnitInc() + Weight;
    458     if (NewUnitInc != 0) {
    459       I->setUnitInc(NewUnitInc);
    460     } else {
    461       // Remove entry
    462       PressureDiff::iterator J;
    463       for (J = std::next(I); J != E && J->isValid(); ++J, ++I)
    464         *I = *J;
    465       if (J != E)
    466         *I = *J;
    467     }
    468   }
    469 }
    470 
    471 /// Record the pressure difference induced by the given operand list.
    472 static void collectPDiff(PressureDiff &PDiff, RegisterOperands &RegOpers,
    473                          const MachineRegisterInfo *MRI) {
    474   assert(!PDiff.begin()->isValid() && "stale PDiff");
    475 
    476   for (unsigned Reg : RegOpers.Defs)
    477     PDiff.addPressureChange(Reg, true, MRI);
    478 
    479   for (unsigned Reg : RegOpers.Uses)
    480     PDiff.addPressureChange(Reg, false, MRI);
    481 }
    482 
    483 /// Force liveness of registers.
    484 void RegPressureTracker::addLiveRegs(ArrayRef<unsigned> Regs) {
    485   for (unsigned Reg : Regs) {
    486     if (LiveRegs.insert(Reg))
    487       increaseRegPressure(Reg);
    488   }
    489 }
    490 
    491 /// Add Reg to the live in set and increase max pressure.
    492 void RegPressureTracker::discoverLiveIn(unsigned Reg) {
    493   assert(!LiveRegs.contains(Reg) && "avoid bumping max pressure twice");
    494   if (containsReg(P.LiveInRegs, Reg))
    495     return;
    496 
    497   // At live in discovery, unconditionally increase the high water mark.
    498   P.LiveInRegs.push_back(Reg);
    499   increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg));
    500 }
    501 
    502 /// Add Reg to the live out set and increase max pressure.
    503 void RegPressureTracker::discoverLiveOut(unsigned Reg) {
    504   assert(!LiveRegs.contains(Reg) && "avoid bumping max pressure twice");
    505   if (containsReg(P.LiveOutRegs, Reg))
    506     return;
    507 
    508   // At live out discovery, unconditionally increase the high water mark.
    509   P.LiveOutRegs.push_back(Reg);
    510   increaseSetPressure(P.MaxSetPressure, MRI->getPressureSets(Reg));
    511 }
    512 
    513 /// Recede across the previous instruction. If LiveUses is provided, record any
    514 /// RegUnits that are made live by the current instruction's uses. This includes
    515 /// registers that are both defined and used by the instruction.  If a pressure
    516 /// difference pointer is provided record the changes is pressure caused by this
    517 /// instruction independent of liveness.
    518 void RegPressureTracker::recede(SmallVectorImpl<unsigned> *LiveUses,
    519                                 PressureDiff *PDiff) {
    520   assert(CurrPos != MBB->begin());
    521   if (!isBottomClosed())
    522     closeBottom();
    523 
    524   // Open the top of the region using block iterators.
    525   if (!RequireIntervals && isTopClosed())
    526     static_cast<RegionPressure&>(P).openTop(CurrPos);
    527 
    528   // Find the previous instruction.
    529   do
    530     --CurrPos;
    531   while (CurrPos != MBB->begin() && CurrPos->isDebugValue());
    532   assert(!CurrPos->isDebugValue());
    533 
    534   SlotIndex SlotIdx;
    535   if (RequireIntervals)
    536     SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot();
    537 
    538   // Open the top of the region using slot indexes.
    539   if (RequireIntervals && isTopClosed())
    540     static_cast<IntervalPressure&>(P).openTop(SlotIdx);
    541 
    542   const MachineInstr &MI = *CurrPos;
    543   RegisterOperands RegOpers;
    544   RegOpers.collect(MI, *TRI, *MRI);
    545   if (RequireIntervals)
    546     RegOpers.detectDeadDefs(MI, *LIS);
    547 
    548   if (PDiff)
    549     collectPDiff(*PDiff, RegOpers, MRI);
    550 
    551   // Boost pressure for all dead defs together.
    552   increaseRegPressure(RegOpers.DeadDefs);
    553   decreaseRegPressure(RegOpers.DeadDefs);
    554 
    555   // Kill liveness at live defs.
    556   // TODO: consider earlyclobbers?
    557   for (unsigned Reg : RegOpers.Defs) {
    558     if (LiveRegs.erase(Reg))
    559       decreaseRegPressure(Reg);
    560     else
    561       discoverLiveOut(Reg);
    562   }
    563 
    564   // Generate liveness for uses.
    565   for (unsigned Reg : RegOpers.Uses) {
    566     if (!LiveRegs.contains(Reg)) {
    567       // Adjust liveouts if LiveIntervals are available.
    568       if (RequireIntervals) {
    569         const LiveRange *LR = getLiveRange(*LIS, Reg);
    570         if (LR) {
    571           LiveQueryResult LRQ = LR->Query(SlotIdx);
    572           if (!LRQ.isKill() && !LRQ.valueDefined())
    573             discoverLiveOut(Reg);
    574         }
    575       }
    576       increaseRegPressure(Reg);
    577       LiveRegs.insert(Reg);
    578       if (LiveUses && !containsReg(*LiveUses, Reg))
    579         LiveUses->push_back(Reg);
    580     }
    581   }
    582   if (TrackUntiedDefs) {
    583     for (unsigned Reg : RegOpers.Defs) {
    584       if (TargetRegisterInfo::isVirtualRegister(Reg) && !LiveRegs.contains(Reg))
    585         UntiedDefs.insert(Reg);
    586     }
    587   }
    588 }
    589 
    590 /// Advance across the current instruction.
    591 void RegPressureTracker::advance() {
    592   assert(!TrackUntiedDefs && "unsupported mode");
    593 
    594   assert(CurrPos != MBB->end());
    595   if (!isTopClosed())
    596     closeTop();
    597 
    598   SlotIndex SlotIdx;
    599   if (RequireIntervals)
    600     SlotIdx = getCurrSlot();
    601 
    602   // Open the bottom of the region using slot indexes.
    603   if (isBottomClosed()) {
    604     if (RequireIntervals)
    605       static_cast<IntervalPressure&>(P).openBottom(SlotIdx);
    606     else
    607       static_cast<RegionPressure&>(P).openBottom(CurrPos);
    608   }
    609 
    610   RegisterOperands RegOpers;
    611   RegOpers.collect(*CurrPos, *TRI, *MRI);
    612 
    613   for (unsigned Reg : RegOpers.Uses) {
    614     // Discover live-ins.
    615     bool isLive = LiveRegs.contains(Reg);
    616     if (!isLive)
    617       discoverLiveIn(Reg);
    618     // Kill liveness at last uses.
    619     bool lastUse = false;
    620     if (RequireIntervals) {
    621       const LiveRange *LR = getLiveRange(*LIS, Reg);
    622       lastUse = LR && LR->Query(SlotIdx).isKill();
    623     } else {
    624       // Allocatable physregs are always single-use before register rewriting.
    625       lastUse = !TargetRegisterInfo::isVirtualRegister(Reg);
    626     }
    627     if (lastUse && isLive) {
    628       LiveRegs.erase(Reg);
    629       decreaseRegPressure(Reg);
    630     } else if (!lastUse && !isLive)
    631       increaseRegPressure(Reg);
    632   }
    633 
    634   // Generate liveness for defs.
    635   for (unsigned Reg : RegOpers.Defs) {
    636     if (LiveRegs.insert(Reg))
    637       increaseRegPressure(Reg);
    638   }
    639 
    640   // Boost pressure for all dead defs together.
    641   increaseRegPressure(RegOpers.DeadDefs);
    642   decreaseRegPressure(RegOpers.DeadDefs);
    643 
    644   // Find the next instruction.
    645   do
    646     ++CurrPos;
    647   while (CurrPos != MBB->end() && CurrPos->isDebugValue());
    648 }
    649 
    650 /// Find the max change in excess pressure across all sets.
    651 static void computeExcessPressureDelta(ArrayRef<unsigned> OldPressureVec,
    652                                        ArrayRef<unsigned> NewPressureVec,
    653                                        RegPressureDelta &Delta,
    654                                        const RegisterClassInfo *RCI,
    655                                        ArrayRef<unsigned> LiveThruPressureVec) {
    656   Delta.Excess = PressureChange();
    657   for (unsigned i = 0, e = OldPressureVec.size(); i < e; ++i) {
    658     unsigned POld = OldPressureVec[i];
    659     unsigned PNew = NewPressureVec[i];
    660     int PDiff = (int)PNew - (int)POld;
    661     if (!PDiff) // No change in this set in the common case.
    662       continue;
    663     // Only consider change beyond the limit.
    664     unsigned Limit = RCI->getRegPressureSetLimit(i);
    665     if (!LiveThruPressureVec.empty())
    666       Limit += LiveThruPressureVec[i];
    667 
    668     if (Limit > POld) {
    669       if (Limit > PNew)
    670         PDiff = 0;            // Under the limit
    671       else
    672         PDiff = PNew - Limit; // Just exceeded limit.
    673     } else if (Limit > PNew)
    674       PDiff = Limit - POld;   // Just obeyed limit.
    675 
    676     if (PDiff) {
    677       Delta.Excess = PressureChange(i);
    678       Delta.Excess.setUnitInc(PDiff);
    679       break;
    680     }
    681   }
    682 }
    683 
    684 /// Find the max change in max pressure that either surpasses a critical PSet
    685 /// limit or exceeds the current MaxPressureLimit.
    686 ///
    687 /// FIXME: comparing each element of the old and new MaxPressure vectors here is
    688 /// silly. It's done now to demonstrate the concept but will go away with a
    689 /// RegPressureTracker API change to work with pressure differences.
    690 static void computeMaxPressureDelta(ArrayRef<unsigned> OldMaxPressureVec,
    691                                     ArrayRef<unsigned> NewMaxPressureVec,
    692                                     ArrayRef<PressureChange> CriticalPSets,
    693                                     ArrayRef<unsigned> MaxPressureLimit,
    694                                     RegPressureDelta &Delta) {
    695   Delta.CriticalMax = PressureChange();
    696   Delta.CurrentMax = PressureChange();
    697 
    698   unsigned CritIdx = 0, CritEnd = CriticalPSets.size();
    699   for (unsigned i = 0, e = OldMaxPressureVec.size(); i < e; ++i) {
    700     unsigned POld = OldMaxPressureVec[i];
    701     unsigned PNew = NewMaxPressureVec[i];
    702     if (PNew == POld) // No change in this set in the common case.
    703       continue;
    704 
    705     if (!Delta.CriticalMax.isValid()) {
    706       while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < i)
    707         ++CritIdx;
    708 
    709       if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == i) {
    710         int PDiff = (int)PNew - (int)CriticalPSets[CritIdx].getUnitInc();
    711         if (PDiff > 0) {
    712           Delta.CriticalMax = PressureChange(i);
    713           Delta.CriticalMax.setUnitInc(PDiff);
    714         }
    715       }
    716     }
    717     // Find the first increase above MaxPressureLimit.
    718     // (Ignores negative MDiff).
    719     if (!Delta.CurrentMax.isValid() && PNew > MaxPressureLimit[i]) {
    720       Delta.CurrentMax = PressureChange(i);
    721       Delta.CurrentMax.setUnitInc(PNew - POld);
    722       if (CritIdx == CritEnd || Delta.CriticalMax.isValid())
    723         break;
    724     }
    725   }
    726 }
    727 
    728 /// Record the upward impact of a single instruction on current register
    729 /// pressure. Unlike the advance/recede pressure tracking interface, this does
    730 /// not discover live in/outs.
    731 ///
    732 /// This is intended for speculative queries. It leaves pressure inconsistent
    733 /// with the current position, so must be restored by the caller.
    734 void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) {
    735   assert(!MI->isDebugValue() && "Expect a nondebug instruction.");
    736 
    737   // Account for register pressure similar to RegPressureTracker::recede().
    738   RegisterOperands RegOpers;
    739   RegOpers.collect(*MI, *TRI, *MRI, /*IgnoreDead=*/true);
    740   assert(RegOpers.DeadDefs.size() == 0);
    741   if (RequireIntervals)
    742     RegOpers.detectDeadDefs(*MI, *LIS);
    743 
    744   // Kill liveness at live defs.
    745   for (unsigned Reg : RegOpers.Defs) {
    746     if (!containsReg(RegOpers.Uses, Reg))
    747       decreaseRegPressure(Reg);
    748   }
    749   // Generate liveness for uses.
    750   for (unsigned Reg : RegOpers.Uses) {
    751     if (!LiveRegs.contains(Reg))
    752       increaseRegPressure(Reg);
    753   }
    754 }
    755 
    756 /// Consider the pressure increase caused by traversing this instruction
    757 /// bottom-up. Find the pressure set with the most change beyond its pressure
    758 /// limit based on the tracker's current pressure, and return the change in
    759 /// number of register units of that pressure set introduced by this
    760 /// instruction.
    761 ///
    762 /// This assumes that the current LiveOut set is sufficient.
    763 ///
    764 /// This is expensive for an on-the-fly query because it calls
    765 /// bumpUpwardPressure to recompute the pressure sets based on current
    766 /// liveness. This mainly exists to verify correctness, e.g. with
    767 /// -verify-misched. getUpwardPressureDelta is the fast version of this query
    768 /// that uses the per-SUnit cache of the PressureDiff.
    769 void RegPressureTracker::
    770 getMaxUpwardPressureDelta(const MachineInstr *MI, PressureDiff *PDiff,
    771                           RegPressureDelta &Delta,
    772                           ArrayRef<PressureChange> CriticalPSets,
    773                           ArrayRef<unsigned> MaxPressureLimit) {
    774   // Snapshot Pressure.
    775   // FIXME: The snapshot heap space should persist. But I'm planning to
    776   // summarize the pressure effect so we don't need to snapshot at all.
    777   std::vector<unsigned> SavedPressure = CurrSetPressure;
    778   std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure;
    779 
    780   bumpUpwardPressure(MI);
    781 
    782   computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI,
    783                              LiveThruPressure);
    784   computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets,
    785                           MaxPressureLimit, Delta);
    786   assert(Delta.CriticalMax.getUnitInc() >= 0 &&
    787          Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure");
    788 
    789   // Restore the tracker's state.
    790   P.MaxSetPressure.swap(SavedMaxPressure);
    791   CurrSetPressure.swap(SavedPressure);
    792 
    793 #ifndef NDEBUG
    794   if (!PDiff)
    795     return;
    796 
    797   // Check if the alternate algorithm yields the same result.
    798   RegPressureDelta Delta2;
    799   getUpwardPressureDelta(MI, *PDiff, Delta2, CriticalPSets, MaxPressureLimit);
    800   if (Delta != Delta2) {
    801     dbgs() << "PDiff: ";
    802     PDiff->dump(*TRI);
    803     dbgs() << "DELTA: " << *MI;
    804     if (Delta.Excess.isValid())
    805       dbgs() << "Excess1 " << TRI->getRegPressureSetName(Delta.Excess.getPSet())
    806              << " " << Delta.Excess.getUnitInc() << "\n";
    807     if (Delta.CriticalMax.isValid())
    808       dbgs() << "Critic1 " << TRI->getRegPressureSetName(Delta.CriticalMax.getPSet())
    809              << " " << Delta.CriticalMax.getUnitInc() << "\n";
    810     if (Delta.CurrentMax.isValid())
    811       dbgs() << "CurrMx1 " << TRI->getRegPressureSetName(Delta.CurrentMax.getPSet())
    812              << " " << Delta.CurrentMax.getUnitInc() << "\n";
    813     if (Delta2.Excess.isValid())
    814       dbgs() << "Excess2 " << TRI->getRegPressureSetName(Delta2.Excess.getPSet())
    815              << " " << Delta2.Excess.getUnitInc() << "\n";
    816     if (Delta2.CriticalMax.isValid())
    817       dbgs() << "Critic2 " << TRI->getRegPressureSetName(Delta2.CriticalMax.getPSet())
    818              << " " << Delta2.CriticalMax.getUnitInc() << "\n";
    819     if (Delta2.CurrentMax.isValid())
    820       dbgs() << "CurrMx2 " << TRI->getRegPressureSetName(Delta2.CurrentMax.getPSet())
    821              << " " << Delta2.CurrentMax.getUnitInc() << "\n";
    822     llvm_unreachable("RegP Delta Mismatch");
    823   }
    824 #endif
    825 }
    826 
    827 /// This is the fast version of querying register pressure that does not
    828 /// directly depend on current liveness.
    829 ///
    830 /// @param Delta captures information needed for heuristics.
    831 ///
    832 /// @param CriticalPSets Are the pressure sets that are known to exceed some
    833 /// limit within the region, not necessarily at the current position.
    834 ///
    835 /// @param MaxPressureLimit Is the max pressure within the region, not
    836 /// necessarily at the current position.
    837 void RegPressureTracker::
    838 getUpwardPressureDelta(const MachineInstr *MI, /*const*/ PressureDiff &PDiff,
    839                        RegPressureDelta &Delta,
    840                        ArrayRef<PressureChange> CriticalPSets,
    841                        ArrayRef<unsigned> MaxPressureLimit) const {
    842   unsigned CritIdx = 0, CritEnd = CriticalPSets.size();
    843   for (PressureDiff::const_iterator
    844          PDiffI = PDiff.begin(), PDiffE = PDiff.end();
    845        PDiffI != PDiffE && PDiffI->isValid(); ++PDiffI) {
    846 
    847     unsigned PSetID = PDiffI->getPSet();
    848     unsigned Limit = RCI->getRegPressureSetLimit(PSetID);
    849     if (!LiveThruPressure.empty())
    850       Limit += LiveThruPressure[PSetID];
    851 
    852     unsigned POld = CurrSetPressure[PSetID];
    853     unsigned MOld = P.MaxSetPressure[PSetID];
    854     unsigned MNew = MOld;
    855     // Ignore DeadDefs here because they aren't captured by PressureChange.
    856     unsigned PNew = POld + PDiffI->getUnitInc();
    857     assert((PDiffI->getUnitInc() >= 0) == (PNew >= POld)
    858            && "PSet overflow/underflow");
    859     if (PNew > MOld)
    860       MNew = PNew;
    861     // Check if current pressure has exceeded the limit.
    862     if (!Delta.Excess.isValid()) {
    863       unsigned ExcessInc = 0;
    864       if (PNew > Limit)
    865         ExcessInc = POld > Limit ? PNew - POld : PNew - Limit;
    866       else if (POld > Limit)
    867         ExcessInc = Limit - POld;
    868       if (ExcessInc) {
    869         Delta.Excess = PressureChange(PSetID);
    870         Delta.Excess.setUnitInc(ExcessInc);
    871       }
    872     }
    873     // Check if max pressure has exceeded a critical pressure set max.
    874     if (MNew == MOld)
    875       continue;
    876     if (!Delta.CriticalMax.isValid()) {
    877       while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < PSetID)
    878         ++CritIdx;
    879 
    880       if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == PSetID) {
    881         int CritInc = (int)MNew - (int)CriticalPSets[CritIdx].getUnitInc();
    882         if (CritInc > 0 && CritInc <= INT16_MAX) {
    883           Delta.CriticalMax = PressureChange(PSetID);
    884           Delta.CriticalMax.setUnitInc(CritInc);
    885         }
    886       }
    887     }
    888     // Check if max pressure has exceeded the current max.
    889     if (!Delta.CurrentMax.isValid() && MNew > MaxPressureLimit[PSetID]) {
    890       Delta.CurrentMax = PressureChange(PSetID);
    891       Delta.CurrentMax.setUnitInc(MNew - MOld);
    892     }
    893   }
    894 }
    895 
    896 /// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx).
    897 static bool findUseBetween(unsigned Reg, SlotIndex PriorUseIdx,
    898                            SlotIndex NextUseIdx, const MachineRegisterInfo &MRI,
    899                            const LiveIntervals *LIS) {
    900   for (const MachineInstr &MI : MRI.use_nodbg_instructions(Reg)) {
    901     SlotIndex InstSlot = LIS->getInstructionIndex(&MI).getRegSlot();
    902     if (InstSlot >= PriorUseIdx && InstSlot < NextUseIdx)
    903       return true;
    904   }
    905   return false;
    906 }
    907 
    908 /// Record the downward impact of a single instruction on current register
    909 /// pressure. Unlike the advance/recede pressure tracking interface, this does
    910 /// not discover live in/outs.
    911 ///
    912 /// This is intended for speculative queries. It leaves pressure inconsistent
    913 /// with the current position, so must be restored by the caller.
    914 void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) {
    915   assert(!MI->isDebugValue() && "Expect a nondebug instruction.");
    916 
    917   // Account for register pressure similar to RegPressureTracker::recede().
    918   RegisterOperands RegOpers;
    919   RegOpers.collect(*MI, *TRI, *MRI);
    920 
    921   // Kill liveness at last uses. Assume allocatable physregs are single-use
    922   // rather than checking LiveIntervals.
    923   SlotIndex SlotIdx;
    924   if (RequireIntervals)
    925     SlotIdx = LIS->getInstructionIndex(MI).getRegSlot();
    926 
    927   for (unsigned Reg : RegOpers.Uses) {
    928     if (RequireIntervals) {
    929       // FIXME: allow the caller to pass in the list of vreg uses that remain
    930       // to be bottom-scheduled to avoid searching uses at each query.
    931       SlotIndex CurrIdx = getCurrSlot();
    932       const LiveRange *LR = getLiveRange(*LIS, Reg);
    933       if (LR) {
    934         LiveQueryResult LRQ = LR->Query(SlotIdx);
    935         if (LRQ.isKill() && !findUseBetween(Reg, CurrIdx, SlotIdx, *MRI, LIS))
    936           decreaseRegPressure(Reg);
    937       }
    938     } else if (!TargetRegisterInfo::isVirtualRegister(Reg)) {
    939       // Allocatable physregs are always single-use before register rewriting.
    940       decreaseRegPressure(Reg);
    941     }
    942   }
    943 
    944   // Generate liveness for defs.
    945   increaseRegPressure(RegOpers.Defs);
    946 
    947   // Boost pressure for all dead defs together.
    948   increaseRegPressure(RegOpers.DeadDefs);
    949   decreaseRegPressure(RegOpers.DeadDefs);
    950 }
    951 
    952 /// Consider the pressure increase caused by traversing this instruction
    953 /// top-down. Find the register class with the most change in its pressure limit
    954 /// based on the tracker's current pressure, and return the number of excess
    955 /// register units of that pressure set introduced by this instruction.
    956 ///
    957 /// This assumes that the current LiveIn set is sufficient.
    958 ///
    959 /// This is expensive for an on-the-fly query because it calls
    960 /// bumpDownwardPressure to recompute the pressure sets based on current
    961 /// liveness. We don't yet have a fast version of downward pressure tracking
    962 /// analogous to getUpwardPressureDelta.
    963 void RegPressureTracker::
    964 getMaxDownwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta,
    965                             ArrayRef<PressureChange> CriticalPSets,
    966                             ArrayRef<unsigned> MaxPressureLimit) {
    967   // Snapshot Pressure.
    968   std::vector<unsigned> SavedPressure = CurrSetPressure;
    969   std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure;
    970 
    971   bumpDownwardPressure(MI);
    972 
    973   computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI,
    974                              LiveThruPressure);
    975   computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets,
    976                           MaxPressureLimit, Delta);
    977   assert(Delta.CriticalMax.getUnitInc() >= 0 &&
    978          Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure");
    979 
    980   // Restore the tracker's state.
    981   P.MaxSetPressure.swap(SavedMaxPressure);
    982   CurrSetPressure.swap(SavedPressure);
    983 }
    984 
    985 /// Get the pressure of each PSet after traversing this instruction bottom-up.
    986 void RegPressureTracker::
    987 getUpwardPressure(const MachineInstr *MI,
    988                   std::vector<unsigned> &PressureResult,
    989                   std::vector<unsigned> &MaxPressureResult) {
    990   // Snapshot pressure.
    991   PressureResult = CurrSetPressure;
    992   MaxPressureResult = P.MaxSetPressure;
    993 
    994   bumpUpwardPressure(MI);
    995 
    996   // Current pressure becomes the result. Restore current pressure.
    997   P.MaxSetPressure.swap(MaxPressureResult);
    998   CurrSetPressure.swap(PressureResult);
    999 }
   1000 
   1001 /// Get the pressure of each PSet after traversing this instruction top-down.
   1002 void RegPressureTracker::
   1003 getDownwardPressure(const MachineInstr *MI,
   1004                     std::vector<unsigned> &PressureResult,
   1005                     std::vector<unsigned> &MaxPressureResult) {
   1006   // Snapshot pressure.
   1007   PressureResult = CurrSetPressure;
   1008   MaxPressureResult = P.MaxSetPressure;
   1009 
   1010   bumpDownwardPressure(MI);
   1011 
   1012   // Current pressure becomes the result. Restore current pressure.
   1013   P.MaxSetPressure.swap(MaxPressureResult);
   1014   CurrSetPressure.swap(PressureResult);
   1015 }
   1016