RegAllocGreedy.cpp revision 770d42de3b7643b2b4f835f32e3a16275b9fbdba
1//===-- RegAllocGreedy.cpp - greedy 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 RAGreedy function pass for register allocation in 11// optimized builds. 12// 13//===----------------------------------------------------------------------===// 14 15#define DEBUG_TYPE "regalloc" 16#include "AllocationOrder.h" 17#include "LiveIntervalUnion.h" 18#include "LiveRangeEdit.h" 19#include "RegAllocBase.h" 20#include "Spiller.h" 21#include "SplitKit.h" 22#include "VirtRegMap.h" 23#include "VirtRegRewriter.h" 24#include "llvm/Analysis/AliasAnalysis.h" 25#include "llvm/Function.h" 26#include "llvm/PassAnalysisSupport.h" 27#include "llvm/CodeGen/CalcSpillWeights.h" 28#include "llvm/CodeGen/LiveIntervalAnalysis.h" 29#include "llvm/CodeGen/LiveStackAnalysis.h" 30#include "llvm/CodeGen/MachineDominators.h" 31#include "llvm/CodeGen/MachineFunctionPass.h" 32#include "llvm/CodeGen/MachineLoopInfo.h" 33#include "llvm/CodeGen/MachineLoopRanges.h" 34#include "llvm/CodeGen/MachineRegisterInfo.h" 35#include "llvm/CodeGen/Passes.h" 36#include "llvm/CodeGen/RegAllocRegistry.h" 37#include "llvm/CodeGen/RegisterCoalescer.h" 38#include "llvm/Target/TargetOptions.h" 39#include "llvm/Support/Debug.h" 40#include "llvm/Support/ErrorHandling.h" 41#include "llvm/Support/raw_ostream.h" 42#include "llvm/Support/Timer.h" 43 44using namespace llvm; 45 46static RegisterRegAlloc greedyRegAlloc("greedy", "greedy register allocator", 47 createGreedyRegisterAllocator); 48 49namespace { 50class RAGreedy : public MachineFunctionPass, public RegAllocBase { 51 // context 52 MachineFunction *MF; 53 BitVector ReservedRegs; 54 55 // analyses 56 LiveStacks *LS; 57 MachineDominatorTree *DomTree; 58 MachineLoopInfo *Loops; 59 MachineLoopRanges *LoopRanges; 60 61 // state 62 std::auto_ptr<Spiller> SpillerInstance; 63 std::auto_ptr<SplitAnalysis> SA; 64 65public: 66 RAGreedy(); 67 68 /// Return the pass name. 69 virtual const char* getPassName() const { 70 return "Greedy Register Allocator"; 71 } 72 73 /// RAGreedy analysis usage. 74 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 75 76 virtual void releaseMemory(); 77 78 virtual Spiller &spiller() { return *SpillerInstance; } 79 80 virtual float getPriority(LiveInterval *LI); 81 82 virtual unsigned selectOrSplit(LiveInterval &VirtReg, 83 SmallVectorImpl<LiveInterval*> &SplitVRegs); 84 85 /// Perform register allocation. 86 virtual bool runOnMachineFunction(MachineFunction &mf); 87 88 static char ID; 89 90private: 91 bool checkUncachedInterference(LiveInterval&, unsigned); 92 LiveInterval *getSingleInterference(LiveInterval&, unsigned); 93 bool reassignVReg(LiveInterval &InterferingVReg, unsigned OldPhysReg); 94 bool reassignInterferences(LiveInterval &VirtReg, unsigned PhysReg); 95 unsigned findInterferenceFreeReg(MachineLoopRange*, 96 LiveInterval&, AllocationOrder&); 97 float calcInterferenceWeight(LiveInterval&, unsigned); 98 99 unsigned tryReassign(LiveInterval&, AllocationOrder&); 100 unsigned trySplit(LiveInterval&, AllocationOrder&, 101 SmallVectorImpl<LiveInterval*>&); 102 unsigned trySpillInterferences(LiveInterval&, AllocationOrder&, 103 SmallVectorImpl<LiveInterval*>&); 104}; 105} // end anonymous namespace 106 107char RAGreedy::ID = 0; 108 109FunctionPass* llvm::createGreedyRegisterAllocator() { 110 return new RAGreedy(); 111} 112 113RAGreedy::RAGreedy(): MachineFunctionPass(ID) { 114 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 115 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 116 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry()); 117 initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); 118 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); 119 initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 120 initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); 121 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); 122 initializeMachineLoopRangesPass(*PassRegistry::getPassRegistry()); 123 initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); 124} 125 126void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const { 127 AU.setPreservesCFG(); 128 AU.addRequired<AliasAnalysis>(); 129 AU.addPreserved<AliasAnalysis>(); 130 AU.addRequired<LiveIntervals>(); 131 AU.addPreserved<SlotIndexes>(); 132 if (StrongPHIElim) 133 AU.addRequiredID(StrongPHIEliminationID); 134 AU.addRequiredTransitive<RegisterCoalescer>(); 135 AU.addRequired<CalculateSpillWeights>(); 136 AU.addRequired<LiveStacks>(); 137 AU.addPreserved<LiveStacks>(); 138 AU.addRequired<MachineDominatorTree>(); 139 AU.addPreserved<MachineDominatorTree>(); 140 AU.addRequired<MachineLoopInfo>(); 141 AU.addPreserved<MachineLoopInfo>(); 142 AU.addRequired<MachineLoopRanges>(); 143 AU.addPreserved<MachineLoopRanges>(); 144 AU.addRequired<VirtRegMap>(); 145 AU.addPreserved<VirtRegMap>(); 146 MachineFunctionPass::getAnalysisUsage(AU); 147} 148 149void RAGreedy::releaseMemory() { 150 SpillerInstance.reset(0); 151 RegAllocBase::releaseMemory(); 152} 153 154float RAGreedy::getPriority(LiveInterval *LI) { 155 float Priority = LI->weight; 156 157 // Prioritize hinted registers so they are allocated first. 158 std::pair<unsigned, unsigned> Hint; 159 if (Hint.first || Hint.second) { 160 // The hint can be target specific, a virtual register, or a physreg. 161 Priority *= 2; 162 163 // Prefer physreg hints above anything else. 164 if (Hint.first == 0 && TargetRegisterInfo::isPhysicalRegister(Hint.second)) 165 Priority *= 2; 166 } 167 return Priority; 168} 169 170 171//===----------------------------------------------------------------------===// 172// Register Reassignment 173//===----------------------------------------------------------------------===// 174 175// Check interference without using the cache. 176bool RAGreedy::checkUncachedInterference(LiveInterval &VirtReg, 177 unsigned PhysReg) { 178 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) { 179 LiveIntervalUnion::Query subQ(&VirtReg, &PhysReg2LiveUnion[*AliasI]); 180 if (subQ.checkInterference()) 181 return true; 182 } 183 return false; 184} 185 186/// getSingleInterference - Return the single interfering virtual register 187/// assigned to PhysReg. Return 0 if more than one virtual register is 188/// interfering. 189LiveInterval *RAGreedy::getSingleInterference(LiveInterval &VirtReg, 190 unsigned PhysReg) { 191 // Check physreg and aliases. 192 LiveInterval *Interference = 0; 193 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) { 194 LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI); 195 if (Q.checkInterference()) { 196 if (Interference) 197 return 0; 198 Q.collectInterferingVRegs(1); 199 if (!Q.seenAllInterferences()) 200 return 0; 201 Interference = Q.interferingVRegs().front(); 202 } 203 } 204 return Interference; 205} 206 207// Attempt to reassign this virtual register to a different physical register. 208// 209// FIXME: we are not yet caching these "second-level" interferences discovered 210// in the sub-queries. These interferences can change with each call to 211// selectOrSplit. However, we could implement a "may-interfere" cache that 212// could be conservatively dirtied when we reassign or split. 213// 214// FIXME: This may result in a lot of alias queries. We could summarize alias 215// live intervals in their parent register's live union, but it's messy. 216bool RAGreedy::reassignVReg(LiveInterval &InterferingVReg, 217 unsigned WantedPhysReg) { 218 assert(TargetRegisterInfo::isVirtualRegister(InterferingVReg.reg) && 219 "Can only reassign virtual registers"); 220 assert(TRI->regsOverlap(WantedPhysReg, VRM->getPhys(InterferingVReg.reg)) && 221 "inconsistent phys reg assigment"); 222 223 AllocationOrder Order(InterferingVReg.reg, *VRM, ReservedRegs); 224 while (unsigned PhysReg = Order.next()) { 225 // Don't reassign to a WantedPhysReg alias. 226 if (TRI->regsOverlap(PhysReg, WantedPhysReg)) 227 continue; 228 229 if (checkUncachedInterference(InterferingVReg, PhysReg)) 230 continue; 231 232 // Reassign the interfering virtual reg to this physical reg. 233 unsigned OldAssign = VRM->getPhys(InterferingVReg.reg); 234 DEBUG(dbgs() << "reassigning: " << InterferingVReg << " from " << 235 TRI->getName(OldAssign) << " to " << TRI->getName(PhysReg) << '\n'); 236 PhysReg2LiveUnion[OldAssign].extract(InterferingVReg); 237 VRM->clearVirt(InterferingVReg.reg); 238 VRM->assignVirt2Phys(InterferingVReg.reg, PhysReg); 239 PhysReg2LiveUnion[PhysReg].unify(InterferingVReg); 240 241 return true; 242 } 243 return false; 244} 245 246/// reassignInterferences - Reassign all interferences to different physical 247/// registers such that Virtreg can be assigned to PhysReg. 248/// Currently this only works with a single interference. 249/// @param VirtReg Currently unassigned virtual register. 250/// @param PhysReg Physical register to be cleared. 251/// @return True on success, false if nothing was changed. 252bool RAGreedy::reassignInterferences(LiveInterval &VirtReg, unsigned PhysReg) { 253 LiveInterval *InterferingVReg = getSingleInterference(VirtReg, PhysReg); 254 if (!InterferingVReg) 255 return false; 256 if (TargetRegisterInfo::isPhysicalRegister(InterferingVReg->reg)) 257 return false; 258 return reassignVReg(*InterferingVReg, PhysReg); 259} 260 261/// tryReassign - Try to reassign interferences to different physregs. 262/// @param VirtReg Currently unassigned virtual register. 263/// @param Order Physregs to try. 264/// @return Physreg to assign VirtReg, or 0. 265unsigned RAGreedy::tryReassign(LiveInterval &VirtReg, AllocationOrder &Order) { 266 NamedRegionTimer T("Reassign", TimerGroupName, TimePassesIsEnabled); 267 Order.rewind(); 268 while (unsigned PhysReg = Order.next()) 269 if (reassignInterferences(VirtReg, PhysReg)) 270 return PhysReg; 271 return 0; 272} 273 274 275//===----------------------------------------------------------------------===// 276// Loop Splitting 277//===----------------------------------------------------------------------===// 278 279/// findInterferenceFreeReg - Find a physical register in Order where Loop has 280/// no interferences with VirtReg. 281unsigned RAGreedy::findInterferenceFreeReg(MachineLoopRange *Loop, 282 LiveInterval &VirtReg, 283 AllocationOrder &Order) { 284 Order.rewind(); 285 while (unsigned PhysReg = Order.next()) { 286 bool interference = false; 287 for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) { 288 if (query(VirtReg, *AI).checkLoopInterference(Loop)) { 289 interference = true; 290 break; 291 } 292 } 293 if (!interference) 294 return PhysReg; 295 } 296 // No physreg found. 297 return 0; 298} 299 300/// trySplit - Try to split VirtReg or one of its interferences, making it 301/// assignable. 302/// @return Physreg when VirtReg may be assigned and/or new SplitVRegs. 303unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order, 304 SmallVectorImpl<LiveInterval*>&SplitVRegs) { 305 NamedRegionTimer T("Splitter", TimerGroupName, TimePassesIsEnabled); 306 SA->analyze(&VirtReg); 307 308 // Get the set of loops that have VirtReg uses and are splittable. 309 SplitAnalysis::LoopPtrSet SplitLoopSet; 310 SA->getSplitLoops(SplitLoopSet); 311 312 // Order loops by descending area. 313 SmallVector<MachineLoopRange*, 8> SplitLoops; 314 for (SplitAnalysis::LoopPtrSet::const_iterator I = SplitLoopSet.begin(), 315 E = SplitLoopSet.end(); I != E; ++I) 316 SplitLoops.push_back(LoopRanges->getLoopRange(*I)); 317 array_pod_sort(SplitLoops.begin(), SplitLoops.end(), 318 MachineLoopRange::byAreaDesc); 319 320 // Find the first loop that is interference-free for some register in the 321 // allocation order. 322 MachineLoopRange *Loop = 0; 323 for (unsigned i = 0, e = SplitLoops.size(); i != e; ++i) { 324 DEBUG(dbgs() << " Checking " << *SplitLoops[i]); 325 if (unsigned PhysReg = findInterferenceFreeReg(SplitLoops[i], 326 VirtReg, Order)) { 327 (void)PhysReg; 328 Loop = SplitLoops[i]; 329 DEBUG(dbgs() << ": Use %" << TRI->getName(PhysReg) << '\n'); 330 break; 331 } else { 332 DEBUG(dbgs() << ": Interference.\n"); 333 } 334 } 335 336 if (!Loop) { 337 DEBUG(dbgs() << " All candidate loops have interference.\n"); 338 return 0; 339 } 340 341 // Execute the split around Loop. 342 SmallVector<LiveInterval*, 4> SpillRegs; 343 LiveRangeEdit LREdit(VirtReg, SplitVRegs, SpillRegs); 344 SplitEditor(*SA, *LIS, *VRM, *DomTree, LREdit) 345 .splitAroundLoop(Loop->getLoop()); 346 347 if (VerifyEnabled) 348 MF->verify(this, "After splitting live range around loop"); 349 350 // We have new split regs, don't assign anything. 351 return 0; 352} 353 354 355//===----------------------------------------------------------------------===// 356// Spilling 357//===----------------------------------------------------------------------===// 358 359/// calcInterferenceWeight - Calculate the combined spill weight of 360/// interferences when assigning VirtReg to PhysReg. 361float RAGreedy::calcInterferenceWeight(LiveInterval &VirtReg, unsigned PhysReg){ 362 float Sum = 0; 363 for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) { 364 LiveIntervalUnion::Query &Q = query(VirtReg, *AI); 365 Q.collectInterferingVRegs(); 366 if (Q.seenUnspillableVReg()) 367 return HUGE_VALF; 368 for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) 369 Sum += Q.interferingVRegs()[i]->weight; 370 } 371 return Sum; 372} 373 374/// trySpillInterferences - Try to spill interfering registers instead of the 375/// current one. Only do it if the accumulated spill weight is smaller than the 376/// current spill weight. 377unsigned RAGreedy::trySpillInterferences(LiveInterval &VirtReg, 378 AllocationOrder &Order, 379 SmallVectorImpl<LiveInterval*> &NewVRegs) { 380 NamedRegionTimer T("Spill Interference", TimerGroupName, TimePassesIsEnabled); 381 unsigned BestPhys = 0; 382 float BestWeight; 383 384 Order.rewind(); 385 while (unsigned PhysReg = Order.next()) { 386 float Weight = calcInterferenceWeight(VirtReg, PhysReg); 387 if (Weight == HUGE_VALF || Weight >= VirtReg.weight) 388 continue; 389 if (!BestPhys || Weight < BestWeight) 390 BestPhys = PhysReg, BestWeight = Weight; 391 } 392 393 // No candidates found. 394 if (!BestPhys) 395 return 0; 396 397 // Collect all interfering registers. 398 SmallVector<LiveInterval*, 8> Spills; 399 for (const unsigned *AI = TRI->getOverlaps(BestPhys); *AI; ++AI) { 400 LiveIntervalUnion::Query &Q = query(VirtReg, *AI); 401 Spills.append(Q.interferingVRegs().begin(), Q.interferingVRegs().end()); 402 for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) { 403 LiveInterval *VReg = Q.interferingVRegs()[i]; 404 PhysReg2LiveUnion[*AI].extract(*VReg); 405 VRM->clearVirt(VReg->reg); 406 } 407 } 408 409 // Spill them all. 410 DEBUG(dbgs() << "spilling " << Spills.size() << " interferences with weight " 411 << BestWeight << '\n'); 412 for (unsigned i = 0, e = Spills.size(); i != e; ++i) 413 spiller().spill(Spills[i], NewVRegs, Spills); 414 return BestPhys; 415} 416 417 418//===----------------------------------------------------------------------===// 419// Main Entry Point 420//===----------------------------------------------------------------------===// 421 422unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg, 423 SmallVectorImpl<LiveInterval*> &SplitVRegs) { 424 // First try assigning a free register. 425 AllocationOrder Order(VirtReg.reg, *VRM, ReservedRegs); 426 while (unsigned PhysReg = Order.next()) { 427 if (!checkPhysRegInterference(VirtReg, PhysReg)) 428 return PhysReg; 429 } 430 431 // Try to reassign interferences. 432 if (unsigned PhysReg = tryReassign(VirtReg, Order)) 433 return PhysReg; 434 435 // Try splitting VirtReg or interferences. 436 unsigned PhysReg = trySplit(VirtReg, Order, SplitVRegs); 437 if (PhysReg || !SplitVRegs.empty()) 438 return PhysReg; 439 440 // Try to spill another interfering reg with less spill weight. 441 PhysReg = trySpillInterferences(VirtReg, Order, SplitVRegs); 442 if (PhysReg) 443 return PhysReg; 444 445 // Finally spill VirtReg itself. 446 NamedRegionTimer T("Spiller", TimerGroupName, TimePassesIsEnabled); 447 SmallVector<LiveInterval*, 1> pendingSpills; 448 spiller().spill(&VirtReg, SplitVRegs, pendingSpills); 449 450 // The live virtual register requesting allocation was spilled, so tell 451 // the caller not to allocate anything during this round. 452 return 0; 453} 454 455bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { 456 DEBUG(dbgs() << "********** GREEDY REGISTER ALLOCATION **********\n" 457 << "********** Function: " 458 << ((Value*)mf.getFunction())->getName() << '\n'); 459 460 MF = &mf; 461 if (VerifyEnabled) 462 MF->verify(this, "Before greedy register allocator"); 463 464 RegAllocBase::init(getAnalysis<VirtRegMap>(), getAnalysis<LiveIntervals>()); 465 DomTree = &getAnalysis<MachineDominatorTree>(); 466 ReservedRegs = TRI->getReservedRegs(*MF); 467 SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM)); 468 Loops = &getAnalysis<MachineLoopInfo>(); 469 LoopRanges = &getAnalysis<MachineLoopRanges>(); 470 SA.reset(new SplitAnalysis(*MF, *LIS, *Loops)); 471 472 allocatePhysRegs(); 473 addMBBLiveIns(MF); 474 475 // Run rewriter 476 { 477 NamedRegionTimer T("Rewriter", TimerGroupName, TimePassesIsEnabled); 478 std::auto_ptr<VirtRegRewriter> rewriter(createVirtRegRewriter()); 479 rewriter->runOnMachineFunction(*MF, *VRM, LIS); 480 } 481 482 // The pass output is in VirtRegMap. Release all the transient data. 483 releaseMemory(); 484 485 return true; 486} 487