RegisterPressure.cpp revision 4dfeef100d940a0c1ca22055dcb29b02a4848f65
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[*PSet] > MaxSetPressure[*PSet]) 34 MaxSetPressure[*PSet] = CurrSetPressure[*PSet]; 35 } 36} 37 38/// Decrease register pressure for each set impacted by this register class. 39static void decreaseSetPressure(std::vector<unsigned> &CurrSetPressure, 40 const TargetRegisterClass *RC, 41 const TargetRegisterInfo *TRI) { 42 unsigned Weight = TRI->getRegClassWeight(RC).RegWeight; 43 for (const int *PSet = TRI->getRegClassPressureSets(RC); 44 *PSet != -1; ++PSet) { 45 assert(CurrSetPressure[*PSet] >= Weight && "register pressure underflow"); 46 CurrSetPressure[*PSet] -= Weight; 47 } 48} 49 50/// Directly increase pressure only within this RegisterPressure result. 51void RegisterPressure::increase(const TargetRegisterClass *RC, 52 const TargetRegisterInfo *TRI) { 53 increaseSetPressure(MaxSetPressure, MaxSetPressure, RC, TRI); 54} 55 56/// Directly decrease pressure only within this RegisterPressure result. 57void RegisterPressure::decrease(const TargetRegisterClass *RC, 58 const TargetRegisterInfo *TRI) { 59 decreaseSetPressure(MaxSetPressure, RC, TRI); 60} 61 62/// Increase the current pressure as impacted by this physical register and bump 63/// the high water mark if needed. 64void RegPressureTracker::increasePhysRegPressure(unsigned Reg) { 65 increaseSetPressure(CurrSetPressure, P.MaxSetPressure, 66 TRI->getMinimalPhysRegClass(Reg), TRI); 67} 68 69/// Simply decrease the current pressure as impacted by this physcial register. 70void RegPressureTracker::decreasePhysRegPressure(unsigned Reg) { 71 decreaseSetPressure(CurrSetPressure, TRI->getMinimalPhysRegClass(Reg), TRI); 72} 73 74/// Increase the current pressure as impacted by this virtual register and bump 75/// the high water mark if needed. 76void RegPressureTracker::increaseVirtRegPressure(unsigned Reg) { 77 increaseSetPressure(CurrSetPressure, P.MaxSetPressure, 78 MRI->getRegClass(Reg), TRI); 79} 80 81/// Simply decrease the current pressure as impacted by this virtual register. 82void RegPressureTracker::decreaseVirtRegPressure(unsigned Reg) { 83 decreaseSetPressure(CurrSetPressure, MRI->getRegClass(Reg), TRI); 84} 85 86/// Clear the result so it can be used for another round of pressure tracking. 87void IntervalPressure::reset() { 88 TopIdx = BottomIdx = SlotIndex(); 89 MaxSetPressure.clear(); 90 LiveInRegs.clear(); 91 LiveOutRegs.clear(); 92} 93 94/// Clear the result so it can be used for another round of pressure tracking. 95void RegionPressure::reset() { 96 TopPos = BottomPos = MachineBasicBlock::const_iterator(); 97 MaxSetPressure.clear(); 98 LiveInRegs.clear(); 99 LiveOutRegs.clear(); 100} 101 102/// If the current top is not less than or equal to the next index, open it. 103/// We happen to need the SlotIndex for the next top for pressure update. 104void IntervalPressure::openTop(SlotIndex NextTop) { 105 if (TopIdx <= NextTop) 106 return; 107 TopIdx = SlotIndex(); 108 LiveInRegs.clear(); 109} 110 111/// If the current top is the previous instruction (before receding), open it. 112void RegionPressure::openTop(MachineBasicBlock::const_iterator PrevTop) { 113 if (TopPos != PrevTop) 114 return; 115 TopPos = MachineBasicBlock::const_iterator(); 116 LiveInRegs.clear(); 117} 118 119/// If the current bottom is not greater than the previous index, open it. 120void IntervalPressure::openBottom(SlotIndex PrevBottom) { 121 if (BottomIdx > PrevBottom) 122 return; 123 BottomIdx = SlotIndex(); 124 LiveInRegs.clear(); 125} 126 127/// If the current bottom is the previous instr (before advancing), open it. 128void RegionPressure::openBottom(MachineBasicBlock::const_iterator PrevBottom) { 129 if (BottomPos != PrevBottom) 130 return; 131 BottomPos = MachineBasicBlock::const_iterator(); 132 LiveInRegs.clear(); 133} 134 135/// Setup the RegPressureTracker. 136/// 137/// TODO: Add support for pressure without LiveIntervals. 138void RegPressureTracker::init(const MachineFunction *mf, 139 const RegisterClassInfo *rci, 140 const LiveIntervals *lis, 141 const MachineBasicBlock *mbb, 142 MachineBasicBlock::const_iterator pos) 143{ 144 MF = mf; 145 TRI = MF->getTarget().getRegisterInfo(); 146 RCI = rci; 147 MRI = &MF->getRegInfo(); 148 MBB = mbb; 149 150 if (RequireIntervals) { 151 assert(lis && "IntervalPressure requires LiveIntervals"); 152 LIS = lis; 153 } 154 155 CurrPos = pos; 156 while (CurrPos != MBB->end() && CurrPos->isDebugValue()) 157 ++CurrPos; 158 159 CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0); 160 161 if (RequireIntervals) 162 static_cast<IntervalPressure&>(P).reset(); 163 else 164 static_cast<RegionPressure&>(P).reset(); 165 P.MaxSetPressure = CurrSetPressure; 166 167 LivePhysRegs.clear(); 168 LivePhysRegs.setUniverse(TRI->getNumRegs()); 169 LiveVirtRegs.clear(); 170 LiveVirtRegs.setUniverse(MRI->getNumVirtRegs()); 171} 172 173/// Does this pressure result have a valid top position and live ins. 174bool RegPressureTracker::isTopClosed() const { 175 if (RequireIntervals) 176 return static_cast<IntervalPressure&>(P).TopIdx.isValid(); 177 return (static_cast<RegionPressure&>(P).TopPos == 178 MachineBasicBlock::const_iterator()); 179} 180 181/// Does this pressure result have a valid bottom position and live outs. 182bool RegPressureTracker::isBottomClosed() const { 183 if (RequireIntervals) 184 return static_cast<IntervalPressure&>(P).BottomIdx.isValid(); 185 return (static_cast<RegionPressure&>(P).BottomPos == 186 MachineBasicBlock::const_iterator()); 187} 188 189/// Set the boundary for the top of the region and summarize live ins. 190void RegPressureTracker::closeTop() { 191 if (RequireIntervals) 192 static_cast<IntervalPressure&>(P).TopIdx = 193 LIS->getInstructionIndex(CurrPos).getRegSlot(); 194 else 195 static_cast<RegionPressure&>(P).TopPos = CurrPos; 196 197 assert(P.LiveInRegs.empty() && "inconsistent max pressure result"); 198 P.LiveInRegs.reserve(LivePhysRegs.size() + LiveVirtRegs.size()); 199 P.LiveInRegs.append(LivePhysRegs.begin(), LivePhysRegs.end()); 200 for (SparseSet<unsigned>::const_iterator I = 201 LiveVirtRegs.begin(), E = LiveVirtRegs.end(); I != E; ++I) 202 P.LiveInRegs.push_back(*I); 203 std::sort(P.LiveInRegs.begin(), P.LiveInRegs.end()); 204 P.LiveInRegs.erase(std::unique(P.LiveInRegs.begin(), P.LiveInRegs.end()), 205 P.LiveInRegs.end()); 206} 207 208/// Set the boundary for the bottom of the region and summarize live outs. 209void RegPressureTracker::closeBottom() { 210 if (RequireIntervals) 211 if (CurrPos == MBB->end()) 212 static_cast<IntervalPressure&>(P).BottomIdx = LIS->getMBBEndIdx(MBB); 213 else 214 static_cast<IntervalPressure&>(P).BottomIdx = 215 LIS->getInstructionIndex(CurrPos).getRegSlot(); 216 else 217 static_cast<RegionPressure&>(P).BottomPos = CurrPos; 218 219 assert(P.LiveOutRegs.empty() && "inconsistent max pressure result"); 220 P.LiveOutRegs.reserve(LivePhysRegs.size() + LiveVirtRegs.size()); 221 P.LiveOutRegs.append(LivePhysRegs.begin(), LivePhysRegs.end()); 222 for (SparseSet<unsigned>::const_iterator I = 223 LiveVirtRegs.begin(), E = LiveVirtRegs.end(); I != E; ++I) 224 P.LiveOutRegs.push_back(*I); 225 std::sort(P.LiveOutRegs.begin(), P.LiveOutRegs.end()); 226 P.LiveOutRegs.erase(std::unique(P.LiveOutRegs.begin(), P.LiveOutRegs.end()), 227 P.LiveOutRegs.end()); 228} 229 230/// Finalize the region boundaries and record live ins and live outs. 231void RegPressureTracker::closeRegion() { 232 if (!isTopClosed() && !isBottomClosed()) { 233 assert(LivePhysRegs.empty() && LiveVirtRegs.empty() && 234 "no region boundary"); 235 return; 236 } 237 if (!isBottomClosed()) 238 closeBottom(); 239 else if (!isTopClosed()) 240 closeTop(); 241 // If both top and bottom are closed, do nothing. 242} 243 244/// Return true if Reg aliases a register in Regs SparseSet. 245static bool hasRegAlias(unsigned Reg, SparseSet<unsigned> &Regs, 246 const TargetRegisterInfo *TRI) { 247 assert(!TargetRegisterInfo::isVirtualRegister(Reg) && "only for physregs"); 248 for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) { 249 if (Regs.count(*Alias)) 250 return true; 251 } 252 return false; 253} 254 255/// Return true if Reg aliases a register in unsorted Regs SmallVector. 256/// This is only valid for physical registers. 257static SmallVectorImpl<unsigned>::iterator 258findRegAlias(unsigned Reg, SmallVectorImpl<unsigned> &Regs, 259 const TargetRegisterInfo *TRI) { 260 for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) { 261 SmallVectorImpl<unsigned>::iterator I = 262 std::find(Regs.begin(), Regs.end(), *Alias); 263 if (I != Regs.end()) 264 return I; 265 } 266 return Regs.end(); 267} 268 269/// Return true if Reg can be inserted into Regs SmallVector. For virtual 270/// register, do a linear search. For physical registers check for aliases. 271static SmallVectorImpl<unsigned>::iterator 272findReg(unsigned Reg, bool isVReg, SmallVectorImpl<unsigned> &Regs, 273 const TargetRegisterInfo *TRI) { 274 if(isVReg) 275 return std::find(Regs.begin(), Regs.end(), Reg); 276 return findRegAlias(Reg, Regs, TRI); 277} 278 279/// Collect this instruction's unique uses and defs into SmallVectors for 280/// processing defs and uses in order. 281template<bool isVReg> 282struct RegisterOperands { 283 SmallVector<unsigned, 8> Uses; 284 SmallVector<unsigned, 8> Defs; 285 SmallVector<unsigned, 8> DeadDefs; 286 287 /// Push this operand's register onto the correct vector. 288 void collect(const MachineOperand &MO, const TargetRegisterInfo *TRI) { 289 if (MO.readsReg()) { 290 if (findReg(MO.getReg(), isVReg, Uses, TRI) == Uses.end()) 291 Uses.push_back(MO.getReg()); 292 } 293 if (MO.isDef()) { 294 if (MO.isDead()) { 295 if (findReg(MO.getReg(), isVReg, DeadDefs, TRI) == DeadDefs.end()) 296 DeadDefs.push_back(MO.getReg()); 297 } 298 else { 299 if (findReg(MO.getReg(), isVReg, Defs, TRI) == Defs.end()) 300 Defs.push_back(MO.getReg()); 301 } 302 } 303 } 304}; 305typedef RegisterOperands<false> PhysRegOperands; 306typedef RegisterOperands<true> VirtRegOperands; 307 308/// Collect physical and virtual register operands. 309static void collectOperands(const MachineInstr *MI, 310 PhysRegOperands &PhysRegOpers, 311 VirtRegOperands &VirtRegOpers, 312 const TargetRegisterInfo *TRI, 313 const RegisterClassInfo *RCI) { 314 for(ConstMIBundleOperands OperI(MI); OperI.isValid(); ++OperI) { 315 const MachineOperand &MO = *OperI; 316 if (!MO.isReg() || !MO.getReg()) 317 continue; 318 319 if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) 320 VirtRegOpers.collect(MO, TRI); 321 else if (RCI->isAllocatable(MO.getReg())) 322 PhysRegOpers.collect(MO, TRI); 323 } 324 // Remove redundant physreg dead defs. 325 for (unsigned i = PhysRegOpers.DeadDefs.size(); i > 0; --i) { 326 unsigned Reg = PhysRegOpers.DeadDefs[i-1]; 327 if (findRegAlias(Reg, PhysRegOpers.Defs, TRI) != PhysRegOpers.Defs.end()) 328 PhysRegOpers.DeadDefs.erase(&PhysRegOpers.DeadDefs[i-1]); 329 } 330} 331 332/// Add PhysReg to the live in set and increase max pressure. 333void RegPressureTracker::discoverPhysLiveIn(unsigned Reg) { 334 assert(!LivePhysRegs.count(Reg) && "avoid bumping max pressure twice"); 335 if (findRegAlias(Reg, P.LiveInRegs, TRI) == P.LiveInRegs.end()) 336 return; 337 338 // At live in discovery, unconditionally increase the high water mark. 339 P.LiveInRegs.push_back(Reg); 340 P.increase(TRI->getMinimalPhysRegClass(Reg), TRI); 341} 342 343/// Add PhysReg to the live out set and increase max pressure. 344void RegPressureTracker::discoverPhysLiveOut(unsigned Reg) { 345 assert(!LivePhysRegs.count(Reg) && "avoid bumping max pressure twice"); 346 if (findRegAlias(Reg, P.LiveOutRegs, TRI) == P.LiveOutRegs.end()) 347 return; 348 349 // At live out discovery, unconditionally increase the high water mark. 350 P.LiveOutRegs.push_back(Reg); 351 P.increase(TRI->getMinimalPhysRegClass(Reg), TRI); 352} 353 354/// Add VirtReg to the live in set and increase max pressure. 355void RegPressureTracker::discoverVirtLiveIn(unsigned Reg) { 356 assert(!LiveVirtRegs.count(Reg) && "avoid bumping max pressure twice"); 357 if (std::find(P.LiveInRegs.begin(), P.LiveInRegs.end(), Reg) != 358 P.LiveInRegs.end()) 359 return; 360 361 // At live in discovery, unconditionally increase the high water mark. 362 P.LiveInRegs.push_back(Reg); 363 P.increase(MRI->getRegClass(Reg), TRI); 364} 365 366/// Add VirtReg to the live out set and increase max pressure. 367void RegPressureTracker::discoverVirtLiveOut(unsigned Reg) { 368 assert(!LiveVirtRegs.count(Reg) && "avoid bumping max pressure twice"); 369 if (std::find(P.LiveOutRegs.begin(), P.LiveOutRegs.end(), Reg) != 370 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(MRI->getRegClass(Reg), TRI); 376} 377 378/// Recede across the previous instruction. 379bool RegPressureTracker::recede() { 380 // Check for the top of the analyzable region. 381 if (CurrPos == MBB->begin()) { 382 closeRegion(); 383 return false; 384 } 385 if (!isBottomClosed()) 386 closeBottom(); 387 388 // Open the top of the region using block iterators. 389 if (!RequireIntervals && isTopClosed()) 390 static_cast<RegionPressure&>(P).openTop(CurrPos); 391 392 // Find the previous instruction. 393 while (--CurrPos != MBB->begin() && CurrPos->isDebugValue()); 394 395 if (CurrPos->isDebugValue()) { 396 closeRegion(); 397 return false; 398 } 399 SlotIndex SlotIdx; 400 if (RequireIntervals) 401 SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot(); 402 403 // Open the top of the region using slot indexes. 404 if (RequireIntervals && isTopClosed()) 405 static_cast<IntervalPressure&>(P).openTop(SlotIdx); 406 407 PhysRegOperands PhysRegOpers; 408 VirtRegOperands VirtRegOpers; 409 collectOperands(CurrPos, PhysRegOpers, VirtRegOpers, TRI, RCI); 410 411 // Boost pressure for all dead defs together. 412 for (unsigned i = 0; i < PhysRegOpers.DeadDefs.size(); ++i) 413 increasePhysRegPressure(PhysRegOpers.DeadDefs[i]); 414 for (unsigned i = 0; i < VirtRegOpers.DeadDefs.size(); ++i) 415 increaseVirtRegPressure(VirtRegOpers.DeadDefs[i]); 416 for (unsigned i = 0; i < PhysRegOpers.DeadDefs.size(); ++i) 417 decreasePhysRegPressure(PhysRegOpers.DeadDefs[i]); 418 for (unsigned i = 0; i < VirtRegOpers.DeadDefs.size(); ++i) 419 decreaseVirtRegPressure(VirtRegOpers.DeadDefs[i]); 420 421 // Kill liveness at live defs. 422 // TODO: consider earlyclobbers? 423 for (unsigned i = 0; i < PhysRegOpers.Defs.size(); ++i) { 424 unsigned Reg = PhysRegOpers.Defs[i]; 425 if (LivePhysRegs.erase(Reg)) 426 decreasePhysRegPressure(Reg); 427 else 428 discoverPhysLiveOut(Reg); 429 } 430 for (unsigned i = 0; i < VirtRegOpers.Defs.size(); ++i) { 431 unsigned Reg = VirtRegOpers.Defs[i]; 432 if (LiveVirtRegs.erase(Reg)) 433 decreaseVirtRegPressure(Reg); 434 else 435 discoverVirtLiveOut(Reg); 436 } 437 438 // Generate liveness for uses. 439 for (unsigned i = 0; i < PhysRegOpers.Uses.size(); ++i) { 440 unsigned Reg = PhysRegOpers.Uses[i]; 441 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) { 442 increasePhysRegPressure(Reg); 443 LivePhysRegs.insert(Reg); 444 } 445 } 446 for (unsigned i = 0; i < VirtRegOpers.Uses.size(); ++i) { 447 unsigned Reg = VirtRegOpers.Uses[i]; 448 if (!LiveVirtRegs.count(Reg)) { 449 // Adjust liveouts if LiveIntervals are available. 450 if (RequireIntervals) { 451 const LiveInterval *LI = &LIS->getInterval(Reg); 452 if (!LI->killedAt(SlotIdx)) 453 discoverVirtLiveOut(Reg); 454 } 455 increaseVirtRegPressure(Reg); 456 LiveVirtRegs.insert(Reg); 457 } 458 } 459 return true; 460} 461 462/// Advance across the current instruction. 463bool RegPressureTracker::advance() { 464 // Check for the bottom of the analyzable region. 465 if (CurrPos == MBB->end()) { 466 closeRegion(); 467 return false; 468 } 469 if (!isTopClosed()) 470 closeTop(); 471 472 SlotIndex SlotIdx; 473 if (RequireIntervals) 474 SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot(); 475 476 // Open the bottom of the region using slot indexes. 477 if (isBottomClosed()) { 478 if (RequireIntervals) 479 static_cast<IntervalPressure&>(P).openBottom(SlotIdx); 480 else 481 static_cast<RegionPressure&>(P).openBottom(CurrPos); 482 } 483 484 PhysRegOperands PhysRegOpers; 485 VirtRegOperands VirtRegOpers; 486 collectOperands(CurrPos, PhysRegOpers, VirtRegOpers, TRI, RCI); 487 488 // Kill liveness at last uses. 489 for (unsigned i = 0; i < PhysRegOpers.Uses.size(); ++i) { 490 unsigned Reg = PhysRegOpers.Uses[i]; 491 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) 492 discoverPhysLiveIn(Reg); 493 else { 494 // Allocatable physregs are always single-use before regalloc. 495 decreasePhysRegPressure(Reg); 496 LivePhysRegs.erase(Reg); 497 } 498 } 499 for (unsigned i = 0; i < VirtRegOpers.Uses.size(); ++i) { 500 unsigned Reg = VirtRegOpers.Uses[i]; 501 if (RequireIntervals) { 502 const LiveInterval *LI = &LIS->getInterval(Reg); 503 if (LI->killedAt(SlotIdx)) { 504 if (LiveVirtRegs.erase(Reg)) 505 decreaseVirtRegPressure(Reg); 506 else 507 discoverVirtLiveIn(Reg); 508 } 509 } 510 else if (!LiveVirtRegs.count(Reg)) { 511 discoverVirtLiveIn(Reg); 512 increaseVirtRegPressure(Reg); 513 } 514 } 515 516 // Generate liveness for defs. 517 for (unsigned i = 0; i < PhysRegOpers.Defs.size(); ++i) { 518 unsigned Reg = PhysRegOpers.Defs[i]; 519 if (!hasRegAlias(Reg, LivePhysRegs, TRI)) { 520 increasePhysRegPressure(Reg); 521 LivePhysRegs.insert(Reg); 522 } 523 } 524 for (unsigned i = 0; i < VirtRegOpers.Defs.size(); ++i) { 525 unsigned Reg = VirtRegOpers.Defs[i]; 526 if (LiveVirtRegs.insert(Reg).second) 527 increaseVirtRegPressure(Reg); 528 } 529 530 // Boost pressure for all dead defs together. 531 for (unsigned i = 0; i < PhysRegOpers.DeadDefs.size(); ++i) 532 increasePhysRegPressure(PhysRegOpers.DeadDefs[i]); 533 for (unsigned i = 0; i < VirtRegOpers.DeadDefs.size(); ++i) 534 increaseVirtRegPressure(VirtRegOpers.DeadDefs[i]); 535 for (unsigned i = 0; i < PhysRegOpers.DeadDefs.size(); ++i) 536 decreasePhysRegPressure(PhysRegOpers.DeadDefs[i]); 537 for (unsigned i = 0; i < VirtRegOpers.DeadDefs.size(); ++i) 538 decreaseVirtRegPressure(VirtRegOpers.DeadDefs[i]); 539 540 // Find the next instruction. 541 while (++CurrPos != MBB->end() && CurrPos->isDebugValue()); 542 return true; 543} 544