RegAllocGreedy.cpp revision c46570dc05851395829bef904bb6ddb1260400d1
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 "SpillPlacement.h" 22#include "SplitKit.h" 23#include "VirtRegMap.h" 24#include "llvm/ADT/Statistic.h" 25#include "llvm/Analysis/AliasAnalysis.h" 26#include "llvm/Function.h" 27#include "llvm/PassAnalysisSupport.h" 28#include "llvm/CodeGen/CalcSpillWeights.h" 29#include "llvm/CodeGen/EdgeBundles.h" 30#include "llvm/CodeGen/LiveIntervalAnalysis.h" 31#include "llvm/CodeGen/LiveStackAnalysis.h" 32#include "llvm/CodeGen/MachineDominators.h" 33#include "llvm/CodeGen/MachineFunctionPass.h" 34#include "llvm/CodeGen/MachineLoopInfo.h" 35#include "llvm/CodeGen/MachineLoopRanges.h" 36#include "llvm/CodeGen/MachineRegisterInfo.h" 37#include "llvm/CodeGen/Passes.h" 38#include "llvm/CodeGen/RegAllocRegistry.h" 39#include "llvm/CodeGen/RegisterCoalescer.h" 40#include "llvm/Target/TargetOptions.h" 41#include "llvm/Support/Debug.h" 42#include "llvm/Support/ErrorHandling.h" 43#include "llvm/Support/raw_ostream.h" 44#include "llvm/Support/Timer.h" 45 46#include <queue> 47 48using namespace llvm; 49 50STATISTIC(NumGlobalSplits, "Number of split global live ranges"); 51STATISTIC(NumLocalSplits, "Number of split local live ranges"); 52STATISTIC(NumReassigned, "Number of interferences reassigned"); 53STATISTIC(NumEvicted, "Number of interferences evicted"); 54 55static RegisterRegAlloc greedyRegAlloc("greedy", "greedy register allocator", 56 createGreedyRegisterAllocator); 57 58namespace { 59class RAGreedy : public MachineFunctionPass, 60 public RegAllocBase, 61 private LiveRangeEdit::Delegate { 62 63 // context 64 MachineFunction *MF; 65 BitVector ReservedRegs; 66 67 // analyses 68 SlotIndexes *Indexes; 69 LiveStacks *LS; 70 MachineDominatorTree *DomTree; 71 MachineLoopInfo *Loops; 72 MachineLoopRanges *LoopRanges; 73 EdgeBundles *Bundles; 74 SpillPlacement *SpillPlacer; 75 76 // state 77 std::auto_ptr<Spiller> SpillerInstance; 78 std::priority_queue<std::pair<unsigned, unsigned> > Queue; 79 80 // Live ranges pass through a number of stages as we try to allocate them. 81 // Some of the stages may also create new live ranges: 82 // 83 // - Region splitting. 84 // - Per-block splitting. 85 // - Local splitting. 86 // - Spilling. 87 // 88 // Ranges produced by one of the stages skip the previous stages when they are 89 // dequeued. This improves performance because we can skip interference checks 90 // that are unlikely to give any results. It also guarantees that the live 91 // range splitting algorithm terminates, something that is otherwise hard to 92 // ensure. 93 enum LiveRangeStage { 94 RS_Original, ///< Never seen before, never split. 95 RS_Second, ///< Second time in the queue. 96 RS_Region, ///< Produced by region splitting. 97 RS_Block, ///< Produced by per-block splitting. 98 RS_Local, ///< Produced by local splitting. 99 RS_Spill ///< Produced by spilling. 100 }; 101 102 IndexedMap<unsigned char, VirtReg2IndexFunctor> LRStage; 103 104 LiveRangeStage getStage(const LiveInterval &VirtReg) const { 105 return LiveRangeStage(LRStage[VirtReg.reg]); 106 } 107 108 template<typename Iterator> 109 void setStage(Iterator Begin, Iterator End, LiveRangeStage NewStage) { 110 LRStage.resize(MRI->getNumVirtRegs()); 111 for (;Begin != End; ++Begin) 112 LRStage[(*Begin)->reg] = NewStage; 113 } 114 115 // splitting state. 116 std::auto_ptr<SplitAnalysis> SA; 117 std::auto_ptr<SplitEditor> SE; 118 119 /// All basic blocks where the current register is live. 120 SmallVector<SpillPlacement::BlockConstraint, 8> SplitConstraints; 121 122 typedef std::pair<SlotIndex, SlotIndex> IndexPair; 123 124 /// Global live range splitting candidate info. 125 struct GlobalSplitCandidate { 126 unsigned PhysReg; 127 SmallVector<IndexPair, 8> Interference; 128 BitVector LiveBundles; 129 }; 130 131 /// Candidate info for for each PhysReg in AllocationOrder. 132 /// This vector never shrinks, but grows to the size of the largest register 133 /// class. 134 SmallVector<GlobalSplitCandidate, 32> GlobalCand; 135 136 /// For every instruction in SA->UseSlots, store the previous non-copy 137 /// instruction. 138 SmallVector<SlotIndex, 8> PrevSlot; 139 140public: 141 RAGreedy(); 142 143 /// Return the pass name. 144 virtual const char* getPassName() const { 145 return "Greedy Register Allocator"; 146 } 147 148 /// RAGreedy analysis usage. 149 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 150 virtual void releaseMemory(); 151 virtual Spiller &spiller() { return *SpillerInstance; } 152 virtual void enqueue(LiveInterval *LI); 153 virtual LiveInterval *dequeue(); 154 virtual unsigned selectOrSplit(LiveInterval&, 155 SmallVectorImpl<LiveInterval*>&); 156 157 /// Perform register allocation. 158 virtual bool runOnMachineFunction(MachineFunction &mf); 159 160 static char ID; 161 162private: 163 void LRE_WillEraseInstruction(MachineInstr*); 164 bool LRE_CanEraseVirtReg(unsigned); 165 166 bool checkUncachedInterference(LiveInterval&, unsigned); 167 LiveInterval *getSingleInterference(LiveInterval&, unsigned); 168 bool reassignVReg(LiveInterval &InterferingVReg, unsigned OldPhysReg); 169 170 void mapGlobalInterference(unsigned, SmallVectorImpl<IndexPair>&); 171 float calcSplitConstraints(const SmallVectorImpl<IndexPair>&); 172 173 float calcGlobalSplitCost(const BitVector&); 174 void splitAroundRegion(LiveInterval&, unsigned, const BitVector&, 175 SmallVectorImpl<LiveInterval*>&); 176 void calcGapWeights(unsigned, SmallVectorImpl<float>&); 177 SlotIndex getPrevMappedIndex(const MachineInstr*); 178 void calcPrevSlots(); 179 unsigned nextSplitPoint(unsigned); 180 bool canEvictInterference(LiveInterval&, unsigned, float&); 181 182 unsigned tryReassign(LiveInterval&, AllocationOrder&, 183 SmallVectorImpl<LiveInterval*>&); 184 unsigned tryEvict(LiveInterval&, AllocationOrder&, 185 SmallVectorImpl<LiveInterval*>&); 186 unsigned tryRegionSplit(LiveInterval&, AllocationOrder&, 187 SmallVectorImpl<LiveInterval*>&); 188 unsigned tryLocalSplit(LiveInterval&, AllocationOrder&, 189 SmallVectorImpl<LiveInterval*>&); 190 unsigned trySplit(LiveInterval&, AllocationOrder&, 191 SmallVectorImpl<LiveInterval*>&); 192}; 193} // end anonymous namespace 194 195char RAGreedy::ID = 0; 196 197FunctionPass* llvm::createGreedyRegisterAllocator() { 198 return new RAGreedy(); 199} 200 201RAGreedy::RAGreedy(): MachineFunctionPass(ID), LRStage(RS_Original) { 202 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 203 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 204 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 205 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry()); 206 initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); 207 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); 208 initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 209 initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry()); 210 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); 211 initializeMachineLoopRangesPass(*PassRegistry::getPassRegistry()); 212 initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); 213 initializeEdgeBundlesPass(*PassRegistry::getPassRegistry()); 214 initializeSpillPlacementPass(*PassRegistry::getPassRegistry()); 215} 216 217void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const { 218 AU.setPreservesCFG(); 219 AU.addRequired<AliasAnalysis>(); 220 AU.addPreserved<AliasAnalysis>(); 221 AU.addRequired<LiveIntervals>(); 222 AU.addRequired<SlotIndexes>(); 223 AU.addPreserved<SlotIndexes>(); 224 if (StrongPHIElim) 225 AU.addRequiredID(StrongPHIEliminationID); 226 AU.addRequiredTransitive<RegisterCoalescer>(); 227 AU.addRequired<CalculateSpillWeights>(); 228 AU.addRequired<LiveStacks>(); 229 AU.addPreserved<LiveStacks>(); 230 AU.addRequired<MachineDominatorTree>(); 231 AU.addPreserved<MachineDominatorTree>(); 232 AU.addRequired<MachineLoopInfo>(); 233 AU.addPreserved<MachineLoopInfo>(); 234 AU.addRequired<MachineLoopRanges>(); 235 AU.addPreserved<MachineLoopRanges>(); 236 AU.addRequired<VirtRegMap>(); 237 AU.addPreserved<VirtRegMap>(); 238 AU.addRequired<EdgeBundles>(); 239 AU.addRequired<SpillPlacement>(); 240 MachineFunctionPass::getAnalysisUsage(AU); 241} 242 243 244//===----------------------------------------------------------------------===// 245// LiveRangeEdit delegate methods 246//===----------------------------------------------------------------------===// 247 248void RAGreedy::LRE_WillEraseInstruction(MachineInstr *MI) { 249 // LRE itself will remove from SlotIndexes and parent basic block. 250 VRM->RemoveMachineInstrFromMaps(MI); 251} 252 253bool RAGreedy::LRE_CanEraseVirtReg(unsigned VirtReg) { 254 if (unsigned PhysReg = VRM->getPhys(VirtReg)) { 255 unassign(LIS->getInterval(VirtReg), PhysReg); 256 return true; 257 } 258 // Unassigned virtreg is probably in the priority queue. 259 // RegAllocBase will erase it after dequeueing. 260 return false; 261} 262 263void RAGreedy::releaseMemory() { 264 SpillerInstance.reset(0); 265 LRStage.clear(); 266 RegAllocBase::releaseMemory(); 267} 268 269void RAGreedy::enqueue(LiveInterval *LI) { 270 // Prioritize live ranges by size, assigning larger ranges first. 271 // The queue holds (size, reg) pairs. 272 const unsigned Size = LI->getSize(); 273 const unsigned Reg = LI->reg; 274 assert(TargetRegisterInfo::isVirtualRegister(Reg) && 275 "Can only enqueue virtual registers"); 276 unsigned Prio; 277 278 LRStage.grow(Reg); 279 if (LRStage[Reg] == RS_Original) 280 // 1st generation ranges are handled first, long -> short. 281 Prio = (1u << 31) + Size; 282 else 283 // Repeat offenders are handled second, short -> long 284 Prio = (1u << 30) - Size; 285 286 // Boost ranges that have a physical register hint. 287 const unsigned Hint = VRM->getRegAllocPref(Reg); 288 if (TargetRegisterInfo::isPhysicalRegister(Hint)) 289 Prio |= (1u << 30); 290 291 Queue.push(std::make_pair(Prio, Reg)); 292} 293 294LiveInterval *RAGreedy::dequeue() { 295 if (Queue.empty()) 296 return 0; 297 LiveInterval *LI = &LIS->getInterval(Queue.top().second); 298 Queue.pop(); 299 return LI; 300} 301 302//===----------------------------------------------------------------------===// 303// Register Reassignment 304//===----------------------------------------------------------------------===// 305 306// Check interference without using the cache. 307bool RAGreedy::checkUncachedInterference(LiveInterval &VirtReg, 308 unsigned PhysReg) { 309 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) { 310 LiveIntervalUnion::Query subQ(&VirtReg, &PhysReg2LiveUnion[*AliasI]); 311 if (subQ.checkInterference()) 312 return true; 313 } 314 return false; 315} 316 317/// getSingleInterference - Return the single interfering virtual register 318/// assigned to PhysReg. Return 0 if more than one virtual register is 319/// interfering. 320LiveInterval *RAGreedy::getSingleInterference(LiveInterval &VirtReg, 321 unsigned PhysReg) { 322 // Check physreg and aliases. 323 LiveInterval *Interference = 0; 324 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) { 325 LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI); 326 if (Q.checkInterference()) { 327 if (Interference) 328 return 0; 329 if (Q.collectInterferingVRegs(2) > 1) 330 return 0; 331 Interference = Q.interferingVRegs().front(); 332 } 333 } 334 return Interference; 335} 336 337// Attempt to reassign this virtual register to a different physical register. 338// 339// FIXME: we are not yet caching these "second-level" interferences discovered 340// in the sub-queries. These interferences can change with each call to 341// selectOrSplit. However, we could implement a "may-interfere" cache that 342// could be conservatively dirtied when we reassign or split. 343// 344// FIXME: This may result in a lot of alias queries. We could summarize alias 345// live intervals in their parent register's live union, but it's messy. 346bool RAGreedy::reassignVReg(LiveInterval &InterferingVReg, 347 unsigned WantedPhysReg) { 348 assert(TargetRegisterInfo::isVirtualRegister(InterferingVReg.reg) && 349 "Can only reassign virtual registers"); 350 assert(TRI->regsOverlap(WantedPhysReg, VRM->getPhys(InterferingVReg.reg)) && 351 "inconsistent phys reg assigment"); 352 353 AllocationOrder Order(InterferingVReg.reg, *VRM, ReservedRegs); 354 while (unsigned PhysReg = Order.next()) { 355 // Don't reassign to a WantedPhysReg alias. 356 if (TRI->regsOverlap(PhysReg, WantedPhysReg)) 357 continue; 358 359 if (checkUncachedInterference(InterferingVReg, PhysReg)) 360 continue; 361 362 // Reassign the interfering virtual reg to this physical reg. 363 unsigned OldAssign = VRM->getPhys(InterferingVReg.reg); 364 DEBUG(dbgs() << "reassigning: " << InterferingVReg << " from " << 365 TRI->getName(OldAssign) << " to " << TRI->getName(PhysReg) << '\n'); 366 unassign(InterferingVReg, OldAssign); 367 assign(InterferingVReg, PhysReg); 368 ++NumReassigned; 369 return true; 370 } 371 return false; 372} 373 374/// tryReassign - Try to reassign a single interference to a different physreg. 375/// @param VirtReg Currently unassigned virtual register. 376/// @param Order Physregs to try. 377/// @return Physreg to assign VirtReg, or 0. 378unsigned RAGreedy::tryReassign(LiveInterval &VirtReg, AllocationOrder &Order, 379 SmallVectorImpl<LiveInterval*> &NewVRegs){ 380 NamedRegionTimer T("Reassign", TimerGroupName, TimePassesIsEnabled); 381 382 Order.rewind(); 383 while (unsigned PhysReg = Order.next()) { 384 LiveInterval *InterferingVReg = getSingleInterference(VirtReg, PhysReg); 385 if (!InterferingVReg) 386 continue; 387 if (TargetRegisterInfo::isPhysicalRegister(InterferingVReg->reg)) 388 continue; 389 if (reassignVReg(*InterferingVReg, PhysReg)) 390 return PhysReg; 391 } 392 return 0; 393} 394 395 396//===----------------------------------------------------------------------===// 397// Interference eviction 398//===----------------------------------------------------------------------===// 399 400/// canEvict - Return true if all interferences between VirtReg and PhysReg can 401/// be evicted. Set maxWeight to the maximal spill weight of an interference. 402bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg, 403 float &MaxWeight) { 404 float Weight = 0; 405 for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) { 406 LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI); 407 // If there is 10 or more interferences, chances are one is smaller. 408 if (Q.collectInterferingVRegs(10) >= 10) 409 return false; 410 411 // Check if any interfering live range is heavier than VirtReg. 412 for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) { 413 LiveInterval *Intf = Q.interferingVRegs()[i]; 414 if (TargetRegisterInfo::isPhysicalRegister(Intf->reg)) 415 return false; 416 if (Intf->weight >= VirtReg.weight) 417 return false; 418 Weight = std::max(Weight, Intf->weight); 419 } 420 } 421 MaxWeight = Weight; 422 return true; 423} 424 425/// tryEvict - Try to evict all interferences for a physreg. 426/// @param VirtReg Currently unassigned virtual register. 427/// @param Order Physregs to try. 428/// @return Physreg to assign VirtReg, or 0. 429unsigned RAGreedy::tryEvict(LiveInterval &VirtReg, 430 AllocationOrder &Order, 431 SmallVectorImpl<LiveInterval*> &NewVRegs){ 432 NamedRegionTimer T("Evict", TimerGroupName, TimePassesIsEnabled); 433 434 // Keep track of the lightest single interference seen so far. 435 float BestWeight = 0; 436 unsigned BestPhys = 0; 437 438 Order.rewind(); 439 while (unsigned PhysReg = Order.next()) { 440 float Weight = 0; 441 if (!canEvictInterference(VirtReg, PhysReg, Weight)) 442 continue; 443 444 // This is an eviction candidate. 445 DEBUG(dbgs() << "max " << PrintReg(PhysReg, TRI) << " interference = " 446 << Weight << '\n'); 447 if (BestPhys && Weight >= BestWeight) 448 continue; 449 450 // Best so far. 451 BestPhys = PhysReg; 452 BestWeight = Weight; 453 // Stop if the hint can be used. 454 if (Order.isHint(PhysReg)) 455 break; 456 } 457 458 if (!BestPhys) 459 return 0; 460 461 DEBUG(dbgs() << "evicting " << PrintReg(BestPhys, TRI) << " interference\n"); 462 for (const unsigned *AliasI = TRI->getOverlaps(BestPhys); *AliasI; ++AliasI) { 463 LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI); 464 assert(Q.seenAllInterferences() && "Didn't check all interfererences."); 465 for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) { 466 LiveInterval *Intf = Q.interferingVRegs()[i]; 467 unassign(*Intf, VRM->getPhys(Intf->reg)); 468 ++NumEvicted; 469 NewVRegs.push_back(Intf); 470 } 471 } 472 return BestPhys; 473} 474 475 476//===----------------------------------------------------------------------===// 477// Region Splitting 478//===----------------------------------------------------------------------===// 479 480/// mapGlobalInterference - Compute a map of the interference from PhysReg and 481/// its aliases in each block in SA->LiveBlocks. 482/// If LiveBlocks[i] is live-in, Ranges[i].first is the first interference. 483/// If LiveBlocks[i] is live-out, Ranges[i].second is the last interference. 484void RAGreedy::mapGlobalInterference(unsigned PhysReg, 485 SmallVectorImpl<IndexPair> &Ranges) { 486 Ranges.assign(SA->LiveBlocks.size(), IndexPair()); 487 LiveInterval &VirtReg = const_cast<LiveInterval&>(SA->getParent()); 488 for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) { 489 if (!query(VirtReg, *AI).checkInterference()) 490 continue; 491 LiveIntervalUnion::SegmentIter IntI = 492 PhysReg2LiveUnion[*AI].find(VirtReg.beginIndex()); 493 if (!IntI.valid()) 494 continue; 495 for (unsigned i = 0, e = SA->LiveBlocks.size(); i != e; ++i) { 496 const SplitAnalysis::BlockInfo &BI = SA->LiveBlocks[i]; 497 IndexPair &IP = Ranges[i]; 498 499 // Skip interference-free blocks. 500 if (IntI.start() >= BI.Stop) 501 continue; 502 503 // First interference in block. 504 if (BI.LiveIn) { 505 IntI.advanceTo(BI.Start); 506 if (!IntI.valid()) 507 break; 508 if (IntI.start() >= BI.Stop) 509 continue; 510 if (!IP.first.isValid() || IntI.start() < IP.first) 511 IP.first = IntI.start(); 512 } 513 514 // Last interference in block. 515 if (BI.LiveOut) { 516 IntI.advanceTo(BI.Stop); 517 if (!IntI.valid() || IntI.start() >= BI.Stop) 518 --IntI; 519 if (IntI.stop() <= BI.Start) 520 continue; 521 if (!IP.second.isValid() || IntI.stop() > IP.second) 522 IP.second = IntI.stop(); 523 } 524 } 525 } 526} 527 528/// calcSplitConstraints - Fill out the SplitConstraints vector based on the 529/// interference pattern in Intf. Return the static cost of this split, 530/// assuming that all preferences in SplitConstraints are met. 531float RAGreedy::calcSplitConstraints(const SmallVectorImpl<IndexPair> &Intf) { 532 // Reset interference dependent info. 533 SplitConstraints.resize(SA->LiveBlocks.size()); 534 float StaticCost = 0; 535 for (unsigned i = 0, e = SA->LiveBlocks.size(); i != e; ++i) { 536 SplitAnalysis::BlockInfo &BI = SA->LiveBlocks[i]; 537 SpillPlacement::BlockConstraint &BC = SplitConstraints[i]; 538 IndexPair IP = Intf[i]; 539 540 BC.Number = BI.MBB->getNumber(); 541 BC.Entry = (BI.Uses && BI.LiveIn) ? 542 SpillPlacement::PrefReg : SpillPlacement::DontCare; 543 BC.Exit = (BI.Uses && BI.LiveOut) ? 544 SpillPlacement::PrefReg : SpillPlacement::DontCare; 545 546 // Number of spill code instructions to insert. 547 unsigned Ins = 0; 548 549 // Interference for the live-in value. 550 if (IP.first.isValid()) { 551 if (IP.first <= BI.Start) 552 BC.Entry = SpillPlacement::MustSpill, Ins += BI.Uses; 553 else if (!BI.Uses) 554 BC.Entry = SpillPlacement::PrefSpill; 555 else if (IP.first < BI.FirstUse) 556 BC.Entry = SpillPlacement::PrefSpill, ++Ins; 557 else if (IP.first < (BI.LiveThrough ? BI.LastUse : BI.Kill)) 558 ++Ins; 559 } 560 561 // Interference for the live-out value. 562 if (IP.second.isValid()) { 563 if (IP.second >= BI.LastSplitPoint) 564 BC.Exit = SpillPlacement::MustSpill, Ins += BI.Uses; 565 else if (!BI.Uses) 566 BC.Exit = SpillPlacement::PrefSpill; 567 else if (IP.second > BI.LastUse) 568 BC.Exit = SpillPlacement::PrefSpill, ++Ins; 569 else if (IP.second > (BI.LiveThrough ? BI.FirstUse : BI.Def)) 570 ++Ins; 571 } 572 573 // Accumulate the total frequency of inserted spill code. 574 if (Ins) 575 StaticCost += Ins * SpillPlacer->getBlockFrequency(BC.Number); 576 } 577 return StaticCost; 578} 579 580 581/// calcGlobalSplitCost - Return the global split cost of following the split 582/// pattern in LiveBundles. This cost should be added to the local cost of the 583/// interference pattern in SplitConstraints. 584/// 585float RAGreedy::calcGlobalSplitCost(const BitVector &LiveBundles) { 586 float GlobalCost = 0; 587 for (unsigned i = 0, e = SA->LiveBlocks.size(); i != e; ++i) { 588 SplitAnalysis::BlockInfo &BI = SA->LiveBlocks[i]; 589 SpillPlacement::BlockConstraint &BC = SplitConstraints[i]; 590 bool RegIn = LiveBundles[Bundles->getBundle(BC.Number, 0)]; 591 bool RegOut = LiveBundles[Bundles->getBundle(BC.Number, 1)]; 592 unsigned Ins = 0; 593 594 if (!BI.Uses) 595 Ins += RegIn != RegOut; 596 else { 597 if (BI.LiveIn) 598 Ins += RegIn != (BC.Entry == SpillPlacement::PrefReg); 599 if (BI.LiveOut) 600 Ins += RegOut != (BC.Exit == SpillPlacement::PrefReg); 601 } 602 if (Ins) 603 GlobalCost += Ins * SpillPlacer->getBlockFrequency(BC.Number); 604 } 605 return GlobalCost; 606} 607 608/// splitAroundRegion - Split VirtReg around the region determined by 609/// LiveBundles. Make an effort to avoid interference from PhysReg. 610/// 611/// The 'register' interval is going to contain as many uses as possible while 612/// avoiding interference. The 'stack' interval is the complement constructed by 613/// SplitEditor. It will contain the rest. 614/// 615void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg, 616 const BitVector &LiveBundles, 617 SmallVectorImpl<LiveInterval*> &NewVRegs) { 618 DEBUG({ 619 dbgs() << "Splitting around region for " << PrintReg(PhysReg, TRI) 620 << " with bundles"; 621 for (int i = LiveBundles.find_first(); i>=0; i = LiveBundles.find_next(i)) 622 dbgs() << " EB#" << i; 623 dbgs() << ".\n"; 624 }); 625 626 // First compute interference ranges in the live blocks. 627 SmallVector<IndexPair, 8> InterferenceRanges; 628 mapGlobalInterference(PhysReg, InterferenceRanges); 629 630 LiveRangeEdit LREdit(VirtReg, NewVRegs, this); 631 SE->reset(LREdit); 632 633 // Create the main cross-block interval. 634 SE->openIntv(); 635 636 // First add all defs that are live out of a block. 637 for (unsigned i = 0, e = SA->LiveBlocks.size(); i != e; ++i) { 638 SplitAnalysis::BlockInfo &BI = SA->LiveBlocks[i]; 639 bool RegIn = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 0)]; 640 bool RegOut = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 1)]; 641 642 // Should the register be live out? 643 if (!BI.LiveOut || !RegOut) 644 continue; 645 646 IndexPair &IP = InterferenceRanges[i]; 647 DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " -> EB#" 648 << Bundles->getBundle(BI.MBB->getNumber(), 1) 649 << " [" << BI.Start << ';' << BI.LastSplitPoint << '-' 650 << BI.Stop << ") intf [" << IP.first << ';' << IP.second 651 << ')'); 652 653 // The interference interval should either be invalid or overlap MBB. 654 assert((!IP.first.isValid() || IP.first < BI.Stop) && "Bad interference"); 655 assert((!IP.second.isValid() || IP.second > BI.Start) 656 && "Bad interference"); 657 658 // Check interference leaving the block. 659 if (!IP.second.isValid()) { 660 // Block is interference-free. 661 DEBUG(dbgs() << ", no interference"); 662 if (!BI.Uses) { 663 assert(BI.LiveThrough && "No uses, but not live through block?"); 664 // Block is live-through without interference. 665 DEBUG(dbgs() << ", no uses" 666 << (RegIn ? ", live-through.\n" : ", stack in.\n")); 667 if (!RegIn) 668 SE->enterIntvAtEnd(*BI.MBB); 669 continue; 670 } 671 if (!BI.LiveThrough) { 672 DEBUG(dbgs() << ", not live-through.\n"); 673 SE->useIntv(SE->enterIntvBefore(BI.Def), BI.Stop); 674 continue; 675 } 676 if (!RegIn) { 677 // Block is live-through, but entry bundle is on the stack. 678 // Reload just before the first use. 679 DEBUG(dbgs() << ", not live-in, enter before first use.\n"); 680 SE->useIntv(SE->enterIntvBefore(BI.FirstUse), BI.Stop); 681 continue; 682 } 683 DEBUG(dbgs() << ", live-through.\n"); 684 continue; 685 } 686 687 // Block has interference. 688 DEBUG(dbgs() << ", interference to " << IP.second); 689 690 if (!BI.LiveThrough && IP.second <= BI.Def) { 691 // The interference doesn't reach the outgoing segment. 692 DEBUG(dbgs() << " doesn't affect def from " << BI.Def << '\n'); 693 SE->useIntv(BI.Def, BI.Stop); 694 continue; 695 } 696 697 698 if (!BI.Uses) { 699 // No uses in block, avoid interference by reloading as late as possible. 700 DEBUG(dbgs() << ", no uses.\n"); 701 SlotIndex SegStart = SE->enterIntvAtEnd(*BI.MBB); 702 assert(SegStart >= IP.second && "Couldn't avoid interference"); 703 continue; 704 } 705 706 if (IP.second.getBoundaryIndex() < BI.LastUse) { 707 // There are interference-free uses at the end of the block. 708 // Find the first use that can get the live-out register. 709 SmallVectorImpl<SlotIndex>::const_iterator UI = 710 std::lower_bound(SA->UseSlots.begin(), SA->UseSlots.end(), 711 IP.second.getBoundaryIndex()); 712 assert(UI != SA->UseSlots.end() && "Couldn't find last use"); 713 SlotIndex Use = *UI; 714 assert(Use <= BI.LastUse && "Couldn't find last use"); 715 // Only attempt a split befroe the last split point. 716 if (Use.getBaseIndex() <= BI.LastSplitPoint) { 717 DEBUG(dbgs() << ", free use at " << Use << ".\n"); 718 SlotIndex SegStart = SE->enterIntvBefore(Use); 719 assert(SegStart >= IP.second && "Couldn't avoid interference"); 720 assert(SegStart < BI.LastSplitPoint && "Impossible split point"); 721 SE->useIntv(SegStart, BI.Stop); 722 continue; 723 } 724 } 725 726 // Interference is after the last use. 727 DEBUG(dbgs() << " after last use.\n"); 728 SlotIndex SegStart = SE->enterIntvAtEnd(*BI.MBB); 729 assert(SegStart >= IP.second && "Couldn't avoid interference"); 730 } 731 732 // Now all defs leading to live bundles are handled, do everything else. 733 for (unsigned i = 0, e = SA->LiveBlocks.size(); i != e; ++i) { 734 SplitAnalysis::BlockInfo &BI = SA->LiveBlocks[i]; 735 bool RegIn = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 0)]; 736 bool RegOut = LiveBundles[Bundles->getBundle(BI.MBB->getNumber(), 1)]; 737 738 // Is the register live-in? 739 if (!BI.LiveIn || !RegIn) 740 continue; 741 742 // We have an incoming register. Check for interference. 743 IndexPair &IP = InterferenceRanges[i]; 744 745 DEBUG(dbgs() << "EB#" << Bundles->getBundle(BI.MBB->getNumber(), 0) 746 << " -> BB#" << BI.MBB->getNumber() << " [" << BI.Start << ';' 747 << BI.LastSplitPoint << '-' << BI.Stop << ')'); 748 749 // Check interference entering the block. 750 if (!IP.first.isValid()) { 751 // Block is interference-free. 752 DEBUG(dbgs() << ", no interference"); 753 if (!BI.Uses) { 754 assert(BI.LiveThrough && "No uses, but not live through block?"); 755 // Block is live-through without interference. 756 if (RegOut) { 757 DEBUG(dbgs() << ", no uses, live-through.\n"); 758 SE->useIntv(BI.Start, BI.Stop); 759 } else { 760 DEBUG(dbgs() << ", no uses, stack-out.\n"); 761 SE->leaveIntvAtTop(*BI.MBB); 762 } 763 continue; 764 } 765 if (!BI.LiveThrough) { 766 DEBUG(dbgs() << ", killed in block.\n"); 767 SE->useIntv(BI.Start, SE->leaveIntvAfter(BI.Kill)); 768 continue; 769 } 770 if (!RegOut) { 771 // Block is live-through, but exit bundle is on the stack. 772 // Spill immediately after the last use. 773 if (BI.LastUse < BI.LastSplitPoint) { 774 DEBUG(dbgs() << ", uses, stack-out.\n"); 775 SE->useIntv(BI.Start, SE->leaveIntvAfter(BI.LastUse)); 776 continue; 777 } 778 // The last use is after the last split point, it is probably an 779 // indirect jump. 780 DEBUG(dbgs() << ", uses at " << BI.LastUse << " after split point " 781 << BI.LastSplitPoint << ", stack-out.\n"); 782 SlotIndex SegEnd = SE->leaveIntvBefore(BI.LastSplitPoint); 783 SE->useIntv(BI.Start, SegEnd); 784 // Run a double interval from the split to the last use. 785 // This makes it possible to spill the complement without affecting the 786 // indirect branch. 787 SE->overlapIntv(SegEnd, BI.LastUse); 788 continue; 789 } 790 // Register is live-through. 791 DEBUG(dbgs() << ", uses, live-through.\n"); 792 SE->useIntv(BI.Start, BI.Stop); 793 continue; 794 } 795 796 // Block has interference. 797 DEBUG(dbgs() << ", interference from " << IP.first); 798 799 if (!BI.LiveThrough && IP.first >= BI.Kill) { 800 // The interference doesn't reach the outgoing segment. 801 DEBUG(dbgs() << " doesn't affect kill at " << BI.Kill << '\n'); 802 SE->useIntv(BI.Start, BI.Kill); 803 continue; 804 } 805 806 if (!BI.Uses) { 807 // No uses in block, avoid interference by spilling as soon as possible. 808 DEBUG(dbgs() << ", no uses.\n"); 809 SlotIndex SegEnd = SE->leaveIntvAtTop(*BI.MBB); 810 assert(SegEnd <= IP.first && "Couldn't avoid interference"); 811 continue; 812 } 813 if (IP.first.getBaseIndex() > BI.FirstUse) { 814 // There are interference-free uses at the beginning of the block. 815 // Find the last use that can get the register. 816 SmallVectorImpl<SlotIndex>::const_iterator UI = 817 std::lower_bound(SA->UseSlots.begin(), SA->UseSlots.end(), 818 IP.first.getBaseIndex()); 819 assert(UI != SA->UseSlots.begin() && "Couldn't find first use"); 820 SlotIndex Use = (--UI)->getBoundaryIndex(); 821 DEBUG(dbgs() << ", free use at " << *UI << ".\n"); 822 SlotIndex SegEnd = SE->leaveIntvAfter(Use); 823 assert(SegEnd <= IP.first && "Couldn't avoid interference"); 824 SE->useIntv(BI.Start, SegEnd); 825 continue; 826 } 827 828 // Interference is before the first use. 829 DEBUG(dbgs() << " before first use.\n"); 830 SlotIndex SegEnd = SE->leaveIntvAtTop(*BI.MBB); 831 assert(SegEnd <= IP.first && "Couldn't avoid interference"); 832 } 833 834 SE->closeIntv(); 835 836 // FIXME: Should we be more aggressive about splitting the stack region into 837 // per-block segments? The current approach allows the stack region to 838 // separate into connected components. Some components may be allocatable. 839 SE->finish(); 840 ++NumGlobalSplits; 841 842 if (VerifyEnabled) { 843 MF->verify(this, "After splitting live range around region"); 844 845#ifndef NDEBUG 846 // Make sure that at least one of the new intervals can allocate to PhysReg. 847 // That was the whole point of splitting the live range. 848 bool found = false; 849 for (LiveRangeEdit::iterator I = LREdit.begin(), E = LREdit.end(); I != E; 850 ++I) 851 if (!checkUncachedInterference(**I, PhysReg)) { 852 found = true; 853 break; 854 } 855 assert(found && "No allocatable intervals after pointless splitting"); 856#endif 857 } 858} 859 860unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order, 861 SmallVectorImpl<LiveInterval*> &NewVRegs) { 862 BitVector LiveBundles, BestBundles; 863 float BestCost = 0; 864 unsigned BestReg = 0; 865 866 Order.rewind(); 867 for (unsigned Cand = 0; unsigned PhysReg = Order.next(); ++Cand) { 868 if (GlobalCand.size() <= Cand) 869 GlobalCand.resize(Cand+1); 870 GlobalCand[Cand].PhysReg = PhysReg; 871 872 mapGlobalInterference(PhysReg, GlobalCand[Cand].Interference); 873 float Cost = calcSplitConstraints(GlobalCand[Cand].Interference); 874 DEBUG(dbgs() << PrintReg(PhysReg, TRI) << "\tstatic = " << Cost); 875 if (BestReg && Cost >= BestCost) { 876 DEBUG(dbgs() << " higher.\n"); 877 continue; 878 } 879 880 SpillPlacer->placeSpills(SplitConstraints, LiveBundles); 881 // No live bundles, defer to splitSingleBlocks(). 882 if (!LiveBundles.any()) { 883 DEBUG(dbgs() << " no bundles.\n"); 884 continue; 885 } 886 887 Cost += calcGlobalSplitCost(LiveBundles); 888 DEBUG({ 889 dbgs() << ", total = " << Cost << " with bundles"; 890 for (int i = LiveBundles.find_first(); i>=0; i = LiveBundles.find_next(i)) 891 dbgs() << " EB#" << i; 892 dbgs() << ".\n"; 893 }); 894 if (!BestReg || Cost < BestCost) { 895 BestReg = PhysReg; 896 BestCost = 0.98f * Cost; // Prevent rounding effects. 897 BestBundles.swap(LiveBundles); 898 } 899 } 900 901 if (!BestReg) 902 return 0; 903 904 splitAroundRegion(VirtReg, BestReg, BestBundles, NewVRegs); 905 setStage(NewVRegs.begin(), NewVRegs.end(), RS_Region); 906 return 0; 907} 908 909 910//===----------------------------------------------------------------------===// 911// Local Splitting 912//===----------------------------------------------------------------------===// 913 914 915/// calcGapWeights - Compute the maximum spill weight that needs to be evicted 916/// in order to use PhysReg between two entries in SA->UseSlots. 917/// 918/// GapWeight[i] represents the gap between UseSlots[i] and UseSlots[i+1]. 919/// 920void RAGreedy::calcGapWeights(unsigned PhysReg, 921 SmallVectorImpl<float> &GapWeight) { 922 assert(SA->LiveBlocks.size() == 1 && "Not a local interval"); 923 const SplitAnalysis::BlockInfo &BI = SA->LiveBlocks.front(); 924 const SmallVectorImpl<SlotIndex> &Uses = SA->UseSlots; 925 const unsigned NumGaps = Uses.size()-1; 926 927 // Start and end points for the interference check. 928 SlotIndex StartIdx = BI.LiveIn ? BI.FirstUse.getBaseIndex() : BI.FirstUse; 929 SlotIndex StopIdx = BI.LiveOut ? BI.LastUse.getBoundaryIndex() : BI.LastUse; 930 931 GapWeight.assign(NumGaps, 0.0f); 932 933 // Add interference from each overlapping register. 934 for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) { 935 if (!query(const_cast<LiveInterval&>(SA->getParent()), *AI) 936 .checkInterference()) 937 continue; 938 939 // We know that VirtReg is a continuous interval from FirstUse to LastUse, 940 // so we don't need InterferenceQuery. 941 // 942 // Interference that overlaps an instruction is counted in both gaps 943 // surrounding the instruction. The exception is interference before 944 // StartIdx and after StopIdx. 945 // 946 LiveIntervalUnion::SegmentIter IntI = PhysReg2LiveUnion[*AI].find(StartIdx); 947 for (unsigned Gap = 0; IntI.valid() && IntI.start() < StopIdx; ++IntI) { 948 // Skip the gaps before IntI. 949 while (Uses[Gap+1].getBoundaryIndex() < IntI.start()) 950 if (++Gap == NumGaps) 951 break; 952 if (Gap == NumGaps) 953 break; 954 955 // Update the gaps covered by IntI. 956 const float weight = IntI.value()->weight; 957 for (; Gap != NumGaps; ++Gap) { 958 GapWeight[Gap] = std::max(GapWeight[Gap], weight); 959 if (Uses[Gap+1].getBaseIndex() >= IntI.stop()) 960 break; 961 } 962 if (Gap == NumGaps) 963 break; 964 } 965 } 966} 967 968/// getPrevMappedIndex - Return the slot index of the last non-copy instruction 969/// before MI that has a slot index. If MI is the first mapped instruction in 970/// its block, return the block start index instead. 971/// 972SlotIndex RAGreedy::getPrevMappedIndex(const MachineInstr *MI) { 973 assert(MI && "Missing MachineInstr"); 974 const MachineBasicBlock *MBB = MI->getParent(); 975 MachineBasicBlock::const_iterator B = MBB->begin(), I = MI; 976 while (I != B) 977 if (!(--I)->isDebugValue() && !I->isCopy()) 978 return Indexes->getInstructionIndex(I); 979 return Indexes->getMBBStartIdx(MBB); 980} 981 982/// calcPrevSlots - Fill in the PrevSlot array with the index of the previous 983/// real non-copy instruction for each instruction in SA->UseSlots. 984/// 985void RAGreedy::calcPrevSlots() { 986 const SmallVectorImpl<SlotIndex> &Uses = SA->UseSlots; 987 PrevSlot.clear(); 988 PrevSlot.reserve(Uses.size()); 989 for (unsigned i = 0, e = Uses.size(); i != e; ++i) { 990 const MachineInstr *MI = Indexes->getInstructionFromIndex(Uses[i]); 991 PrevSlot.push_back(getPrevMappedIndex(MI).getDefIndex()); 992 } 993} 994 995/// nextSplitPoint - Find the next index into SA->UseSlots > i such that it may 996/// be beneficial to split before UseSlots[i]. 997/// 998/// 0 is always a valid split point 999unsigned RAGreedy::nextSplitPoint(unsigned i) { 1000 const SmallVectorImpl<SlotIndex> &Uses = SA->UseSlots; 1001 const unsigned Size = Uses.size(); 1002 assert(i != Size && "No split points after the end"); 1003 // Allow split before i when Uses[i] is not adjacent to the previous use. 1004 while (++i != Size && PrevSlot[i].getBaseIndex() <= Uses[i-1].getBaseIndex()) 1005 ; 1006 return i; 1007} 1008 1009/// tryLocalSplit - Try to split VirtReg into smaller intervals inside its only 1010/// basic block. 1011/// 1012unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order, 1013 SmallVectorImpl<LiveInterval*> &NewVRegs) { 1014 assert(SA->LiveBlocks.size() == 1 && "Not a local interval"); 1015 const SplitAnalysis::BlockInfo &BI = SA->LiveBlocks.front(); 1016 1017 // Note that it is possible to have an interval that is live-in or live-out 1018 // while only covering a single block - A phi-def can use undef values from 1019 // predecessors, and the block could be a single-block loop. 1020 // We don't bother doing anything clever about such a case, we simply assume 1021 // that the interval is continuous from FirstUse to LastUse. We should make 1022 // sure that we don't do anything illegal to such an interval, though. 1023 1024 const SmallVectorImpl<SlotIndex> &Uses = SA->UseSlots; 1025 if (Uses.size() <= 2) 1026 return 0; 1027 const unsigned NumGaps = Uses.size()-1; 1028 1029 DEBUG({ 1030 dbgs() << "tryLocalSplit: "; 1031 for (unsigned i = 0, e = Uses.size(); i != e; ++i) 1032 dbgs() << ' ' << SA->UseSlots[i]; 1033 dbgs() << '\n'; 1034 }); 1035 1036 // For every use, find the previous mapped non-copy instruction. 1037 // We use this to detect valid split points, and to estimate new interval 1038 // sizes. 1039 calcPrevSlots(); 1040 1041 unsigned BestBefore = NumGaps; 1042 unsigned BestAfter = 0; 1043 float BestDiff = 0; 1044 1045 const float blockFreq = SpillPlacer->getBlockFrequency(BI.MBB->getNumber()); 1046 SmallVector<float, 8> GapWeight; 1047 1048 Order.rewind(); 1049 while (unsigned PhysReg = Order.next()) { 1050 // Keep track of the largest spill weight that would need to be evicted in 1051 // order to make use of PhysReg between UseSlots[i] and UseSlots[i+1]. 1052 calcGapWeights(PhysReg, GapWeight); 1053 1054 // Try to find the best sequence of gaps to close. 1055 // The new spill weight must be larger than any gap interference. 1056 1057 // We will split before Uses[SplitBefore] and after Uses[SplitAfter]. 1058 unsigned SplitBefore = 0, SplitAfter = nextSplitPoint(1) - 1; 1059 1060 // MaxGap should always be max(GapWeight[SplitBefore..SplitAfter-1]). 1061 // It is the spill weight that needs to be evicted. 1062 float MaxGap = GapWeight[0]; 1063 for (unsigned i = 1; i != SplitAfter; ++i) 1064 MaxGap = std::max(MaxGap, GapWeight[i]); 1065 1066 for (;;) { 1067 // Live before/after split? 1068 const bool LiveBefore = SplitBefore != 0 || BI.LiveIn; 1069 const bool LiveAfter = SplitAfter != NumGaps || BI.LiveOut; 1070 1071 DEBUG(dbgs() << PrintReg(PhysReg, TRI) << ' ' 1072 << Uses[SplitBefore] << '-' << Uses[SplitAfter] 1073 << " i=" << MaxGap); 1074 1075 // Stop before the interval gets so big we wouldn't be making progress. 1076 if (!LiveBefore && !LiveAfter) { 1077 DEBUG(dbgs() << " all\n"); 1078 break; 1079 } 1080 // Should the interval be extended or shrunk? 1081 bool Shrink = true; 1082 if (MaxGap < HUGE_VALF) { 1083 // Estimate the new spill weight. 1084 // 1085 // Each instruction reads and writes the register, except the first 1086 // instr doesn't read when !FirstLive, and the last instr doesn't write 1087 // when !LastLive. 1088 // 1089 // We will be inserting copies before and after, so the total number of 1090 // reads and writes is 2 * EstUses. 1091 // 1092 const unsigned EstUses = 2*(SplitAfter - SplitBefore) + 1093 2*(LiveBefore + LiveAfter); 1094 1095 // Try to guess the size of the new interval. This should be trivial, 1096 // but the slot index of an inserted copy can be a lot smaller than the 1097 // instruction it is inserted before if there are many dead indexes 1098 // between them. 1099 // 1100 // We measure the distance from the instruction before SplitBefore to 1101 // get a conservative estimate. 1102 // 1103 // The final distance can still be different if inserting copies 1104 // triggers a slot index renumbering. 1105 // 1106 const float EstWeight = normalizeSpillWeight(blockFreq * EstUses, 1107 PrevSlot[SplitBefore].distance(Uses[SplitAfter])); 1108 // Would this split be possible to allocate? 1109 // Never allocate all gaps, we wouldn't be making progress. 1110 float Diff = EstWeight - MaxGap; 1111 DEBUG(dbgs() << " w=" << EstWeight << " d=" << Diff); 1112 if (Diff > 0) { 1113 Shrink = false; 1114 if (Diff > BestDiff) { 1115 DEBUG(dbgs() << " (best)"); 1116 BestDiff = Diff; 1117 BestBefore = SplitBefore; 1118 BestAfter = SplitAfter; 1119 } 1120 } 1121 } 1122 1123 // Try to shrink. 1124 if (Shrink) { 1125 SplitBefore = nextSplitPoint(SplitBefore); 1126 if (SplitBefore < SplitAfter) { 1127 DEBUG(dbgs() << " shrink\n"); 1128 // Recompute the max when necessary. 1129 if (GapWeight[SplitBefore - 1] >= MaxGap) { 1130 MaxGap = GapWeight[SplitBefore]; 1131 for (unsigned i = SplitBefore + 1; i != SplitAfter; ++i) 1132 MaxGap = std::max(MaxGap, GapWeight[i]); 1133 } 1134 continue; 1135 } 1136 MaxGap = 0; 1137 } 1138 1139 // Try to extend the interval. 1140 if (SplitAfter >= NumGaps) { 1141 DEBUG(dbgs() << " end\n"); 1142 break; 1143 } 1144 1145 DEBUG(dbgs() << " extend\n"); 1146 for (unsigned e = nextSplitPoint(SplitAfter + 1) - 1; 1147 SplitAfter != e; ++SplitAfter) 1148 MaxGap = std::max(MaxGap, GapWeight[SplitAfter]); 1149 continue; 1150 } 1151 } 1152 1153 // Didn't find any candidates? 1154 if (BestBefore == NumGaps) 1155 return 0; 1156 1157 DEBUG(dbgs() << "Best local split range: " << Uses[BestBefore] 1158 << '-' << Uses[BestAfter] << ", " << BestDiff 1159 << ", " << (BestAfter - BestBefore + 1) << " instrs\n"); 1160 1161 LiveRangeEdit LREdit(VirtReg, NewVRegs, this); 1162 SE->reset(LREdit); 1163 1164 SE->openIntv(); 1165 SlotIndex SegStart = SE->enterIntvBefore(Uses[BestBefore]); 1166 SlotIndex SegStop = SE->leaveIntvAfter(Uses[BestAfter]); 1167 SE->useIntv(SegStart, SegStop); 1168 SE->closeIntv(); 1169 SE->finish(); 1170 setStage(NewVRegs.begin(), NewVRegs.end(), RS_Local); 1171 ++NumLocalSplits; 1172 1173 return 0; 1174} 1175 1176//===----------------------------------------------------------------------===// 1177// Live Range Splitting 1178//===----------------------------------------------------------------------===// 1179 1180/// trySplit - Try to split VirtReg or one of its interferences, making it 1181/// assignable. 1182/// @return Physreg when VirtReg may be assigned and/or new NewVRegs. 1183unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order, 1184 SmallVectorImpl<LiveInterval*>&NewVRegs) { 1185 // Local intervals are handled separately. 1186 if (LIS->intervalIsInOneMBB(VirtReg)) { 1187 NamedRegionTimer T("Local Splitting", TimerGroupName, TimePassesIsEnabled); 1188 SA->analyze(&VirtReg); 1189 return tryLocalSplit(VirtReg, Order, NewVRegs); 1190 } 1191 1192 NamedRegionTimer T("Global Splitting", TimerGroupName, TimePassesIsEnabled); 1193 1194 // Don't iterate global splitting. 1195 // Move straight to spilling if this range was produced by a global split. 1196 LiveRangeStage Stage = getStage(VirtReg); 1197 if (Stage >= RS_Block) 1198 return 0; 1199 1200 SA->analyze(&VirtReg); 1201 1202 // First try to split around a region spanning multiple blocks. 1203 if (Stage < RS_Region) { 1204 unsigned PhysReg = tryRegionSplit(VirtReg, Order, NewVRegs); 1205 if (PhysReg || !NewVRegs.empty()) 1206 return PhysReg; 1207 } 1208 1209 // Then isolate blocks with multiple uses. 1210 if (Stage < RS_Block) { 1211 SplitAnalysis::BlockPtrSet Blocks; 1212 if (SA->getMultiUseBlocks(Blocks)) { 1213 LiveRangeEdit LREdit(VirtReg, NewVRegs, this); 1214 SE->reset(LREdit); 1215 SE->splitSingleBlocks(Blocks); 1216 setStage(NewVRegs.begin(), NewVRegs.end(), RS_Block); 1217 if (VerifyEnabled) 1218 MF->verify(this, "After splitting live range around basic blocks"); 1219 } 1220 } 1221 1222 // Don't assign any physregs. 1223 return 0; 1224} 1225 1226 1227//===----------------------------------------------------------------------===// 1228// Main Entry Point 1229//===----------------------------------------------------------------------===// 1230 1231unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg, 1232 SmallVectorImpl<LiveInterval*> &NewVRegs) { 1233 LiveRangeStage Stage = getStage(VirtReg); 1234 if (Stage == RS_Original) 1235 LRStage[VirtReg.reg] = RS_Second; 1236 1237 // First try assigning a free register. 1238 AllocationOrder Order(VirtReg.reg, *VRM, ReservedRegs); 1239 while (unsigned PhysReg = Order.next()) { 1240 if (!checkPhysRegInterference(VirtReg, PhysReg)) 1241 return PhysReg; 1242 } 1243 1244 if (unsigned PhysReg = tryReassign(VirtReg, Order, NewVRegs)) 1245 return PhysReg; 1246 1247 if (unsigned PhysReg = tryEvict(VirtReg, Order, NewVRegs)) 1248 return PhysReg; 1249 1250 assert(NewVRegs.empty() && "Cannot append to existing NewVRegs"); 1251 1252 // The first time we see a live range, don't try to split or spill. 1253 // Wait until the second time, when all smaller ranges have been allocated. 1254 // This gives a better picture of the interference to split around. 1255 if (Stage == RS_Original) { 1256 NewVRegs.push_back(&VirtReg); 1257 return 0; 1258 } 1259 1260 assert(Stage < RS_Spill && "Cannot allocate after spilling"); 1261 1262 // Try splitting VirtReg or interferences. 1263 unsigned PhysReg = trySplit(VirtReg, Order, NewVRegs); 1264 if (PhysReg || !NewVRegs.empty()) 1265 return PhysReg; 1266 1267 // Finally spill VirtReg itself. 1268 NamedRegionTimer T("Spiller", TimerGroupName, TimePassesIsEnabled); 1269 LiveRangeEdit LRE(VirtReg, NewVRegs, this); 1270 spiller().spill(LRE); 1271 1272 if (VerifyEnabled) 1273 MF->verify(this, "After spilling"); 1274 1275 // The live virtual register requesting allocation was spilled, so tell 1276 // the caller not to allocate anything during this round. 1277 return 0; 1278} 1279 1280bool RAGreedy::runOnMachineFunction(MachineFunction &mf) { 1281 DEBUG(dbgs() << "********** GREEDY REGISTER ALLOCATION **********\n" 1282 << "********** Function: " 1283 << ((Value*)mf.getFunction())->getName() << '\n'); 1284 1285 MF = &mf; 1286 if (VerifyEnabled) 1287 MF->verify(this, "Before greedy register allocator"); 1288 1289 RegAllocBase::init(getAnalysis<VirtRegMap>(), getAnalysis<LiveIntervals>()); 1290 Indexes = &getAnalysis<SlotIndexes>(); 1291 DomTree = &getAnalysis<MachineDominatorTree>(); 1292 ReservedRegs = TRI->getReservedRegs(*MF); 1293 SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM)); 1294 Loops = &getAnalysis<MachineLoopInfo>(); 1295 LoopRanges = &getAnalysis<MachineLoopRanges>(); 1296 Bundles = &getAnalysis<EdgeBundles>(); 1297 SpillPlacer = &getAnalysis<SpillPlacement>(); 1298 1299 SA.reset(new SplitAnalysis(*VRM, *LIS, *Loops)); 1300 SE.reset(new SplitEditor(*SA, *LIS, *VRM, *DomTree)); 1301 LRStage.clear(); 1302 LRStage.resize(MRI->getNumVirtRegs()); 1303 1304 allocatePhysRegs(); 1305 addMBBLiveIns(MF); 1306 LIS->addKillFlags(); 1307 1308 // Run rewriter 1309 { 1310 NamedRegionTimer T("Rewriter", TimerGroupName, TimePassesIsEnabled); 1311 VRM->rewrite(Indexes); 1312 } 1313 1314 // The pass output is in VirtRegMap. Release all the transient data. 1315 releaseMemory(); 1316 1317 return true; 1318} 1319