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/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" 38 #include <algorithm> 39 #include <cassert> 40 #include <cstdint> 41 #include <cstdlib> 42 #include <cstring> 43 #include <iterator> 44 #include <limits> 45 #include <utility> 46 #include <vector> 47 48 using namespace llvm; 49 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()) 56 return; 57 58 PSetIterator PSetI = MRI.getPressureSets(Reg); 59 unsigned Weight = PSetI.getWeight(); 60 for (; PSetI.isValid(); ++PSetI) 61 CurrSetPressure[*PSetI] += Weight; 62 } 63 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()) 70 return; 71 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; 77 } 78 } 79 80 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 81 LLVM_DUMP_METHOD 82 void llvm::dumpRegSetPressure(ArrayRef<unsigned> SetPressure, 83 const TargetRegisterInfo *TRI) { 84 bool Empty = true; 85 for (unsigned i = 0, e = SetPressure.size(); i < e; ++i) { 86 if (SetPressure[i] != 0) { 87 dbgs() << TRI->getRegPressureSetName(i) << "=" << SetPressure[i] << '\n'; 88 Empty = false; 89 } 90 } 91 if (Empty) 92 dbgs() << "\n"; 93 } 94 95 LLVM_DUMP_METHOD 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); 104 dbgs() << ' '; 105 } 106 dbgs() << '\n'; 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); 112 dbgs() << ' '; 113 } 114 dbgs() << '\n'; 115 } 116 117 LLVM_DUMP_METHOD 118 void RegPressureTracker::dump() const { 119 if (!isTopClosed() || !isBottomClosed()) { 120 dbgs() << "Curr Pressure: "; 121 dumpRegSetPressure(CurrSetPressure, TRI); 122 } 123 P.dump(TRI); 124 } 125 126 LLVM_DUMP_METHOD 127 void PressureDiff::dump(const TargetRegisterInfo &TRI) const { 128 const char *sep = ""; 129 for (const PressureChange &Change : *this) { 130 if (!Change.isValid()) 131 break; 132 dbgs() << sep << TRI.getRegPressureSetName(Change.getPSet()) 133 << " " << Change.getUnitInc(); 134 sep = " "; 135 } 136 dbgs() << '\n'; 137 } 138 #endif 139 140 void RegPressureTracker::increaseRegPressure(unsigned RegUnit, 141 LaneBitmask PreviousMask, 142 LaneBitmask NewMask) { 143 if (PreviousMask.any() || NewMask.none()) 144 return; 145 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]); 152 } 153 } 154 155 void RegPressureTracker::decreaseRegPressure(unsigned RegUnit, 156 LaneBitmask PreviousMask, 157 LaneBitmask NewMask) { 158 decreaseSetPressure(CurrSetPressure, *MRI, RegUnit, PreviousMask, NewMask); 159 } 160 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(); 165 LiveInRegs.clear(); 166 LiveOutRegs.clear(); 167 } 168 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(); 173 LiveInRegs.clear(); 174 LiveOutRegs.clear(); 175 } 176 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) 181 return; 182 TopIdx = SlotIndex(); 183 LiveInRegs.clear(); 184 } 185 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) 189 return; 190 TopPos = MachineBasicBlock::const_iterator(); 191 LiveInRegs.clear(); 192 } 193 194 /// If the current bottom is not greater than the previous index, open it. 195 void IntervalPressure::openBottom(SlotIndex PrevBottom) { 196 if (BottomIdx > PrevBottom) 197 return; 198 BottomIdx = SlotIndex(); 199 LiveInRegs.clear(); 200 } 201 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) 205 return; 206 BottomPos = MachineBasicBlock::const_iterator(); 207 LiveInRegs.clear(); 208 } 209 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; 216 } 217 218 void LiveRegSet::clear() { 219 Regs.clear(); 220 } 221 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); 226 } 227 228 void RegPressureTracker::reset() { 229 MBB = nullptr; 230 LIS = nullptr; 231 232 CurrSetPressure.clear(); 233 LiveThruPressure.clear(); 234 P.MaxSetPressure.clear(); 235 236 if (RequireIntervals) 237 static_cast<IntervalPressure&>(P).reset(); 238 else 239 static_cast<RegionPressure&>(P).reset(); 240 241 LiveRegs.clear(); 242 UntiedDefs.clear(); 243 } 244 245 /// Setup the RegPressureTracker. 246 /// 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) { 254 reset(); 255 256 MF = mf; 257 TRI = MF->getSubtarget().getRegisterInfo(); 258 RCI = rci; 259 MRI = &MF->getRegInfo(); 260 MBB = mbb; 261 this->TrackUntiedDefs = TrackUntiedDefs; 262 this->TrackLaneMasks = TrackLaneMasks; 263 264 if (RequireIntervals) { 265 assert(lis && "IntervalPressure requires LiveIntervals"); 266 LIS = lis; 267 } 268 269 CurrPos = pos; 270 CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0); 271 272 P.MaxSetPressure = CurrSetPressure; 273 274 LiveRegs.init(*MRI); 275 if (TrackUntiedDefs) 276 UntiedDefs.setUniverse(MRI->getNumVirtRegs()); 277 } 278 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()); 285 } 286 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()); 293 } 294 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(); 301 } 302 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(); 307 else 308 static_cast<RegionPressure&>(P).TopPos = CurrPos; 309 310 assert(P.LiveInRegs.empty() && "inconsistent max pressure result"); 311 P.LiveInRegs.reserve(LiveRegs.size()); 312 LiveRegs.appendTo(P.LiveInRegs); 313 } 314 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(); 319 else 320 static_cast<RegionPressure&>(P).BottomPos = CurrPos; 321 322 assert(P.LiveOutRegs.empty() && "inconsistent max pressure result"); 323 P.LiveOutRegs.reserve(LiveRegs.size()); 324 LiveRegs.appendTo(P.LiveOutRegs); 325 } 326 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"); 331 return; 332 } 333 if (!isBottomClosed()) 334 closeBottom(); 335 else if (!isTopClosed()) 336 closeTop(); 337 // If both top and bottom are closed, do nothing. 338 } 339 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); 353 } 354 } 355 356 static LaneBitmask getRegLanes(ArrayRef<RegisterMaskPair> RegUnits, 357 unsigned RegUnit) { 358 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { 359 return Other.RegUnit == RegUnit; 360 }); 361 if (I == RegUnits.end()) 362 return LaneBitmask::getNone(); 363 return I->LaneMask; 364 } 365 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; 372 }); 373 if (I == RegUnits.end()) { 374 RegUnits.push_back(Pair); 375 } else { 376 I->LaneMask |= Pair.LaneMask; 377 } 378 } 379 380 static void setRegZero(SmallVectorImpl<RegisterMaskPair> &RegUnits, 381 unsigned RegUnit) { 382 auto I = llvm::find_if(RegUnits, [RegUnit](const RegisterMaskPair Other) { 383 return Other.RegUnit == RegUnit; 384 }); 385 if (I == RegUnits.end()) { 386 RegUnits.push_back(RegisterMaskPair(RegUnit, LaneBitmask::getNone())); 387 } else { 388 I->LaneMask = LaneBitmask::getNone(); 389 } 390 } 391 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; 398 }); 399 if (I != RegUnits.end()) { 400 I->LaneMask &= ~Pair.LaneMask; 401 if (I->LaneMask.none()) 402 RegUnits.erase(I); 403 } 404 } 405 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); 412 LaneBitmask Result; 413 if (TrackLaneMasks && LI.hasSubRanges()) { 414 for (const LiveInterval::SubRange &SR : LI.subranges()) { 415 if (Property(SR, Pos)) 416 Result |= SR.LaneMask; 417 } 418 } else if (Property(LI, Pos)) { 419 Result = TrackLaneMasks ? MRI.getMaxLaneMaskForVReg(RegUnit) 420 : LaneBitmask::getAll(); 421 } 422 423 return Result; 424 } else { 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). 428 if (LR == nullptr) 429 return SafeDefault; 430 return Property(*LR, Pos) ? LaneBitmask::getAll() : LaneBitmask::getNone(); 431 } 432 } 433 434 static LaneBitmask getLiveLanesAt(const LiveIntervals &LIS, 435 const MachineRegisterInfo &MRI, 436 bool TrackLaneMasks, unsigned RegUnit, 437 SlotIndex Pos) { 438 return getLanesWithProperty(LIS, MRI, TrackLaneMasks, RegUnit, Pos, 439 LaneBitmask::getAll(), 440 [](const LiveRange &LR, SlotIndex Pos) { 441 return LR.liveAt(Pos); 442 }); 443 } 444 445 446 namespace { 447 448 /// Collect this instruction's unique uses and defs into SmallVectors for 449 /// processing defs and uses in order. 450 /// 451 /// FIXME: always ignore tied opers 452 class RegisterOperandsCollector { 453 friend class llvm::RegisterOperands; 454 455 RegisterOperands &RegOpers; 456 const TargetRegisterInfo &TRI; 457 const MachineRegisterInfo &MRI; 458 bool IgnoreDead; 459 460 RegisterOperandsCollector(RegisterOperands &RegOpers, 461 const TargetRegisterInfo &TRI, 462 const MachineRegisterInfo &MRI, bool IgnoreDead) 463 : RegOpers(RegOpers), TRI(TRI), MRI(MRI), IgnoreDead(IgnoreDead) {} 464 465 void collectInstr(const MachineInstr &MI) const { 466 for (ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI) 467 collectOperand(*OperI); 468 469 // Remove redundant physreg dead defs. 470 for (const RegisterMaskPair &P : RegOpers.Defs) 471 removeRegLanes(RegOpers.DeadDefs, P); 472 } 473 474 void collectInstrLanes(const MachineInstr &MI) const { 475 for (ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI) 476 collectOperandLanes(*OperI); 477 478 // Remove redundant physreg dead defs. 479 for (const RegisterMaskPair &P : RegOpers.Defs) 480 removeRegLanes(RegOpers.DeadDefs, P); 481 } 482 483 /// Push this operand's register onto the correct vectors. 484 void collectOperand(const MachineOperand &MO) const { 485 if (!MO.isReg() || !MO.getReg()) 486 return; 487 unsigned Reg = MO.getReg(); 488 if (MO.isUse()) { 489 if (!MO.isUndef() && !MO.isInternalRead()) 490 pushReg(Reg, RegOpers.Uses); 491 } else { 492 assert(MO.isDef()); 493 // Subregister definitions may imply a register read. 494 if (MO.readsReg()) 495 pushReg(Reg, RegOpers.Uses); 496 497 if (MO.isDead()) { 498 if (!IgnoreDead) 499 pushReg(Reg, RegOpers.DeadDefs); 500 } else 501 pushReg(Reg, RegOpers.Defs); 502 } 503 } 504 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())); 512 } 513 } 514 515 void collectOperandLanes(const MachineOperand &MO) const { 516 if (!MO.isReg() || !MO.getReg()) 517 return; 518 unsigned Reg = MO.getReg(); 519 unsigned SubRegIdx = MO.getSubReg(); 520 if (MO.isUse()) { 521 if (!MO.isUndef() && !MO.isInternalRead()) 522 pushRegLanes(Reg, SubRegIdx, RegOpers.Uses); 523 } else { 524 assert(MO.isDef()); 525 // Treat read-undef subreg defs as definitions of the whole register. 526 if (MO.isUndef()) 527 SubRegIdx = 0; 528 529 if (MO.isDead()) { 530 if (!IgnoreDead) 531 pushRegLanes(Reg, SubRegIdx, RegOpers.DeadDefs); 532 } else 533 pushRegLanes(Reg, SubRegIdx, RegOpers.Defs); 534 } 535 } 536 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())); 547 } 548 } 549 }; 550 551 } // end anonymous namespace 552 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); 558 if (TrackLaneMasks) 559 Collector.collectInstrLanes(MI); 560 else 561 Collector.collectInstr(MI); 562 } 563 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); 570 if (LR != nullptr) { 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); 576 RI = Defs.erase(RI); 577 continue; 578 } 579 } 580 ++RI; 581 } 582 } 583 584 void RegisterOperands::adjustLaneLiveness(const LiveIntervals &LIS, 585 const MachineRegisterInfo &MRI, 586 SlotIndex Pos, 587 MachineInstr *AddFlagsMI) { 588 for (auto I = Defs.begin(); I != Defs.end(); ) { 589 LaneBitmask LiveAfter = getLiveLanesAt(LIS, MRI, true, I->RegUnit, 590 Pos.getDeadSlot()); 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); 597 598 LaneBitmask ActualDef = I->LaneMask & LiveAfter; 599 if (ActualDef.none()) { 600 I = Defs.erase(I); 601 } else { 602 I->LaneMask = ActualDef; 603 ++I; 604 } 605 } 606 for (auto I = Uses.begin(); I != Uses.end(); ) { 607 LaneBitmask LiveBefore = getLiveLanesAt(LIS, MRI, true, I->RegUnit, 608 Pos.getBaseIndex()); 609 LaneBitmask LaneMask = I->LaneMask & LiveBefore; 610 if (LaneMask.none()) { 611 I = Uses.erase(I); 612 } else { 613 I->LaneMask = LaneMask; 614 ++I; 615 } 616 } 617 if (AddFlagsMI != nullptr) { 618 for (const RegisterMaskPair &P : DeadDefs) { 619 unsigned RegUnit = P.RegUnit; 620 if (!TargetRegisterInfo::isVirtualRegister(RegUnit)) 621 continue; 622 LaneBitmask LiveAfter = getLiveLanesAt(LIS, MRI, true, RegUnit, 623 Pos.getDeadSlot()); 624 if (LiveAfter.none()) 625 AddFlagsMI->setRegisterDefReadUndef(RegUnit); 626 } 627 } 628 } 629 630 /// Initialize an array of N PressureDiffs. 631 void PressureDiffs::init(unsigned N) { 632 Size = N; 633 if (N <= Max) { 634 memset(PDiffArray, 0, N * sizeof(PressureDiff)); 635 return; 636 } 637 Max = Size; 638 free(PDiffArray); 639 PDiffArray = static_cast<PressureDiff*>(safe_calloc(N, sizeof(PressureDiff))); 640 } 641 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); 649 650 for (const RegisterMaskPair &P : RegOpers.Uses) 651 PDiff.addPressureChange(P.RegUnit, false, &MRI); 652 } 653 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) 664 break; 665 } 666 // If all pressure sets are more constrained, skip the remaining PSets. 667 if (I == E) 668 break; 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) 673 std::swap(*J, PTmp); 674 } 675 // Update the units for this pressure set. 676 unsigned NewUnitInc = I->getUnitInc() + Weight; 677 if (NewUnitInc != 0) { 678 I->setUnitInc(NewUnitInc); 679 } else { 680 // Remove entry 681 PressureDiff::iterator J; 682 for (J = std::next(I); J != E && J->isValid(); ++J, ++I) 683 *I = *J; 684 if (J != E) 685 *I = *J; 686 } 687 } 688 } 689 690 /// Force liveness of registers. 691 void RegPressureTracker::addLiveRegs(ArrayRef<RegisterMaskPair> Regs) { 692 for (const RegisterMaskPair &P : Regs) { 693 LaneBitmask PrevMask = LiveRegs.insert(P); 694 LaneBitmask NewMask = PrevMask | P.LaneMask; 695 increaseRegPressure(P.RegUnit, PrevMask, NewMask); 696 } 697 } 698 699 void RegPressureTracker::discoverLiveInOrOut(RegisterMaskPair Pair, 700 SmallVectorImpl<RegisterMaskPair> &LiveInOrOut) { 701 assert(Pair.LaneMask.any()); 702 703 unsigned RegUnit = Pair.RegUnit; 704 auto I = llvm::find_if(LiveInOrOut, [RegUnit](const RegisterMaskPair &Other) { 705 return Other.RegUnit == RegUnit; 706 }); 707 LaneBitmask PrevMask; 708 LaneBitmask NewMask; 709 if (I == LiveInOrOut.end()) { 710 PrevMask = LaneBitmask::getNone(); 711 NewMask = Pair.LaneMask; 712 LiveInOrOut.push_back(Pair); 713 } else { 714 PrevMask = I->LaneMask; 715 NewMask = PrevMask | Pair.LaneMask; 716 I->LaneMask = NewMask; 717 } 718 increaseSetPressure(P.MaxSetPressure, *MRI, RegUnit, PrevMask, NewMask); 719 } 720 721 void RegPressureTracker::discoverLiveIn(RegisterMaskPair Pair) { 722 discoverLiveInOrOut(Pair, P.LiveInRegs); 723 } 724 725 void RegPressureTracker::discoverLiveOut(RegisterMaskPair Pair) { 726 discoverLiveInOrOut(Pair, P.LiveOutRegs); 727 } 728 729 void RegPressureTracker::bumpDeadDefs(ArrayRef<RegisterMaskPair> DeadDefs) { 730 for (const RegisterMaskPair &P : DeadDefs) { 731 unsigned Reg = P.RegUnit; 732 LaneBitmask LiveMask = LiveRegs.contains(Reg); 733 LaneBitmask BumpedMask = LiveMask | P.LaneMask; 734 increaseRegPressure(Reg, LiveMask, BumpedMask); 735 } 736 for (const RegisterMaskPair &P : DeadDefs) { 737 unsigned Reg = P.RegUnit; 738 LaneBitmask LiveMask = LiveRegs.contains(Reg); 739 LaneBitmask BumpedMask = LiveMask | P.LaneMask; 740 decreaseRegPressure(Reg, BumpedMask, LiveMask); 741 } 742 } 743 744 /// Recede across the previous instruction. If LiveUses is provided, record any 745 /// RegUnits that are made live by the current instruction's uses. This includes 746 /// registers that are both defined and used by the instruction. If a pressure 747 /// difference pointer is provided record the changes is pressure caused by this 748 /// instruction independent of liveness. 749 void RegPressureTracker::recede(const RegisterOperands &RegOpers, 750 SmallVectorImpl<RegisterMaskPair> *LiveUses) { 751 assert(!CurrPos->isDebugInstr()); 752 753 // Boost pressure for all dead defs together. 754 bumpDeadDefs(RegOpers.DeadDefs); 755 756 // Kill liveness at live defs. 757 // TODO: consider earlyclobbers? 758 for (const RegisterMaskPair &Def : RegOpers.Defs) { 759 unsigned Reg = Def.RegUnit; 760 761 LaneBitmask PreviousMask = LiveRegs.erase(Def); 762 LaneBitmask NewMask = PreviousMask & ~Def.LaneMask; 763 764 LaneBitmask LiveOut = Def.LaneMask & ~PreviousMask; 765 if (LiveOut.any()) { 766 discoverLiveOut(RegisterMaskPair(Reg, LiveOut)); 767 // Retroactively model effects on pressure of the live out lanes. 768 increaseSetPressure(CurrSetPressure, *MRI, Reg, LaneBitmask::getNone(), 769 LiveOut); 770 PreviousMask = LiveOut; 771 } 772 773 if (NewMask.none()) { 774 // Add a 0 entry to LiveUses as a marker that the complete vreg has become 775 // dead. 776 if (TrackLaneMasks && LiveUses != nullptr) 777 setRegZero(*LiveUses, Reg); 778 } 779 780 decreaseRegPressure(Reg, PreviousMask, NewMask); 781 } 782 783 SlotIndex SlotIdx; 784 if (RequireIntervals) 785 SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot(); 786 787 // Generate liveness for uses. 788 for (const RegisterMaskPair &Use : RegOpers.Uses) { 789 unsigned Reg = Use.RegUnit; 790 assert(Use.LaneMask.any()); 791 LaneBitmask PreviousMask = LiveRegs.insert(Use); 792 LaneBitmask NewMask = PreviousMask | Use.LaneMask; 793 if (NewMask == PreviousMask) 794 continue; 795 796 // Did the register just become live? 797 if (PreviousMask.none()) { 798 if (LiveUses != nullptr) { 799 if (!TrackLaneMasks) { 800 addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); 801 } else { 802 auto I = 803 llvm::find_if(*LiveUses, [Reg](const RegisterMaskPair Other) { 804 return Other.RegUnit == Reg; 805 }); 806 bool IsRedef = I != LiveUses->end(); 807 if (IsRedef) { 808 // ignore re-defs here... 809 assert(I->LaneMask.none()); 810 removeRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); 811 } else { 812 addRegLanes(*LiveUses, RegisterMaskPair(Reg, NewMask)); 813 } 814 } 815 } 816 817 // Discover live outs if this may be the first occurance of this register. 818 if (RequireIntervals) { 819 LaneBitmask LiveOut = getLiveThroughAt(Reg, SlotIdx); 820 if (LiveOut.any()) 821 discoverLiveOut(RegisterMaskPair(Reg, LiveOut)); 822 } 823 } 824 825 increaseRegPressure(Reg, PreviousMask, NewMask); 826 } 827 if (TrackUntiedDefs) { 828 for (const RegisterMaskPair &Def : RegOpers.Defs) { 829 unsigned RegUnit = Def.RegUnit; 830 if (TargetRegisterInfo::isVirtualRegister(RegUnit) && 831 (LiveRegs.contains(RegUnit) & Def.LaneMask).none()) 832 UntiedDefs.insert(RegUnit); 833 } 834 } 835 } 836 837 void RegPressureTracker::recedeSkipDebugValues() { 838 assert(CurrPos != MBB->begin()); 839 if (!isBottomClosed()) 840 closeBottom(); 841 842 // Open the top of the region using block iterators. 843 if (!RequireIntervals && isTopClosed()) 844 static_cast<RegionPressure&>(P).openTop(CurrPos); 845 846 // Find the previous instruction. 847 CurrPos = skipDebugInstructionsBackward(std::prev(CurrPos), MBB->begin()); 848 849 SlotIndex SlotIdx; 850 if (RequireIntervals) 851 SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot(); 852 853 // Open the top of the region using slot indexes. 854 if (RequireIntervals && isTopClosed()) 855 static_cast<IntervalPressure&>(P).openTop(SlotIdx); 856 } 857 858 void RegPressureTracker::recede(SmallVectorImpl<RegisterMaskPair> *LiveUses) { 859 recedeSkipDebugValues(); 860 861 const MachineInstr &MI = *CurrPos; 862 RegisterOperands RegOpers; 863 RegOpers.collect(MI, *TRI, *MRI, TrackLaneMasks, false); 864 if (TrackLaneMasks) { 865 SlotIndex SlotIdx = LIS->getInstructionIndex(*CurrPos).getRegSlot(); 866 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); 867 } else if (RequireIntervals) { 868 RegOpers.detectDeadDefs(MI, *LIS); 869 } 870 871 recede(RegOpers, LiveUses); 872 } 873 874 /// Advance across the current instruction. 875 void RegPressureTracker::advance(const RegisterOperands &RegOpers) { 876 assert(!TrackUntiedDefs && "unsupported mode"); 877 assert(CurrPos != MBB->end()); 878 if (!isTopClosed()) 879 closeTop(); 880 881 SlotIndex SlotIdx; 882 if (RequireIntervals) 883 SlotIdx = getCurrSlot(); 884 885 // Open the bottom of the region using slot indexes. 886 if (isBottomClosed()) { 887 if (RequireIntervals) 888 static_cast<IntervalPressure&>(P).openBottom(SlotIdx); 889 else 890 static_cast<RegionPressure&>(P).openBottom(CurrPos); 891 } 892 893 for (const RegisterMaskPair &Use : RegOpers.Uses) { 894 unsigned Reg = Use.RegUnit; 895 LaneBitmask LiveMask = LiveRegs.contains(Reg); 896 LaneBitmask LiveIn = Use.LaneMask & ~LiveMask; 897 if (LiveIn.any()) { 898 discoverLiveIn(RegisterMaskPair(Reg, LiveIn)); 899 increaseRegPressure(Reg, LiveMask, LiveMask | LiveIn); 900 LiveRegs.insert(RegisterMaskPair(Reg, LiveIn)); 901 } 902 // Kill liveness at last uses. 903 if (RequireIntervals) { 904 LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx); 905 if (LastUseMask.any()) { 906 LiveRegs.erase(RegisterMaskPair(Reg, LastUseMask)); 907 decreaseRegPressure(Reg, LiveMask, LiveMask & ~LastUseMask); 908 } 909 } 910 } 911 912 // Generate liveness for defs. 913 for (const RegisterMaskPair &Def : RegOpers.Defs) { 914 LaneBitmask PreviousMask = LiveRegs.insert(Def); 915 LaneBitmask NewMask = PreviousMask | Def.LaneMask; 916 increaseRegPressure(Def.RegUnit, PreviousMask, NewMask); 917 } 918 919 // Boost pressure for all dead defs together. 920 bumpDeadDefs(RegOpers.DeadDefs); 921 922 // Find the next instruction. 923 CurrPos = skipDebugInstructionsForward(std::next(CurrPos), MBB->end()); 924 } 925 926 void RegPressureTracker::advance() { 927 const MachineInstr &MI = *CurrPos; 928 RegisterOperands RegOpers; 929 RegOpers.collect(MI, *TRI, *MRI, TrackLaneMasks, false); 930 if (TrackLaneMasks) { 931 SlotIndex SlotIdx = getCurrSlot(); 932 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); 933 } 934 advance(RegOpers); 935 } 936 937 /// Find the max change in excess pressure across all sets. 938 static void computeExcessPressureDelta(ArrayRef<unsigned> OldPressureVec, 939 ArrayRef<unsigned> NewPressureVec, 940 RegPressureDelta &Delta, 941 const RegisterClassInfo *RCI, 942 ArrayRef<unsigned> LiveThruPressureVec) { 943 Delta.Excess = PressureChange(); 944 for (unsigned i = 0, e = OldPressureVec.size(); i < e; ++i) { 945 unsigned POld = OldPressureVec[i]; 946 unsigned PNew = NewPressureVec[i]; 947 int PDiff = (int)PNew - (int)POld; 948 if (!PDiff) // No change in this set in the common case. 949 continue; 950 // Only consider change beyond the limit. 951 unsigned Limit = RCI->getRegPressureSetLimit(i); 952 if (!LiveThruPressureVec.empty()) 953 Limit += LiveThruPressureVec[i]; 954 955 if (Limit > POld) { 956 if (Limit > PNew) 957 PDiff = 0; // Under the limit 958 else 959 PDiff = PNew - Limit; // Just exceeded limit. 960 } else if (Limit > PNew) 961 PDiff = Limit - POld; // Just obeyed limit. 962 963 if (PDiff) { 964 Delta.Excess = PressureChange(i); 965 Delta.Excess.setUnitInc(PDiff); 966 break; 967 } 968 } 969 } 970 971 /// Find the max change in max pressure that either surpasses a critical PSet 972 /// limit or exceeds the current MaxPressureLimit. 973 /// 974 /// FIXME: comparing each element of the old and new MaxPressure vectors here is 975 /// silly. It's done now to demonstrate the concept but will go away with a 976 /// RegPressureTracker API change to work with pressure differences. 977 static void computeMaxPressureDelta(ArrayRef<unsigned> OldMaxPressureVec, 978 ArrayRef<unsigned> NewMaxPressureVec, 979 ArrayRef<PressureChange> CriticalPSets, 980 ArrayRef<unsigned> MaxPressureLimit, 981 RegPressureDelta &Delta) { 982 Delta.CriticalMax = PressureChange(); 983 Delta.CurrentMax = PressureChange(); 984 985 unsigned CritIdx = 0, CritEnd = CriticalPSets.size(); 986 for (unsigned i = 0, e = OldMaxPressureVec.size(); i < e; ++i) { 987 unsigned POld = OldMaxPressureVec[i]; 988 unsigned PNew = NewMaxPressureVec[i]; 989 if (PNew == POld) // No change in this set in the common case. 990 continue; 991 992 if (!Delta.CriticalMax.isValid()) { 993 while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < i) 994 ++CritIdx; 995 996 if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == i) { 997 int PDiff = (int)PNew - (int)CriticalPSets[CritIdx].getUnitInc(); 998 if (PDiff > 0) { 999 Delta.CriticalMax = PressureChange(i); 1000 Delta.CriticalMax.setUnitInc(PDiff); 1001 } 1002 } 1003 } 1004 // Find the first increase above MaxPressureLimit. 1005 // (Ignores negative MDiff). 1006 if (!Delta.CurrentMax.isValid() && PNew > MaxPressureLimit[i]) { 1007 Delta.CurrentMax = PressureChange(i); 1008 Delta.CurrentMax.setUnitInc(PNew - POld); 1009 if (CritIdx == CritEnd || Delta.CriticalMax.isValid()) 1010 break; 1011 } 1012 } 1013 } 1014 1015 /// Record the upward impact of a single instruction on current register 1016 /// pressure. Unlike the advance/recede pressure tracking interface, this does 1017 /// not discover live in/outs. 1018 /// 1019 /// This is intended for speculative queries. It leaves pressure inconsistent 1020 /// with the current position, so must be restored by the caller. 1021 void RegPressureTracker::bumpUpwardPressure(const MachineInstr *MI) { 1022 assert(!MI->isDebugInstr() && "Expect a nondebug instruction."); 1023 1024 SlotIndex SlotIdx; 1025 if (RequireIntervals) 1026 SlotIdx = LIS->getInstructionIndex(*MI).getRegSlot(); 1027 1028 // Account for register pressure similar to RegPressureTracker::recede(). 1029 RegisterOperands RegOpers; 1030 RegOpers.collect(*MI, *TRI, *MRI, TrackLaneMasks, /*IgnoreDead=*/true); 1031 assert(RegOpers.DeadDefs.size() == 0); 1032 if (TrackLaneMasks) 1033 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); 1034 else if (RequireIntervals) 1035 RegOpers.detectDeadDefs(*MI, *LIS); 1036 1037 // Boost max pressure for all dead defs together. 1038 // Since CurrSetPressure and MaxSetPressure 1039 bumpDeadDefs(RegOpers.DeadDefs); 1040 1041 // Kill liveness at live defs. 1042 for (const RegisterMaskPair &P : RegOpers.Defs) { 1043 unsigned Reg = P.RegUnit; 1044 LaneBitmask LiveLanes = LiveRegs.contains(Reg); 1045 LaneBitmask UseLanes = getRegLanes(RegOpers.Uses, Reg); 1046 LaneBitmask DefLanes = P.LaneMask; 1047 LaneBitmask LiveAfter = (LiveLanes & ~DefLanes) | UseLanes; 1048 decreaseRegPressure(Reg, LiveLanes, LiveAfter); 1049 } 1050 // Generate liveness for uses. 1051 for (const RegisterMaskPair &P : RegOpers.Uses) { 1052 unsigned Reg = P.RegUnit; 1053 LaneBitmask LiveLanes = LiveRegs.contains(Reg); 1054 LaneBitmask LiveAfter = LiveLanes | P.LaneMask; 1055 increaseRegPressure(Reg, LiveLanes, LiveAfter); 1056 } 1057 } 1058 1059 /// Consider the pressure increase caused by traversing this instruction 1060 /// bottom-up. Find the pressure set with the most change beyond its pressure 1061 /// limit based on the tracker's current pressure, and return the change in 1062 /// number of register units of that pressure set introduced by this 1063 /// instruction. 1064 /// 1065 /// This assumes that the current LiveOut set is sufficient. 1066 /// 1067 /// This is expensive for an on-the-fly query because it calls 1068 /// bumpUpwardPressure to recompute the pressure sets based on current 1069 /// liveness. This mainly exists to verify correctness, e.g. with 1070 /// -verify-misched. getUpwardPressureDelta is the fast version of this query 1071 /// that uses the per-SUnit cache of the PressureDiff. 1072 void RegPressureTracker:: 1073 getMaxUpwardPressureDelta(const MachineInstr *MI, PressureDiff *PDiff, 1074 RegPressureDelta &Delta, 1075 ArrayRef<PressureChange> CriticalPSets, 1076 ArrayRef<unsigned> MaxPressureLimit) { 1077 // Snapshot Pressure. 1078 // FIXME: The snapshot heap space should persist. But I'm planning to 1079 // summarize the pressure effect so we don't need to snapshot at all. 1080 std::vector<unsigned> SavedPressure = CurrSetPressure; 1081 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure; 1082 1083 bumpUpwardPressure(MI); 1084 1085 computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI, 1086 LiveThruPressure); 1087 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets, 1088 MaxPressureLimit, Delta); 1089 assert(Delta.CriticalMax.getUnitInc() >= 0 && 1090 Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure"); 1091 1092 // Restore the tracker's state. 1093 P.MaxSetPressure.swap(SavedMaxPressure); 1094 CurrSetPressure.swap(SavedPressure); 1095 1096 #ifndef NDEBUG 1097 if (!PDiff) 1098 return; 1099 1100 // Check if the alternate algorithm yields the same result. 1101 RegPressureDelta Delta2; 1102 getUpwardPressureDelta(MI, *PDiff, Delta2, CriticalPSets, MaxPressureLimit); 1103 if (Delta != Delta2) { 1104 dbgs() << "PDiff: "; 1105 PDiff->dump(*TRI); 1106 dbgs() << "DELTA: " << *MI; 1107 if (Delta.Excess.isValid()) 1108 dbgs() << "Excess1 " << TRI->getRegPressureSetName(Delta.Excess.getPSet()) 1109 << " " << Delta.Excess.getUnitInc() << "\n"; 1110 if (Delta.CriticalMax.isValid()) 1111 dbgs() << "Critic1 " << TRI->getRegPressureSetName(Delta.CriticalMax.getPSet()) 1112 << " " << Delta.CriticalMax.getUnitInc() << "\n"; 1113 if (Delta.CurrentMax.isValid()) 1114 dbgs() << "CurrMx1 " << TRI->getRegPressureSetName(Delta.CurrentMax.getPSet()) 1115 << " " << Delta.CurrentMax.getUnitInc() << "\n"; 1116 if (Delta2.Excess.isValid()) 1117 dbgs() << "Excess2 " << TRI->getRegPressureSetName(Delta2.Excess.getPSet()) 1118 << " " << Delta2.Excess.getUnitInc() << "\n"; 1119 if (Delta2.CriticalMax.isValid()) 1120 dbgs() << "Critic2 " << TRI->getRegPressureSetName(Delta2.CriticalMax.getPSet()) 1121 << " " << Delta2.CriticalMax.getUnitInc() << "\n"; 1122 if (Delta2.CurrentMax.isValid()) 1123 dbgs() << "CurrMx2 " << TRI->getRegPressureSetName(Delta2.CurrentMax.getPSet()) 1124 << " " << Delta2.CurrentMax.getUnitInc() << "\n"; 1125 llvm_unreachable("RegP Delta Mismatch"); 1126 } 1127 #endif 1128 } 1129 1130 /// This is the fast version of querying register pressure that does not 1131 /// directly depend on current liveness. 1132 /// 1133 /// @param Delta captures information needed for heuristics. 1134 /// 1135 /// @param CriticalPSets Are the pressure sets that are known to exceed some 1136 /// limit within the region, not necessarily at the current position. 1137 /// 1138 /// @param MaxPressureLimit Is the max pressure within the region, not 1139 /// necessarily at the current position. 1140 void RegPressureTracker:: 1141 getUpwardPressureDelta(const MachineInstr *MI, /*const*/ PressureDiff &PDiff, 1142 RegPressureDelta &Delta, 1143 ArrayRef<PressureChange> CriticalPSets, 1144 ArrayRef<unsigned> MaxPressureLimit) const { 1145 unsigned CritIdx = 0, CritEnd = CriticalPSets.size(); 1146 for (PressureDiff::const_iterator 1147 PDiffI = PDiff.begin(), PDiffE = PDiff.end(); 1148 PDiffI != PDiffE && PDiffI->isValid(); ++PDiffI) { 1149 1150 unsigned PSetID = PDiffI->getPSet(); 1151 unsigned Limit = RCI->getRegPressureSetLimit(PSetID); 1152 if (!LiveThruPressure.empty()) 1153 Limit += LiveThruPressure[PSetID]; 1154 1155 unsigned POld = CurrSetPressure[PSetID]; 1156 unsigned MOld = P.MaxSetPressure[PSetID]; 1157 unsigned MNew = MOld; 1158 // Ignore DeadDefs here because they aren't captured by PressureChange. 1159 unsigned PNew = POld + PDiffI->getUnitInc(); 1160 assert((PDiffI->getUnitInc() >= 0) == (PNew >= POld) 1161 && "PSet overflow/underflow"); 1162 if (PNew > MOld) 1163 MNew = PNew; 1164 // Check if current pressure has exceeded the limit. 1165 if (!Delta.Excess.isValid()) { 1166 unsigned ExcessInc = 0; 1167 if (PNew > Limit) 1168 ExcessInc = POld > Limit ? PNew - POld : PNew - Limit; 1169 else if (POld > Limit) 1170 ExcessInc = Limit - POld; 1171 if (ExcessInc) { 1172 Delta.Excess = PressureChange(PSetID); 1173 Delta.Excess.setUnitInc(ExcessInc); 1174 } 1175 } 1176 // Check if max pressure has exceeded a critical pressure set max. 1177 if (MNew == MOld) 1178 continue; 1179 if (!Delta.CriticalMax.isValid()) { 1180 while (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() < PSetID) 1181 ++CritIdx; 1182 1183 if (CritIdx != CritEnd && CriticalPSets[CritIdx].getPSet() == PSetID) { 1184 int CritInc = (int)MNew - (int)CriticalPSets[CritIdx].getUnitInc(); 1185 if (CritInc > 0 && CritInc <= std::numeric_limits<int16_t>::max()) { 1186 Delta.CriticalMax = PressureChange(PSetID); 1187 Delta.CriticalMax.setUnitInc(CritInc); 1188 } 1189 } 1190 } 1191 // Check if max pressure has exceeded the current max. 1192 if (!Delta.CurrentMax.isValid() && MNew > MaxPressureLimit[PSetID]) { 1193 Delta.CurrentMax = PressureChange(PSetID); 1194 Delta.CurrentMax.setUnitInc(MNew - MOld); 1195 } 1196 } 1197 } 1198 1199 /// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx). 1200 /// The query starts with a lane bitmask which gets lanes/bits removed for every 1201 /// use we find. 1202 static LaneBitmask findUseBetween(unsigned Reg, LaneBitmask LastUseMask, 1203 SlotIndex PriorUseIdx, SlotIndex NextUseIdx, 1204 const MachineRegisterInfo &MRI, 1205 const LiveIntervals *LIS) { 1206 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo(); 1207 for (const MachineOperand &MO : MRI.use_nodbg_operands(Reg)) { 1208 if (MO.isUndef()) 1209 continue; 1210 const MachineInstr *MI = MO.getParent(); 1211 SlotIndex InstSlot = LIS->getInstructionIndex(*MI).getRegSlot(); 1212 if (InstSlot >= PriorUseIdx && InstSlot < NextUseIdx) { 1213 unsigned SubRegIdx = MO.getSubReg(); 1214 LaneBitmask UseMask = TRI.getSubRegIndexLaneMask(SubRegIdx); 1215 LastUseMask &= ~UseMask; 1216 if (LastUseMask.none()) 1217 return LaneBitmask::getNone(); 1218 } 1219 } 1220 return LastUseMask; 1221 } 1222 1223 LaneBitmask RegPressureTracker::getLiveLanesAt(unsigned RegUnit, 1224 SlotIndex Pos) const { 1225 assert(RequireIntervals); 1226 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit, Pos, 1227 LaneBitmask::getAll(), 1228 [](const LiveRange &LR, SlotIndex Pos) { 1229 return LR.liveAt(Pos); 1230 }); 1231 } 1232 1233 LaneBitmask RegPressureTracker::getLastUsedLanes(unsigned RegUnit, 1234 SlotIndex Pos) const { 1235 assert(RequireIntervals); 1236 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit, 1237 Pos.getBaseIndex(), LaneBitmask::getNone(), 1238 [](const LiveRange &LR, SlotIndex Pos) { 1239 const LiveRange::Segment *S = LR.getSegmentContaining(Pos); 1240 return S != nullptr && S->end == Pos.getRegSlot(); 1241 }); 1242 } 1243 1244 LaneBitmask RegPressureTracker::getLiveThroughAt(unsigned RegUnit, 1245 SlotIndex Pos) const { 1246 assert(RequireIntervals); 1247 return getLanesWithProperty(*LIS, *MRI, TrackLaneMasks, RegUnit, Pos, 1248 LaneBitmask::getNone(), 1249 [](const LiveRange &LR, SlotIndex Pos) { 1250 const LiveRange::Segment *S = LR.getSegmentContaining(Pos); 1251 return S != nullptr && S->start < Pos.getRegSlot(true) && 1252 S->end != Pos.getDeadSlot(); 1253 }); 1254 } 1255 1256 /// Record the downward impact of a single instruction on current register 1257 /// pressure. Unlike the advance/recede pressure tracking interface, this does 1258 /// not discover live in/outs. 1259 /// 1260 /// This is intended for speculative queries. It leaves pressure inconsistent 1261 /// with the current position, so must be restored by the caller. 1262 void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) { 1263 assert(!MI->isDebugInstr() && "Expect a nondebug instruction."); 1264 1265 SlotIndex SlotIdx; 1266 if (RequireIntervals) 1267 SlotIdx = LIS->getInstructionIndex(*MI).getRegSlot(); 1268 1269 // Account for register pressure similar to RegPressureTracker::recede(). 1270 RegisterOperands RegOpers; 1271 RegOpers.collect(*MI, *TRI, *MRI, TrackLaneMasks, false); 1272 if (TrackLaneMasks) 1273 RegOpers.adjustLaneLiveness(*LIS, *MRI, SlotIdx); 1274 1275 if (RequireIntervals) { 1276 for (const RegisterMaskPair &Use : RegOpers.Uses) { 1277 unsigned Reg = Use.RegUnit; 1278 LaneBitmask LastUseMask = getLastUsedLanes(Reg, SlotIdx); 1279 if (LastUseMask.none()) 1280 continue; 1281 // The LastUseMask is queried from the liveness information of instruction 1282 // which may be further down the schedule. Some lanes may actually not be 1283 // last uses for the current position. 1284 // FIXME: allow the caller to pass in the list of vreg uses that remain 1285 // to be bottom-scheduled to avoid searching uses at each query. 1286 SlotIndex CurrIdx = getCurrSlot(); 1287 LastUseMask 1288 = findUseBetween(Reg, LastUseMask, CurrIdx, SlotIdx, *MRI, LIS); 1289 if (LastUseMask.none()) 1290 continue; 1291 1292 LaneBitmask LiveMask = LiveRegs.contains(Reg); 1293 LaneBitmask NewMask = LiveMask & ~LastUseMask; 1294 decreaseRegPressure(Reg, LiveMask, NewMask); 1295 } 1296 } 1297 1298 // Generate liveness for defs. 1299 for (const RegisterMaskPair &Def : RegOpers.Defs) { 1300 unsigned Reg = Def.RegUnit; 1301 LaneBitmask LiveMask = LiveRegs.contains(Reg); 1302 LaneBitmask NewMask = LiveMask | Def.LaneMask; 1303 increaseRegPressure(Reg, LiveMask, NewMask); 1304 } 1305 1306 // Boost pressure for all dead defs together. 1307 bumpDeadDefs(RegOpers.DeadDefs); 1308 } 1309 1310 /// Consider the pressure increase caused by traversing this instruction 1311 /// top-down. Find the register class with the most change in its pressure limit 1312 /// based on the tracker's current pressure, and return the number of excess 1313 /// register units of that pressure set introduced by this instruction. 1314 /// 1315 /// This assumes that the current LiveIn set is sufficient. 1316 /// 1317 /// This is expensive for an on-the-fly query because it calls 1318 /// bumpDownwardPressure to recompute the pressure sets based on current 1319 /// liveness. We don't yet have a fast version of downward pressure tracking 1320 /// analogous to getUpwardPressureDelta. 1321 void RegPressureTracker:: 1322 getMaxDownwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta, 1323 ArrayRef<PressureChange> CriticalPSets, 1324 ArrayRef<unsigned> MaxPressureLimit) { 1325 // Snapshot Pressure. 1326 std::vector<unsigned> SavedPressure = CurrSetPressure; 1327 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure; 1328 1329 bumpDownwardPressure(MI); 1330 1331 computeExcessPressureDelta(SavedPressure, CurrSetPressure, Delta, RCI, 1332 LiveThruPressure); 1333 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, CriticalPSets, 1334 MaxPressureLimit, Delta); 1335 assert(Delta.CriticalMax.getUnitInc() >= 0 && 1336 Delta.CurrentMax.getUnitInc() >= 0 && "cannot decrease max pressure"); 1337 1338 // Restore the tracker's state. 1339 P.MaxSetPressure.swap(SavedMaxPressure); 1340 CurrSetPressure.swap(SavedPressure); 1341 } 1342 1343 /// Get the pressure of each PSet after traversing this instruction bottom-up. 1344 void RegPressureTracker:: 1345 getUpwardPressure(const MachineInstr *MI, 1346 std::vector<unsigned> &PressureResult, 1347 std::vector<unsigned> &MaxPressureResult) { 1348 // Snapshot pressure. 1349 PressureResult = CurrSetPressure; 1350 MaxPressureResult = P.MaxSetPressure; 1351 1352 bumpUpwardPressure(MI); 1353 1354 // Current pressure becomes the result. Restore current pressure. 1355 P.MaxSetPressure.swap(MaxPressureResult); 1356 CurrSetPressure.swap(PressureResult); 1357 } 1358 1359 /// Get the pressure of each PSet after traversing this instruction top-down. 1360 void RegPressureTracker:: 1361 getDownwardPressure(const MachineInstr *MI, 1362 std::vector<unsigned> &PressureResult, 1363 std::vector<unsigned> &MaxPressureResult) { 1364 // Snapshot pressure. 1365 PressureResult = CurrSetPressure; 1366 MaxPressureResult = P.MaxSetPressure; 1367 1368 bumpDownwardPressure(MI); 1369 1370 // Current pressure becomes the result. Restore current pressure. 1371 P.MaxSetPressure.swap(MaxPressureResult); 1372 CurrSetPressure.swap(PressureResult); 1373 } 1374