1 //===-- RegAllocBasic.cpp - basic register allocator ----------------------===// 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 defines the RABasic function pass, which provides a minimal 11 // implementation of the basic register allocator. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #define DEBUG_TYPE "regalloc" 16 #include "LiveIntervalUnion.h" 17 #include "RegAllocBase.h" 18 #include "RenderMachineFunction.h" 19 #include "Spiller.h" 20 #include "VirtRegMap.h" 21 #include "VirtRegRewriter.h" 22 #include "llvm/ADT/OwningPtr.h" 23 #include "llvm/Analysis/AliasAnalysis.h" 24 #include "llvm/Function.h" 25 #include "llvm/PassAnalysisSupport.h" 26 #include "llvm/CodeGen/CalcSpillWeights.h" 27 #include "llvm/CodeGen/LiveIntervalAnalysis.h" 28 #include "llvm/CodeGen/LiveStackAnalysis.h" 29 #include "llvm/CodeGen/MachineFunctionPass.h" 30 #include "llvm/CodeGen/MachineInstr.h" 31 #include "llvm/CodeGen/MachineLoopInfo.h" 32 #include "llvm/CodeGen/MachineRegisterInfo.h" 33 #include "llvm/CodeGen/Passes.h" 34 #include "llvm/CodeGen/RegAllocRegistry.h" 35 #include "llvm/CodeGen/RegisterCoalescer.h" 36 #include "llvm/Target/TargetMachine.h" 37 #include "llvm/Target/TargetOptions.h" 38 #include "llvm/Target/TargetRegisterInfo.h" 39 #ifndef NDEBUG 40 #include "llvm/ADT/SparseBitVector.h" 41 #endif 42 #include "llvm/Support/Debug.h" 43 #include "llvm/Support/ErrorHandling.h" 44 #include "llvm/Support/raw_ostream.h" 45 #include "llvm/Support/Timer.h" 46 47 #include <cstdlib> 48 49 using namespace llvm; 50 51 static RegisterRegAlloc basicRegAlloc("basic", "basic register allocator", 52 createBasicRegisterAllocator); 53 54 // Temporary verification option until we can put verification inside 55 // MachineVerifier. 56 static cl::opt<bool> 57 VerifyRegAlloc("verify-regalloc", 58 cl::desc("Verify live intervals before renaming")); 59 60 const char *RegAllocBase::TimerGroupName = "Register Allocation"; 61 62 namespace { 63 64 class PhysicalRegisterDescription : public AbstractRegisterDescription { 65 const TargetRegisterInfo *TRI; 66 public: 67 PhysicalRegisterDescription(const TargetRegisterInfo *T): TRI(T) {} 68 virtual const char *getName(unsigned Reg) const { return TRI->getName(Reg); } 69 }; 70 71 /// RABasic provides a minimal implementation of the basic register allocation 72 /// algorithm. It prioritizes live virtual registers by spill weight and spills 73 /// whenever a register is unavailable. This is not practical in production but 74 /// provides a useful baseline both for measuring other allocators and comparing 75 /// the speed of the basic algorithm against other styles of allocators. 76 class RABasic : public MachineFunctionPass, public RegAllocBase 77 { 78 // context 79 MachineFunction *MF; 80 BitVector ReservedRegs; 81 82 // analyses 83 LiveStacks *LS; 84 RenderMachineFunction *RMF; 85 86 // state 87 std::auto_ptr<Spiller> SpillerInstance; 88 89 public: 90 RABasic(); 91 92 /// Return the pass name. 93 virtual const char* getPassName() const { 94 return "Basic Register Allocator"; 95 } 96 97 /// RABasic analysis usage. 98 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 99 100 virtual void releaseMemory(); 101 102 virtual Spiller &spiller() { return *SpillerInstance; } 103 104 virtual float getPriority(LiveInterval *LI) { return LI->weight; } 105 106 virtual unsigned selectOrSplit(LiveInterval &VirtReg, 107 SmallVectorImpl<LiveInterval*> &SplitVRegs); 108 109 /// Perform register allocation. 110 virtual bool runOnMachineFunction(MachineFunction &mf); 111 112 static char ID; 113 }; 114 115 char RABasic::ID = 0; 116 117 } // end anonymous namespace 118 119 RABasic::RABasic(): MachineFunctionPass(ID) { 120 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 121 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 122 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry()); 123 initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); 124 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); 125 initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 126 initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); 127 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); 128 initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); 129 initializeRenderMachineFunctionPass(*PassRegistry::getPassRegistry()); 130 } 131 132 void RABasic::getAnalysisUsage(AnalysisUsage &AU) const { 133 AU.setPreservesCFG(); 134 AU.addRequired<AliasAnalysis>(); 135 AU.addPreserved<AliasAnalysis>(); 136 AU.addRequired<LiveIntervals>(); 137 AU.addPreserved<SlotIndexes>(); 138 if (StrongPHIElim) 139 AU.addRequiredID(StrongPHIEliminationID); 140 AU.addRequiredTransitive<RegisterCoalescer>(); 141 AU.addRequired<CalculateSpillWeights>(); 142 AU.addRequired<LiveStacks>(); 143 AU.addPreserved<LiveStacks>(); 144 AU.addRequiredID(MachineDominatorsID); 145 AU.addPreservedID(MachineDominatorsID); 146 AU.addRequired<MachineLoopInfo>(); 147 AU.addPreserved<MachineLoopInfo>(); 148 AU.addRequired<VirtRegMap>(); 149 AU.addPreserved<VirtRegMap>(); 150 DEBUG(AU.addRequired<RenderMachineFunction>()); 151 MachineFunctionPass::getAnalysisUsage(AU); 152 } 153 154 void RABasic::releaseMemory() { 155 SpillerInstance.reset(0); 156 RegAllocBase::releaseMemory(); 157 } 158 159 #ifndef NDEBUG 160 // Verify each LiveIntervalUnion. 161 void RegAllocBase::verify() { 162 LiveVirtRegBitSet VisitedVRegs; 163 OwningArrayPtr<LiveVirtRegBitSet> 164 unionVRegs(new LiveVirtRegBitSet[PhysReg2LiveUnion.numRegs()]); 165 166 // Verify disjoint unions. 167 for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { 168 DEBUG(PhysicalRegisterDescription PRD(TRI); 169 PhysReg2LiveUnion[PhysReg].dump(&PRD)); 170 LiveVirtRegBitSet &VRegs = unionVRegs[PhysReg]; 171 PhysReg2LiveUnion[PhysReg].verify(VRegs); 172 // Union + intersection test could be done efficiently in one pass, but 173 // don't add a method to SparseBitVector unless we really need it. 174 assert(!VisitedVRegs.intersects(VRegs) && "vreg in multiple unions"); 175 VisitedVRegs |= VRegs; 176 } 177 178 // Verify vreg coverage. 179 for (LiveIntervals::iterator liItr = LIS->begin(), liEnd = LIS->end(); 180 liItr != liEnd; ++liItr) { 181 unsigned reg = liItr->first; 182 if (TargetRegisterInfo::isPhysicalRegister(reg)) continue; 183 if (!VRM->hasPhys(reg)) continue; // spilled? 184 unsigned PhysReg = VRM->getPhys(reg); 185 if (!unionVRegs[PhysReg].test(reg)) { 186 dbgs() << "LiveVirtReg " << reg << " not in union " << 187 TRI->getName(PhysReg) << "\n"; 188 llvm_unreachable("unallocated live vreg"); 189 } 190 } 191 // FIXME: I'm not sure how to verify spilled intervals. 192 } 193 #endif //!NDEBUG 194 195 //===----------------------------------------------------------------------===// 196 // RegAllocBase Implementation 197 //===----------------------------------------------------------------------===// 198 199 // Instantiate a LiveIntervalUnion for each physical register. 200 void RegAllocBase::LiveUnionArray::init(LiveIntervalUnion::Allocator &allocator, 201 unsigned NRegs) { 202 NumRegs = NRegs; 203 Array = 204 static_cast<LiveIntervalUnion*>(malloc(sizeof(LiveIntervalUnion)*NRegs)); 205 for (unsigned r = 0; r != NRegs; ++r) 206 new(Array + r) LiveIntervalUnion(r, allocator); 207 } 208 209 void RegAllocBase::init(VirtRegMap &vrm, LiveIntervals &lis) { 210 NamedRegionTimer T("Initialize", TimerGroupName, TimePassesIsEnabled); 211 TRI = &vrm.getTargetRegInfo(); 212 MRI = &vrm.getRegInfo(); 213 VRM = &vrm; 214 LIS = &lis; 215 PhysReg2LiveUnion.init(UnionAllocator, TRI->getNumRegs()); 216 // Cache an interferece query for each physical reg 217 Queries.reset(new LiveIntervalUnion::Query[PhysReg2LiveUnion.numRegs()]); 218 } 219 220 void RegAllocBase::LiveUnionArray::clear() { 221 if (!Array) 222 return; 223 for (unsigned r = 0; r != NumRegs; ++r) 224 Array[r].~LiveIntervalUnion(); 225 free(Array); 226 NumRegs = 0; 227 Array = 0; 228 } 229 230 void RegAllocBase::releaseMemory() { 231 PhysReg2LiveUnion.clear(); 232 } 233 234 // Visit all the live virtual registers. If they are already assigned to a 235 // physical register, unify them with the corresponding LiveIntervalUnion, 236 // otherwise push them on the priority queue for later assignment. 237 void RegAllocBase:: 238 seedLiveVirtRegs(std::priority_queue<std::pair<float, unsigned> > &VirtRegQ) { 239 for (LiveIntervals::iterator I = LIS->begin(), E = LIS->end(); I != E; ++I) { 240 unsigned RegNum = I->first; 241 LiveInterval &VirtReg = *I->second; 242 if (TargetRegisterInfo::isPhysicalRegister(RegNum)) 243 PhysReg2LiveUnion[RegNum].unify(VirtReg); 244 else 245 VirtRegQ.push(std::make_pair(getPriority(&VirtReg), RegNum)); 246 } 247 } 248 249 // Top-level driver to manage the queue of unassigned VirtRegs and call the 250 // selectOrSplit implementation. 251 void RegAllocBase::allocatePhysRegs() { 252 253 // Push each vreg onto a queue or "precolor" by adding it to a physreg union. 254 std::priority_queue<std::pair<float, unsigned> > VirtRegQ; 255 seedLiveVirtRegs(VirtRegQ); 256 257 // Continue assigning vregs one at a time to available physical registers. 258 while (!VirtRegQ.empty()) { 259 // Pop the highest priority vreg. 260 LiveInterval &VirtReg = LIS->getInterval(VirtRegQ.top().second); 261 VirtRegQ.pop(); 262 263 // selectOrSplit requests the allocator to return an available physical 264 // register if possible and populate a list of new live intervals that 265 // result from splitting. 266 DEBUG(dbgs() << "\nselectOrSplit " << MRI->getRegClass(VirtReg.reg)->getName() 267 << ':' << VirtReg << '\n'); 268 typedef SmallVector<LiveInterval*, 4> VirtRegVec; 269 VirtRegVec SplitVRegs; 270 unsigned AvailablePhysReg = selectOrSplit(VirtReg, SplitVRegs); 271 272 if (AvailablePhysReg) { 273 DEBUG(dbgs() << "allocating: " << TRI->getName(AvailablePhysReg) 274 << " for " << VirtReg << '\n'); 275 assert(!VRM->hasPhys(VirtReg.reg) && "duplicate vreg in union"); 276 VRM->assignVirt2Phys(VirtReg.reg, AvailablePhysReg); 277 PhysReg2LiveUnion[AvailablePhysReg].unify(VirtReg); 278 } 279 for (VirtRegVec::iterator I = SplitVRegs.begin(), E = SplitVRegs.end(); 280 I != E; ++I) { 281 LiveInterval* SplitVirtReg = *I; 282 if (SplitVirtReg->empty()) continue; 283 DEBUG(dbgs() << "queuing new interval: " << *SplitVirtReg << "\n"); 284 assert(TargetRegisterInfo::isVirtualRegister(SplitVirtReg->reg) && 285 "expect split value in virtual register"); 286 VirtRegQ.push(std::make_pair(getPriority(SplitVirtReg), 287 SplitVirtReg->reg)); 288 } 289 } 290 } 291 292 // Check if this live virtual register interferes with a physical register. If 293 // not, then check for interference on each register that aliases with the 294 // physical register. Return the interfering register. 295 unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &VirtReg, 296 unsigned PhysReg) { 297 if (query(VirtReg, PhysReg).checkInterference()) 298 return PhysReg; 299 for (const unsigned *AliasI = TRI->getAliasSet(PhysReg); *AliasI; ++AliasI) { 300 if (query(VirtReg, *AliasI).checkInterference()) 301 return *AliasI; 302 } 303 return 0; 304 } 305 306 // Helper for spillInteferences() that spills all interfering vregs currently 307 // assigned to this physical register. 308 void RegAllocBase::spillReg(LiveInterval& VirtReg, unsigned PhysReg, 309 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 310 LiveIntervalUnion::Query &Q = query(VirtReg, PhysReg); 311 assert(Q.seenAllInterferences() && "need collectInterferences()"); 312 const SmallVectorImpl<LiveInterval*> &PendingSpills = Q.interferingVRegs(); 313 314 for (SmallVectorImpl<LiveInterval*>::const_iterator I = PendingSpills.begin(), 315 E = PendingSpills.end(); I != E; ++I) { 316 LiveInterval &SpilledVReg = **I; 317 DEBUG(dbgs() << "extracting from " << 318 TRI->getName(PhysReg) << " " << SpilledVReg << '\n'); 319 320 // Deallocate the interfering vreg by removing it from the union. 321 // A LiveInterval instance may not be in a union during modification! 322 PhysReg2LiveUnion[PhysReg].extract(SpilledVReg); 323 324 // Clear the vreg assignment. 325 VRM->clearVirt(SpilledVReg.reg); 326 327 // Spill the extracted interval. 328 spiller().spill(&SpilledVReg, SplitVRegs, PendingSpills); 329 } 330 // After extracting segments, the query's results are invalid. But keep the 331 // contents valid until we're done accessing pendingSpills. 332 Q.clear(); 333 } 334 335 // Spill or split all live virtual registers currently unified under PhysReg 336 // that interfere with VirtReg. The newly spilled or split live intervals are 337 // returned by appending them to SplitVRegs. 338 bool 339 RegAllocBase::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg, 340 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 341 // Record each interference and determine if all are spillable before mutating 342 // either the union or live intervals. 343 344 // Collect interferences assigned to the requested physical register. 345 LiveIntervalUnion::Query &QPreg = query(VirtReg, PhysReg); 346 unsigned NumInterferences = QPreg.collectInterferingVRegs(); 347 if (QPreg.seenUnspillableVReg()) { 348 return false; 349 } 350 // Collect interferences assigned to any alias of the physical register. 351 for (const unsigned *asI = TRI->getAliasSet(PhysReg); *asI; ++asI) { 352 LiveIntervalUnion::Query &QAlias = query(VirtReg, *asI); 353 NumInterferences += QAlias.collectInterferingVRegs(); 354 if (QAlias.seenUnspillableVReg()) { 355 return false; 356 } 357 } 358 DEBUG(dbgs() << "spilling " << TRI->getName(PhysReg) << 359 " interferences with " << VirtReg << "\n"); 360 assert(NumInterferences > 0 && "expect interference"); 361 362 // Spill each interfering vreg allocated to PhysReg or an alias. 363 spillReg(VirtReg, PhysReg, SplitVRegs); 364 for (const unsigned *AliasI = TRI->getAliasSet(PhysReg); *AliasI; ++AliasI) 365 spillReg(VirtReg, *AliasI, SplitVRegs); 366 return true; 367 } 368 369 // Add newly allocated physical registers to the MBB live in sets. 370 void RegAllocBase::addMBBLiveIns(MachineFunction *MF) { 371 NamedRegionTimer T("MBB Live Ins", TimerGroupName, TimePassesIsEnabled); 372 typedef SmallVector<MachineBasicBlock*, 8> MBBVec; 373 MBBVec liveInMBBs; 374 MachineBasicBlock &entryMBB = *MF->begin(); 375 376 for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { 377 LiveIntervalUnion &LiveUnion = PhysReg2LiveUnion[PhysReg]; 378 if (LiveUnion.empty()) 379 continue; 380 for (LiveIntervalUnion::SegmentIter SI = LiveUnion.begin(); SI.valid(); 381 ++SI) { 382 383 // Find the set of basic blocks which this range is live into... 384 liveInMBBs.clear(); 385 if (!LIS->findLiveInMBBs(SI.start(), SI.stop(), liveInMBBs)) continue; 386 387 // And add the physreg for this interval to their live-in sets. 388 for (MBBVec::iterator I = liveInMBBs.begin(), E = liveInMBBs.end(); 389 I != E; ++I) { 390 MachineBasicBlock *MBB = *I; 391 if (MBB == &entryMBB) continue; 392 if (MBB->isLiveIn(PhysReg)) continue; 393 MBB->addLiveIn(PhysReg); 394 } 395 } 396 } 397 } 398 399 400 //===----------------------------------------------------------------------===// 401 // RABasic Implementation 402 //===----------------------------------------------------------------------===// 403 404 // Driver for the register assignment and splitting heuristics. 405 // Manages iteration over the LiveIntervalUnions. 406 // 407 // This is a minimal implementation of register assignment and splitting that 408 // spills whenever we run out of registers. 409 // 410 // selectOrSplit can only be called once per live virtual register. We then do a 411 // single interference test for each register the correct class until we find an 412 // available register. So, the number of interference tests in the worst case is 413 // |vregs| * |machineregs|. And since the number of interference tests is 414 // minimal, there is no value in caching them outside the scope of 415 // selectOrSplit(). 416 unsigned RABasic::selectOrSplit(LiveInterval &VirtReg, 417 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 418 // Populate a list of physical register spill candidates. 419 SmallVector<unsigned, 8> PhysRegSpillCands; 420 421 // Check for an available register in this class. 422 const TargetRegisterClass *TRC = MRI->getRegClass(VirtReg.reg); 423 424 for (TargetRegisterClass::iterator I = TRC->allocation_order_begin(*MF), 425 E = TRC->allocation_order_end(*MF); 426 I != E; ++I) { 427 428 unsigned PhysReg = *I; 429 if (ReservedRegs.test(PhysReg)) continue; 430 431 // Check interference and as a side effect, intialize queries for this 432 // VirtReg and its aliases. 433 unsigned interfReg = checkPhysRegInterference(VirtReg, PhysReg); 434 if (interfReg == 0) { 435 // Found an available register. 436 return PhysReg; 437 } 438 LiveInterval *interferingVirtReg = 439 Queries[interfReg].firstInterference().liveUnionPos().value(); 440 441 // The current VirtReg must either be spillable, or one of its interferences 442 // must have less spill weight. 443 if (interferingVirtReg->weight < VirtReg.weight ) { 444 PhysRegSpillCands.push_back(PhysReg); 445 } 446 } 447 // Try to spill another interfering reg with less spill weight. 448 for (SmallVectorImpl<unsigned>::iterator PhysRegI = PhysRegSpillCands.begin(), 449 PhysRegE = PhysRegSpillCands.end(); PhysRegI != PhysRegE; ++PhysRegI) { 450 451 if (!spillInterferences(VirtReg, *PhysRegI, SplitVRegs)) continue; 452 453 assert(checkPhysRegInterference(VirtReg, *PhysRegI) == 0 && 454 "Interference after spill."); 455 // Tell the caller to allocate to this newly freed physical register. 456 return *PhysRegI; 457 } 458 // No other spill candidates were found, so spill the current VirtReg. 459 DEBUG(dbgs() << "spilling: " << VirtReg << '\n'); 460 SmallVector<LiveInterval*, 1> pendingSpills; 461 462 spiller().spill(&VirtReg, SplitVRegs, pendingSpills); 463 464 // The live virtual register requesting allocation was spilled, so tell 465 // the caller not to allocate anything during this round. 466 return 0; 467 } 468 469 bool RABasic::runOnMachineFunction(MachineFunction &mf) { 470 DEBUG(dbgs() << "********** BASIC REGISTER ALLOCATION **********\n" 471 << "********** Function: " 472 << ((Value*)mf.getFunction())->getName() << '\n'); 473 474 MF = &mf; 475 DEBUG(RMF = &getAnalysis<RenderMachineFunction>()); 476 477 RegAllocBase::init(getAnalysis<VirtRegMap>(), getAnalysis<LiveIntervals>()); 478 479 ReservedRegs = TRI->getReservedRegs(*MF); 480 481 SpillerInstance.reset(createSpiller(*this, *MF, *VRM)); 482 483 allocatePhysRegs(); 484 485 addMBBLiveIns(MF); 486 487 // Diagnostic output before rewriting 488 DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *VRM << "\n"); 489 490 // optional HTML output 491 DEBUG(RMF->renderMachineFunction("After basic register allocation.", VRM)); 492 493 // FIXME: Verification currently must run before VirtRegRewriter. We should 494 // make the rewriter a separate pass and override verifyAnalysis instead. When 495 // that happens, verification naturally falls under VerifyMachineCode. 496 #ifndef NDEBUG 497 if (VerifyRegAlloc) { 498 // Verify accuracy of LiveIntervals. The standard machine code verifier 499 // ensures that each LiveIntervals covers all uses of the virtual reg. 500 501 // FIXME: MachineVerifier is badly broken when using the standard 502 // spiller. Always use -spiller=inline with -verify-regalloc. Even with the 503 // inline spiller, some tests fail to verify because the coalescer does not 504 // always generate verifiable code. 505 MF->verify(this); 506 507 // Verify that LiveIntervals are partitioned into unions and disjoint within 508 // the unions. 509 verify(); 510 } 511 #endif // !NDEBUG 512 513 // Run rewriter 514 std::auto_ptr<VirtRegRewriter> rewriter(createVirtRegRewriter()); 515 rewriter->runOnMachineFunction(*MF, *VRM, LIS); 516 517 // The pass output is in VirtRegMap. Release all the transient data. 518 releaseMemory(); 519 520 return true; 521 } 522 523 FunctionPass* llvm::createBasicRegisterAllocator() 524 { 525 return new RABasic(); 526 } 527