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