RegisterPressure.cpp revision 0556bd35e564c89149aa02ea8d76f539c87ee875
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 "RegisterClassInfo.h" 16#include "RegisterPressure.h" 17#include "llvm/CodeGen/LiveInterval.h" 18#include "llvm/CodeGen/LiveIntervalAnalysis.h" 19#include "llvm/CodeGen/MachineRegisterInfo.h" 20#include "llvm/Target/TargetMachine.h" 21 22using namespace llvm; 23 24/// Increase register pressure for each set impacted by this register class. 25static void increaseSetPressure(std::vector<unsigned> &CurrSetPressure, 26 std::vector<unsigned> &MaxSetPressure, 27 const TargetRegisterClass *RC, 28 const TargetRegisterInfo *TRI) { 29 unsigned Weight = TRI->getRegClassWeight(RC).RegWeight; 30 for (const int *PSet = TRI->getRegClassPressureSets(RC); 31 *PSet != -1; ++PSet) { 32 CurrSetPressure[*PSet] += Weight; 33 if (&CurrSetPressure != &MaxSetPressure 34 && CurrSetPressure[*PSet] > MaxSetPressure[*PSet]) { 35 MaxSetPressure[*PSet] = CurrSetPressure[*PSet]; 36 } 37 } 38} 39 40/// Decrease register pressure for each set impacted by this register class. 41static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure, 42 const TargetRegisterClass *RC, 43 const TargetRegisterInfo *TRI) { 44 unsigned Weight = TRI->getRegClassWeight(RC).RegWeight; 45 for (const int *PSet = TRI->getRegClassPressureSets(RC); 46 *PSet != -1; ++PSet) { 47 assert(CurrSetPressure[*PSet] >= Weight && "register pressure underflow"); 48 CurrSetPressure[*PSet] -= Weight; 49 } 50} 51 52/// Directly increase pressure only within this RegisterPressure result. 53void RegisterPressure::increase(const TargetRegisterClass *RC, 54 const TargetRegisterInfo *TRI) { 55 increaseSetPressure(MaxSetPressure, MaxSetPressure, RC, TRI); 56} 57 58/// Directly decrease pressure only within this RegisterPressure result. 59void RegisterPressure::decrease(const TargetRegisterClass *RC, 60 const TargetRegisterInfo *TRI) { 61 decreaseSetPressure(MaxSetPressure, RC, TRI); 62} 63 64/// Increase the current pressure as impacted by these physical registers and 65/// bump the high water mark if needed. 66void RegPressureTracker::increasePhysRegPressure(ArrayRef<unsigned> Regs) { 67 for (unsigned I = 0, E = Regs.size(); I != E; ++I) 68 increaseSetPressure(CurrSetPressure, P.MaxSetPressure, 69 TRI->getMinimalPhysRegClass(Regs[I]), TRI); 70} 71 72/// Simply decrease the current pressure as impacted by these physcial 73/// registers. 74void RegPressureTracker::decreasePhysRegPressure(ArrayRef<unsigned> Regs) { 75 for (unsigned I = 0, E = Regs.size(); I != E; ++I) 76 decreaseSetPressure(CurrSetPressure, TRI->getMinimalPhysRegClass(Regs[I]), 77 TRI); 78} 79 80/// Increase the current pressure as impacted by these virtual registers and 81/// bump the high water mark if needed. 82void RegPressureTracker::increaseVirtRegPressure(ArrayRef<unsigned> Regs) { 83 for (unsigned I = 0, E = Regs.size(); I != E; ++I) 84 increaseSetPressure(CurrSetPressure, P.MaxSetPressure, 85 MRI->getRegClass(Regs[I]), TRI); 86} 87 88/// Simply decrease the current pressure as impacted by these virtual registers. 89void RegPressureTracker::decreaseVirtRegPressure(ArrayRef<unsigned> Regs) { 90 for (unsigned I = 0, E = Regs.size(); I != E; ++I) 91 decreaseSetPressure(CurrSetPressure, MRI->getRegClass(Regs[I]), TRI); 92} 93 94/// Clear the result so it can be used for another round of pressure tracking. 95void IntervalPressure::reset() { 96 TopIdx = BottomIdx = SlotIndex(); 97 MaxSetPressure.clear(); 98 LiveInRegs.clear(); 99 LiveOutRegs.clear(); 100} 101 102/// Clear the result so it can be used for another round of pressure tracking. 103void RegionPressure::reset() { 104 TopPos = BottomPos = MachineBasicBlock::const_iterator(); 105 MaxSetPressure.clear(); 106 LiveInRegs.clear(); 107 LiveOutRegs.clear(); 108} 109 110/// If the current top is not less than or equal to the next index, open it. 111/// We happen to need the SlotIndex for the next top for pressure update. 112void IntervalPressure::openTop(SlotIndex NextTop) { 113 if (TopIdx <= NextTop) 114 return; 115 TopIdx = SlotIndex(); 116 LiveInRegs.clear(); 117} 118 119/// If the current top is the previous instruction (before receding), open it. 120void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop) { 121 if (TopPos != PrevTop) 122 return; 123 TopPos = MachineBasicBlock::const_iterator(); 124 LiveInRegs.clear(); 125} 126 127/// If the current bottom is not greater than the previous index, open it. 128void IntervalPressure::openBottom(SlotIndex PrevBottom) { 129 if (BottomIdx > PrevBottom) 130 return; 131 BottomIdx = SlotIndex(); 132 LiveInRegs.clear(); 133} 134 135/// If the current bottom is the previous instr (before advancing), open it. 136void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom) { 137 if (BottomPos != PrevBottom) 138 return; 139 BottomPos = MachineBasicBlock::const_iterator(); 140 LiveInRegs.clear(); 141} 142 143/// Setup the RegPressureTracker. 144/// 145/// TODO: Add support for pressure without LiveIntervals. 146void RegPressureTracker::init(const MachineFunction *mf, 147 const RegisterClassInfo *rci, 148 const LiveIntervals *lis, 149 const MachineBasicBlock *mbb, 150 MachineBasicBlock::const_iterator pos) 151{ 152 MF = mf; 153 TRI = MF->getTarget().getRegisterInfo(); 154 RCI = rci; 155 MRI = &MF->getRegInfo(); 156 MBB = mbb; 157 158 if (RequireIntervals) { 159 assert(lis && "IntervalPressure requires LiveIntervals"); 160 LIS = lis; 161 } 162 163 CurrPos = pos; 164 while (CurrPos != MBB->end() && CurrPos->isDebugValue()) 165 ++CurrPos; 166 167 CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0); 168 169 if (RequireIntervals) 170 static_cast<IntervalPressure&>(P).reset(); 171 else 172 static_cast<RegionPressure&>(P).reset(); 173 P.MaxSetPressure = CurrSetPressure; 174 175 LivePhysRegs.clear(); 176 LivePhysRegs.setUniverse(TRI->getNumRegs()); 177 LiveVirtRegs.clear(); 178 LiveVirtRegs.setUniverse(MRI->getNumVirtRegs()); 179} 180 181/// Does this pressure result have a valid top position and live ins. 182bool RegPressureTracker::isTopClosed() const { 183 if (RequireIntervals) 184 return static_cast<IntervalPressure&>(P).TopIdx.isValid(); 185 return (static_cast<RegionPressure&>(P).TopPos == 186 MachineBasicBlock::const_iterator()); 187} 188 189/// Does this pressure result have a valid bottom position and live outs. 190bool RegPressureTracker::isBottomClosed() const { 191 if (RequireIntervals) 192 return static_cast<IntervalPressure&>(P).BottomIdx.isValid(); 193 return (static_cast<RegionPressure&>(P).BottomPos == 194 MachineBasicBlock::const_iterator()); 195} 196 197/// Set the boundary for the top of the region and summarize live ins. 198void RegPressureTracker::closeTop() { 199 if (RequireIntervals) 200 static_cast<IntervalPressure&>(P).TopIdx = 201 LIS->getInstructionIndex(CurrPos).getRegSlot(); 202 else 203 static_cast<RegionPressure&>(P).TopPos = CurrPos; 204 205 assert(P.LiveInRegs.empty() && "inconsistent max pressure result"); 206 P.LiveInRegs.reserve(LivePhysRegs.size() + LiveVirtRegs.size()); 207 P.LiveInRegs.append(LivePhysRegs.begin(), LivePhysRegs.end()); 208 for (SparseSet<unsigned>::const_iterator I = 209 LiveVirtRegs.begin(), E = LiveVirtRegs.end(); I != E; ++I) 210 P.LiveInRegs.push_back(*I); 211 std::sort(P.LiveInRegs.begin(), P.LiveInRegs.end()); 212 P.LiveInRegs.erase(std::unique(P.LiveInRegs.begin(), P.LiveInRegs.end()), 213 P.LiveInRegs.end()); 214} 215 216/// Set the boundary for the bottom of the region and summarize live outs. 217void RegPressureTracker::closeBottom() { 218 if (RequireIntervals) 219 if (CurrPos == MBB->end()) 220 static_cast<IntervalPressure&>(P).BottomIdx = LIS->getMBBEndIdx(MBB); 221 else 222 static_cast<IntervalPressure&>(P).BottomIdx = 223 LIS->getInstructionIndex(CurrPos).getRegSlot(); 224 else 225 static_cast<RegionPressure&>(P).BottomPos = CurrPos; 226 227 assert(P.LiveOutRegs.empty() && "inconsistent max pressure result"); 228 P.LiveOutRegs.reserve(LivePhysRegs.size() + LiveVirtRegs.size()); 229 P.LiveOutRegs.append(LivePhysRegs.begin(), LivePhysRegs.end()); 230 for (SparseSet<unsigned>::const_iterator I = 231 LiveVirtRegs.begin(), E = LiveVirtRegs.end(); I != E; ++I) 232 P.LiveOutRegs.push_back(*I); 233 std::sort(P.LiveOutRegs.begin(), P.LiveOutRegs.end()); 234 P.LiveOutRegs.erase(std::unique(P.LiveOutRegs.begin(), P.LiveOutRegs.end()), 235 P.LiveOutRegs.end()); 236} 237 238/// Finalize the region boundaries and record live ins and live outs. 239void RegPressureTracker::closeRegion() { 240 if (!isTopClosed() && !isBottomClosed()) { 241 assert(LivePhysRegs.empty() && LiveVirtRegs.empty() && 242 "no region boundary"); 243 return; 244 } 245 if (!isBottomClosed()) 246 closeBottom(); 247 else if (!isTopClosed()) 248 closeTop(); 249 // If both top and bottom are closed, do nothing. 250} 251 252/// Return true if Reg aliases a register in Regs SparseSet. 253static bool hasRegAlias(unsigned Reg, SparseSet<unsigned> &Regs, 254 const TargetRegisterInfo *TRI) { 255 assert(!TargetRegisterInfo::isVirtualRegister(Reg) && "only for physregs"); 256 for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) { 257 if (Regs.count(*Alias)) 258 return true; 259 } 260 return false; 261} 262 263/// Return true if Reg aliases a register in unsorted Regs SmallVector. 264/// This is only valid for physical registers. 265static SmallVectorImpl<unsigned>::iterator 266findRegAlias(unsigned Reg, SmallVectorImpl<unsigned> &Regs, 267 const TargetRegisterInfo *TRI) { 268 for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) { 269 SmallVectorImpl<unsigned>::iterator I = 270 std::find(Regs.begin(), Regs.end(), *Alias); 271 if (I != Regs.end()) 272 return I; 273 } 274 return Regs.end(); 275} 276 277/// Return true if Reg can be inserted into Regs SmallVector. For virtual 278/// register, do a linear search. For physical registers check for aliases. 279static SmallVectorImpl<unsigned>::iterator 280findReg(unsigned Reg, bool isVReg, SmallVectorImpl<unsigned> &Regs, 281 const TargetRegisterInfo *TRI) { 282 if(isVReg) 283 return std::find(Regs.begin(), Regs.end(), Reg); 284 return findRegAlias(Reg, Regs, TRI); 285} 286 287/// Collect this instruction's unique uses and defs into SmallVectors for 288/// processing defs and uses in order. 289template<bool isVReg> 290struct RegisterOperands { 291 SmallVector<unsigned, 8> Uses; 292 SmallVector<unsigned, 8> Defs; 293 SmallVector<unsigned, 8> DeadDefs; 294 295 /// Push this operand's register onto the correct vector. 296 void collect(const MachineOperand &MO, const TargetRegisterInfo *TRI) { 297 if (MO.readsReg()) { 298 if (findReg(MO.getReg(), isVReg, Uses, TRI) == Uses.end()) 299 Uses.push_back(MO.getReg()); 300 } 301 if (MO.isDef()) { 302 if (MO.isDead()) { 303 if (findReg(MO.getReg(), isVReg, DeadDefs, TRI) == DeadDefs.end()) 304 DeadDefs.push_back(MO.getReg()); 305 } 306 else { 307 if (findReg(MO.getReg(), isVReg, Defs, TRI) == Defs.end()) 308 Defs.push_back(MO.getReg()); 309 } 310 } 311 } 312}; 313typedef RegisterOperands<false> PhysRegOperands; 314typedef RegisterOperands<true> VirtRegOperands; 315 316/// Collect physical and virtual register operands. 317static void collectOperands(const MachineInstr *MI, 318 PhysRegOperands &PhysRegOpers, 319 VirtRegOperands &VirtRegOpers, 320 const TargetRegisterInfo *TRI, 321 const RegisterClassInfo *RCI) { 322 for(ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI) { 323 const MachineOperand &MO = *OperI; 324 if (!MO.isReg() || !MO.getReg()) 325 continue; 326 327 if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) 328 VirtRegOpers.collect(MO, TRI); 329 else if (RCI->isAllocatable(MO.getReg())) 330 PhysRegOpers.collect(MO, TRI); 331 } 332 // Remove redundant physreg dead defs. 333 for (unsigned i = PhysRegOpers.DeadDefs.size(); i > 0; --i) { 334 unsigned Reg = PhysRegOpers.DeadDefs[i-1]; 335 if (findRegAlias(Reg, PhysRegOpers.Defs, TRI) != PhysRegOpers.Defs.end()) 336 PhysRegOpers.DeadDefs.erase(&PhysRegOpers.DeadDefs[i-1]); 337 } 338} 339 340/// Force liveness of registers. 341void RegPressureTracker::addLiveRegs(ArrayRef<unsigned> Regs) { 342 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 343 if (TargetRegisterInfo::isVirtualRegister(Regs[i])) { 344 if (LiveVirtRegs.insert(Regs[i]).second) 345 increaseVirtRegPressure(Regs[i]); 346 } 347 else { 348 if (!hasRegAlias(Regs[i], LivePhysRegs, TRI)) { 349 LivePhysRegs.insert(Regs[i]); 350 increasePhysRegPressure(Regs[i]); 351 } 352 } 353 } 354} 355 356/// Add PhysReg to the live in set and increase max pressure. 357void RegPressureTracker::discoverPhysLiveIn(unsigned Reg) { 358 assert(!LivePhysRegs.count(Reg) && "avoid bumping max pressure twice"); 359 if (findRegAlias(Reg, P.LiveInRegs, TRI) == P.LiveInRegs.end()) 360 return; 361 362 // At live in discovery, unconditionally increase the high water mark. 363 P.LiveInRegs.push_back(Reg); 364 P.increase(TRI->getMinimalPhysRegClass(Reg), TRI); 365} 366 367/// Add PhysReg to the live out set and increase max pressure. 368void RegPressureTracker::discoverPhysLiveOut(unsigned Reg) { 369 assert(!LivePhysRegs.count(Reg) && "avoid bumping max pressure twice"); 370 if (findRegAlias(Reg, P.LiveOutRegs, TRI) == P.LiveOutRegs.end()) 371 return; 372 373 // At live out discovery, unconditionally increase the high water mark. 374 P.LiveOutRegs.push_back(Reg); 375 P.increase(TRI->getMinimalPhysRegClass(Reg), TRI); 376} 377 378/// Add VirtReg to the live in set and increase max pressure. 379void RegPressureTracker::discoverVirtLiveIn(unsigned Reg) { 380 assert(!LiveVirtRegs.count(Reg) && "avoid bumping max pressure twice"); 381 if (std::find(P.LiveInRegs.begin(), P.LiveInRegs.end(), Reg) != 382 P.LiveInRegs.end()) 383 return; 384 385 // At live in discovery, unconditionally increase the high water mark. 386 P.LiveInRegs.push_back(Reg); 387 P.increase(MRI->getRegClass(Reg), TRI); 388} 389 390/// Add VirtReg to the live out set and increase max pressure. 391void RegPressureTracker::discoverVirtLiveOut(unsigned Reg) { 392 assert(!LiveVirtRegs.count(Reg) && "avoid bumping max pressure twice"); 393 if (std::find(P.LiveOutRegs.begin(), P.LiveOutRegs.end(), Reg) != 394 P.LiveOutRegs.end()) 395 return; 396 397 // At live out discovery, unconditionally increase the high water mark. 398 P.LiveOutRegs.push_back(Reg); 399 P.increase(MRI->getRegClass(Reg), TRI); 400} 401 402/// Recede across the previous instruction. 403bool RegPressureTracker::recede() { 404 // Check for the top of the analyzable region. 405 if (CurrPos == MBB->begin()) { 406 closeRegion(); 407 return false; 408 } 409 if (!isBottomClosed()) 410 closeBottom(); 411 412 // Open the top of the region using block iterators. 413 if (!RequireIntervals && isTopClosed()) 414 static_cast<RegionPressure&>(P).openTop(CurrPos); 415 416 // Find the previous instruction. 417 do 418 --CurrPos; 419 while (CurrPos != MBB->begin() && CurrPos->isDebugValue()); 420 421 if (CurrPos->isDebugValue()) { 422 closeRegion(); 423 return false; 424 } 425 SlotIndex SlotIdx; 426 if (RequireIntervals) 427 SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot(); 428 429 // Open the top of the region using slot indexes. 430 if (RequireIntervals && isTopClosed()) 431 static_cast<IntervalPressure&>(P).openTop(SlotIdx); 432 433 PhysRegOperands PhysRegOpers; 434 VirtRegOperands VirtRegOpers; 435 collectOperands(CurrPos, PhysRegOpers, VirtRegOpers, TRI, RCI); 436 437 // Boost pressure for all dead defs together. 438 increasePhysRegPressure(PhysRegOpers.DeadDefs); 439 increaseVirtRegPressure(VirtRegOpers.DeadDefs); 440 decreasePhysRegPressure(PhysRegOpers.DeadDefs); 441 decreaseVirtRegPressure(VirtRegOpers.DeadDefs); 442 443 // Kill liveness at live defs. 444 // TODO: consider earlyclobbers? 445 for (unsigned i = 0, e = PhysRegOpers.Defs.size(); i < e; ++i) { 446 unsigned Reg = PhysRegOpers.Defs[i]; 447 if (LivePhysRegs.erase(Reg)) 448 decreasePhysRegPressure(Reg); 449 else 450 discoverPhysLiveOut(Reg); 451 } 452 for (unsigned i = 0, e = VirtRegOpers.Defs.size(); i < e; ++i) { 453 unsigned Reg = VirtRegOpers.Defs[i]; 454 if (LiveVirtRegs.erase(Reg)) 455 decreaseVirtRegPressure(Reg); 456 else 457 discoverVirtLiveOut(Reg); 458 } 459 460 // Generate liveness for uses. 461 for (unsigned i = 0, e = PhysRegOpers.Uses.size(); i < e; ++i) { 462 unsigned Reg = PhysRegOpers.Uses[i]; 463 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) { 464 increasePhysRegPressure(Reg); 465 LivePhysRegs.insert(Reg); 466 } 467 } 468 for (unsigned i = 0, e = VirtRegOpers.Uses.size(); i < e; ++i) { 469 unsigned Reg = VirtRegOpers.Uses[i]; 470 if (!LiveVirtRegs.count(Reg)) { 471 // Adjust liveouts if LiveIntervals are available. 472 if (RequireIntervals) { 473 const LiveInterval *LI = &LIS->getInterval(Reg); 474 if (!LI->killedAt(SlotIdx)) 475 discoverVirtLiveOut(Reg); 476 } 477 increaseVirtRegPressure(Reg); 478 LiveVirtRegs.insert(Reg); 479 } 480 } 481 return true; 482} 483 484/// Advance across the current instruction. 485bool RegPressureTracker::advance() { 486 // Check for the bottom of the analyzable region. 487 if (CurrPos == MBB->end()) { 488 closeRegion(); 489 return false; 490 } 491 if (!isTopClosed()) 492 closeTop(); 493 494 SlotIndex SlotIdx; 495 if (RequireIntervals) 496 SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot(); 497 498 // Open the bottom of the region using slot indexes. 499 if (isBottomClosed()) { 500 if (RequireIntervals) 501 static_cast<IntervalPressure&>(P).openBottom(SlotIdx); 502 else 503 static_cast<RegionPressure&>(P).openBottom(CurrPos); 504 } 505 506 PhysRegOperands PhysRegOpers; 507 VirtRegOperands VirtRegOpers; 508 collectOperands(CurrPos, PhysRegOpers, VirtRegOpers, TRI, RCI); 509 510 // Kill liveness at last uses. 511 for (unsigned i = 0, e = PhysRegOpers.Uses.size(); i < e; ++i) { 512 unsigned Reg = PhysRegOpers.Uses[i]; 513 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) 514 discoverPhysLiveIn(Reg); 515 else { 516 // Allocatable physregs are always single-use before regalloc. 517 decreasePhysRegPressure(Reg); 518 LivePhysRegs.erase(Reg); 519 } 520 } 521 for (unsigned i = 0, e = VirtRegOpers.Uses.size(); i < e; ++i) { 522 unsigned Reg = VirtRegOpers.Uses[i]; 523 if (RequireIntervals) { 524 const LiveInterval *LI = &LIS->getInterval(Reg); 525 if (LI->killedAt(SlotIdx)) { 526 if (LiveVirtRegs.erase(Reg)) 527 decreaseVirtRegPressure(Reg); 528 else 529 discoverVirtLiveIn(Reg); 530 } 531 } 532 else if (!LiveVirtRegs.count(Reg)) { 533 discoverVirtLiveIn(Reg); 534 increaseVirtRegPressure(Reg); 535 } 536 } 537 538 // Generate liveness for defs. 539 for (unsigned i = 0, e = PhysRegOpers.Defs.size(); i < e; ++i) { 540 unsigned Reg = PhysRegOpers.Defs[i]; 541 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) { 542 increasePhysRegPressure(Reg); 543 LivePhysRegs.insert(Reg); 544 } 545 } 546 for (unsigned i = 0, e = VirtRegOpers.Defs.size(); i < e; ++i) { 547 unsigned Reg = VirtRegOpers.Defs[i]; 548 if (LiveVirtRegs.insert(Reg).second) 549 increaseVirtRegPressure(Reg); 550 } 551 552 // Boost pressure for all dead defs together. 553 increasePhysRegPressure(PhysRegOpers.DeadDefs); 554 increaseVirtRegPressure(VirtRegOpers.DeadDefs); 555 decreasePhysRegPressure(PhysRegOpers.DeadDefs); 556 decreaseVirtRegPressure(VirtRegOpers.DeadDefs); 557 558 // Find the next instruction. 559 do 560 ++CurrPos; 561 while (CurrPos != MBB->end() && CurrPos->isDebugValue()); 562 return true; 563} 564 565// Find the max change in excess pressure across all sets. 566static int computeMaxPressureDelta(ArrayRef<unsigned> OldPressureVec, 567 ArrayRef<unsigned> NewPressureVec, 568 unsigned &PSetID, 569 const TargetRegisterInfo *TRI) { 570 int ExcessUnits = 0; 571 for (unsigned i = 0, e = OldPressureVec.size(); i < e; ++i) { 572 unsigned POld = OldPressureVec[i]; 573 unsigned PNew = NewPressureVec[i]; 574 int PDiff = (int)PNew - (int)POld; 575 if (!PDiff) // No change in this set in the common case. 576 continue; 577 // Only consider change beyond the limit. 578 unsigned Limit = TRI->getRegPressureSetLimit(i); 579 if (Limit > POld) { 580 if (Limit > PNew) 581 PDiff = 0; // Under the limit 582 else 583 PDiff = PNew - Limit; // Just exceeded limit. 584 } 585 else if (Limit > PNew) 586 PDiff = Limit - POld; // Just obeyed limit. 587 588 if (std::abs(PDiff) > std::abs(ExcessUnits)) { 589 ExcessUnits = PDiff; 590 PSetID = i; 591 } 592 } 593 return ExcessUnits; 594} 595 596/// Consider the pressure increase caused by traversing this instruction 597/// bottom-up. Find the pressure set with the most change beyond its pressure 598/// limit based on the tracker's current pressure, and return the change in 599/// number of register units of that pressure set introduced by this 600/// instruction. 601/// 602/// This assumes that the current LiveOut set is sufficient. 603/// 604/// FIXME: This is expensive for an on-the-fly query. We need to cache the 605/// result per-SUnit with enough information to adjust for the current 606/// scheduling position. But this works as a proof of concept. 607void RegPressureTracker:: 608getMaxUpwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta) { 609 // Account for register pressure similar to RegPressureTracker::recede(). 610 PhysRegOperands PhysRegOpers; 611 VirtRegOperands VirtRegOpers; 612 collectOperands(MI, PhysRegOpers, VirtRegOpers, TRI, RCI); 613 614 // Snapshot Pressure. 615 std::vector<unsigned> SavedPressure = CurrSetPressure; 616 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure; 617 618 // Boost max pressure for all dead defs together. 619 // Since CurrSetPressure and MaxSetPressure 620 increasePhysRegPressure(PhysRegOpers.DeadDefs); 621 increaseVirtRegPressure(VirtRegOpers.DeadDefs); 622 decreasePhysRegPressure(PhysRegOpers.DeadDefs); 623 decreaseVirtRegPressure(VirtRegOpers.DeadDefs); 624 625 // Kill liveness at live defs. 626 decreasePhysRegPressure(PhysRegOpers.Defs); 627 decreaseVirtRegPressure(VirtRegOpers.Defs); 628 629 // Generate liveness for uses. 630 for (unsigned i = 0, e = PhysRegOpers.Uses.size(); i < e; ++i) { 631 unsigned Reg = PhysRegOpers.Uses[i]; 632 if (!hasRegAlias(Reg, LivePhysRegs, TRI) 633 && (findRegAlias(Reg, PhysRegOpers.Defs, TRI) 634 == PhysRegOpers.Defs.end())) { 635 increasePhysRegPressure(Reg); 636 } 637 } 638 for (unsigned i = 0, e = VirtRegOpers.Uses.size(); i < e; ++i) { 639 unsigned Reg = VirtRegOpers.Uses[i]; 640 if (!LiveVirtRegs.count(Reg) 641 && (std::find(VirtRegOpers.Defs.begin(), VirtRegOpers.Defs.end(), Reg) 642 != VirtRegOpers.Defs.end())) { 643 increaseVirtRegPressure(Reg); 644 } 645 } 646 Delta.ExcessUnits = 647 computeMaxPressureDelta(SavedPressure, CurrSetPressure, 648 Delta.ExcessSetID, TRI); 649 Delta.MaxUnitIncrease = 650 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, 651 Delta.MaxSetID, TRI); 652 assert(Delta.MaxUnitIncrease >= 0 && "cannot increase max pressure"); 653 654 // Restore the tracker's state. 655 P.MaxSetPressure.swap(SavedMaxPressure); 656 CurrSetPressure.swap(SavedPressure); 657} 658 659/// Helper to find a vreg use between two indices [PriorUseIdx, NextUseIdx). 660static bool findUseBetween(unsigned Reg, 661 SlotIndex PriorUseIdx, SlotIndex NextUseIdx, 662 const MachineRegisterInfo *MRI, 663 const LiveIntervals *LIS) { 664 for (MachineRegisterInfo::use_nodbg_iterator 665 UI = MRI->use_nodbg_begin(Reg), UE = MRI->use_nodbg_end(); 666 UI != UE; UI.skipInstruction()) { 667 const MachineInstr* MI = &*UI; 668 SlotIndex InstSlot = LIS->getInstructionIndex(MI).getRegSlot(); 669 if (InstSlot >= PriorUseIdx && InstSlot < NextUseIdx) 670 return true; 671 } 672 return false; 673} 674 675/// Consider the pressure increase caused by traversing this instruction 676/// top-down. Find the register class with the most change in its pressure limit 677/// based on the tracker's current pressure, and return the number of excess 678/// register units of that pressure set introduced by this instruction. 679/// 680/// This assumes that the current LiveIn set is sufficient. 681void RegPressureTracker:: 682getMaxDownwardPressureDelta(const MachineInstr *MI, RegPressureDelta &Delta) { 683 // Account for register pressure similar to RegPressureTracker::recede(). 684 PhysRegOperands PhysRegOpers; 685 VirtRegOperands VirtRegOpers; 686 collectOperands(MI, PhysRegOpers, VirtRegOpers, TRI, RCI); 687 688 // Snapshot Pressure. 689 std::vector<unsigned> SavedPressure = CurrSetPressure; 690 std::vector<unsigned> SavedMaxPressure = P.MaxSetPressure; 691 692 // Kill liveness at last uses. Assume allocatable physregs are single-use 693 // rather than checking LiveIntervals. 694 decreasePhysRegPressure(PhysRegOpers.Uses); 695 if (RequireIntervals) { 696 SlotIndex SlotIdx = LIS->getInstructionIndex(MI).getRegSlot(); 697 for (unsigned i = 0, e = VirtRegOpers.Uses.size(); i < e; ++i) { 698 unsigned Reg = VirtRegOpers.Uses[i]; 699 const LiveInterval *LI = &LIS->getInterval(Reg); 700 // FIXME: allow the caller to pass in the list of vreg uses that remain to 701 // be bottom-scheduled to avoid searching uses at each query. 702 SlotIndex CurrIdx = LIS->getInstructionIndex(CurrPos).getRegSlot(); 703 if (LI->killedAt(SlotIdx) 704 && !findUseBetween(Reg, CurrIdx, SlotIdx, MRI, LIS)) { 705 decreaseVirtRegPressure(Reg); 706 } 707 } 708 } 709 710 // Generate liveness for defs. 711 increasePhysRegPressure(PhysRegOpers.Defs); 712 increaseVirtRegPressure(VirtRegOpers.Defs); 713 714 // Boost pressure for all dead defs together. 715 increasePhysRegPressure(PhysRegOpers.DeadDefs); 716 increaseVirtRegPressure(VirtRegOpers.DeadDefs); 717 decreasePhysRegPressure(PhysRegOpers.DeadDefs); 718 decreaseVirtRegPressure(VirtRegOpers.DeadDefs); 719 720 Delta.ExcessUnits = 721 computeMaxPressureDelta(SavedPressure, CurrSetPressure, 722 Delta.ExcessSetID, TRI); 723 Delta.MaxUnitIncrease = 724 computeMaxPressureDelta(SavedMaxPressure, P.MaxSetPressure, 725 Delta.MaxSetID, TRI); 726 727 // Restore the tracker's state. 728 P.MaxSetPressure.swap(SavedMaxPressure); 729 CurrSetPressure.swap(SavedPressure); 730} 731