1 //===------ RegAllocPBQP.cpp ---- PBQP Register Allocator -------*- C++ -*-===// 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 contains a Partitioned Boolean Quadratic Programming (PBQP) based 11 // register allocator for LLVM. This allocator works by constructing a PBQP 12 // problem representing the register allocation problem under consideration, 13 // solving this using a PBQP solver, and mapping the solution back to a 14 // register assignment. If any variables are selected for spilling then spill 15 // code is inserted and the process repeated. 16 // 17 // The PBQP solver (pbqp.c) provided for this allocator uses a heuristic tuned 18 // for register allocation. For more information on PBQP for register 19 // allocation, see the following papers: 20 // 21 // (1) Hames, L. and Scholz, B. 2006. Nearly optimal register allocation with 22 // PBQP. In Proceedings of the 7th Joint Modular Languages Conference 23 // (JMLC'06). LNCS, vol. 4228. Springer, New York, NY, USA. 346-361. 24 // 25 // (2) Scholz, B., Eckstein, E. 2002. Register allocation for irregular 26 // architectures. In Proceedings of the Joint Conference on Languages, 27 // Compilers and Tools for Embedded Systems (LCTES'02), ACM Press, New York, 28 // NY, USA, 139-148. 29 // 30 //===----------------------------------------------------------------------===// 31 32 #define DEBUG_TYPE "regalloc" 33 34 #include "RenderMachineFunction.h" 35 #include "Splitter.h" 36 #include "VirtRegMap.h" 37 #include "VirtRegRewriter.h" 38 #include "llvm/CodeGen/CalcSpillWeights.h" 39 #include "llvm/CodeGen/LiveIntervalAnalysis.h" 40 #include "llvm/CodeGen/LiveStackAnalysis.h" 41 #include "llvm/CodeGen/RegAllocPBQP.h" 42 #include "llvm/CodeGen/MachineFunctionPass.h" 43 #include "llvm/CodeGen/MachineLoopInfo.h" 44 #include "llvm/CodeGen/MachineRegisterInfo.h" 45 #include "llvm/CodeGen/PBQP/HeuristicSolver.h" 46 #include "llvm/CodeGen/PBQP/Graph.h" 47 #include "llvm/CodeGen/PBQP/Heuristics/Briggs.h" 48 #include "llvm/CodeGen/RegAllocRegistry.h" 49 #include "llvm/CodeGen/RegisterCoalescer.h" 50 #include "llvm/Support/Debug.h" 51 #include "llvm/Support/raw_ostream.h" 52 #include "llvm/Target/TargetInstrInfo.h" 53 #include "llvm/Target/TargetMachine.h" 54 #include <limits> 55 #include <memory> 56 #include <set> 57 #include <vector> 58 59 using namespace llvm; 60 61 static RegisterRegAlloc 62 registerPBQPRepAlloc("pbqp", "PBQP register allocator", 63 createDefaultPBQPRegisterAllocator); 64 65 static cl::opt<bool> 66 pbqpCoalescing("pbqp-coalescing", 67 cl::desc("Attempt coalescing during PBQP register allocation."), 68 cl::init(false), cl::Hidden); 69 70 static cl::opt<bool> 71 pbqpPreSplitting("pbqp-pre-splitting", 72 cl::desc("Pre-split before PBQP register allocation."), 73 cl::init(false), cl::Hidden); 74 75 namespace { 76 77 /// 78 /// PBQP based allocators solve the register allocation problem by mapping 79 /// register allocation problems to Partitioned Boolean Quadratic 80 /// Programming problems. 81 class RegAllocPBQP : public MachineFunctionPass { 82 public: 83 84 static char ID; 85 86 /// Construct a PBQP register allocator. 87 RegAllocPBQP(std::auto_ptr<PBQPBuilder> b) 88 : MachineFunctionPass(ID), builder(b) { 89 initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); 90 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); 91 initializeRegisterCoalescerAnalysisGroup(*PassRegistry::getPassRegistry()); 92 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry()); 93 initializeLiveStacksPass(*PassRegistry::getPassRegistry()); 94 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry()); 95 initializeLoopSplitterPass(*PassRegistry::getPassRegistry()); 96 initializeVirtRegMapPass(*PassRegistry::getPassRegistry()); 97 initializeRenderMachineFunctionPass(*PassRegistry::getPassRegistry()); 98 } 99 100 /// Return the pass name. 101 virtual const char* getPassName() const { 102 return "PBQP Register Allocator"; 103 } 104 105 /// PBQP analysis usage. 106 virtual void getAnalysisUsage(AnalysisUsage &au) const; 107 108 /// Perform register allocation 109 virtual bool runOnMachineFunction(MachineFunction &MF); 110 111 private: 112 113 typedef std::map<const LiveInterval*, unsigned> LI2NodeMap; 114 typedef std::vector<const LiveInterval*> Node2LIMap; 115 typedef std::vector<unsigned> AllowedSet; 116 typedef std::vector<AllowedSet> AllowedSetMap; 117 typedef std::pair<unsigned, unsigned> RegPair; 118 typedef std::map<RegPair, PBQP::PBQPNum> CoalesceMap; 119 typedef std::vector<PBQP::Graph::NodeItr> NodeVector; 120 typedef std::set<unsigned> RegSet; 121 122 123 std::auto_ptr<PBQPBuilder> builder; 124 125 MachineFunction *mf; 126 const TargetMachine *tm; 127 const TargetRegisterInfo *tri; 128 const TargetInstrInfo *tii; 129 const MachineLoopInfo *loopInfo; 130 MachineRegisterInfo *mri; 131 RenderMachineFunction *rmf; 132 133 LiveIntervals *lis; 134 LiveStacks *lss; 135 VirtRegMap *vrm; 136 137 RegSet vregsToAlloc, emptyIntervalVRegs; 138 139 /// \brief Finds the initial set of vreg intervals to allocate. 140 void findVRegIntervalsToAlloc(); 141 142 /// \brief Adds a stack interval if the given live interval has been 143 /// spilled. Used to support stack slot coloring. 144 void addStackInterval(const LiveInterval *spilled,MachineRegisterInfo* mri); 145 146 /// \brief Given a solved PBQP problem maps this solution back to a register 147 /// assignment. 148 bool mapPBQPToRegAlloc(const PBQPRAProblem &problem, 149 const PBQP::Solution &solution); 150 151 /// \brief Postprocessing before final spilling. Sets basic block "live in" 152 /// variables. 153 void finalizeAlloc() const; 154 155 }; 156 157 char RegAllocPBQP::ID = 0; 158 159 } // End anonymous namespace. 160 161 unsigned PBQPRAProblem::getVRegForNode(PBQP::Graph::ConstNodeItr node) const { 162 Node2VReg::const_iterator vregItr = node2VReg.find(node); 163 assert(vregItr != node2VReg.end() && "No vreg for node."); 164 return vregItr->second; 165 } 166 167 PBQP::Graph::NodeItr PBQPRAProblem::getNodeForVReg(unsigned vreg) const { 168 VReg2Node::const_iterator nodeItr = vreg2Node.find(vreg); 169 assert(nodeItr != vreg2Node.end() && "No node for vreg."); 170 return nodeItr->second; 171 172 } 173 174 const PBQPRAProblem::AllowedSet& 175 PBQPRAProblem::getAllowedSet(unsigned vreg) const { 176 AllowedSetMap::const_iterator allowedSetItr = allowedSets.find(vreg); 177 assert(allowedSetItr != allowedSets.end() && "No pregs for vreg."); 178 const AllowedSet &allowedSet = allowedSetItr->second; 179 return allowedSet; 180 } 181 182 unsigned PBQPRAProblem::getPRegForOption(unsigned vreg, unsigned option) const { 183 assert(isPRegOption(vreg, option) && "Not a preg option."); 184 185 const AllowedSet& allowedSet = getAllowedSet(vreg); 186 assert(option <= allowedSet.size() && "Option outside allowed set."); 187 return allowedSet[option - 1]; 188 } 189 190 std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf, 191 const LiveIntervals *lis, 192 const MachineLoopInfo *loopInfo, 193 const RegSet &vregs) { 194 195 typedef std::vector<const LiveInterval*> LIVector; 196 197 MachineRegisterInfo *mri = &mf->getRegInfo(); 198 const TargetRegisterInfo *tri = mf->getTarget().getRegisterInfo(); 199 200 std::auto_ptr<PBQPRAProblem> p(new PBQPRAProblem()); 201 PBQP::Graph &g = p->getGraph(); 202 RegSet pregs; 203 204 // Collect the set of preg intervals, record that they're used in the MF. 205 for (LiveIntervals::const_iterator itr = lis->begin(), end = lis->end(); 206 itr != end; ++itr) { 207 if (TargetRegisterInfo::isPhysicalRegister(itr->first)) { 208 pregs.insert(itr->first); 209 mri->setPhysRegUsed(itr->first); 210 } 211 } 212 213 BitVector reservedRegs = tri->getReservedRegs(*mf); 214 215 // Iterate over vregs. 216 for (RegSet::const_iterator vregItr = vregs.begin(), vregEnd = vregs.end(); 217 vregItr != vregEnd; ++vregItr) { 218 unsigned vreg = *vregItr; 219 const TargetRegisterClass *trc = mri->getRegClass(vreg); 220 const LiveInterval *vregLI = &lis->getInterval(vreg); 221 222 // Compute an initial allowed set for the current vreg. 223 typedef std::vector<unsigned> VRAllowed; 224 VRAllowed vrAllowed; 225 for (TargetRegisterClass::iterator aoItr = trc->allocation_order_begin(*mf), 226 aoEnd = trc->allocation_order_end(*mf); 227 aoItr != aoEnd; ++aoItr) { 228 unsigned preg = *aoItr; 229 if (!reservedRegs.test(preg)) { 230 vrAllowed.push_back(preg); 231 } 232 } 233 234 // Remove any physical registers which overlap. 235 for (RegSet::const_iterator pregItr = pregs.begin(), 236 pregEnd = pregs.end(); 237 pregItr != pregEnd; ++pregItr) { 238 unsigned preg = *pregItr; 239 const LiveInterval *pregLI = &lis->getInterval(preg); 240 241 if (pregLI->empty()) { 242 continue; 243 } 244 245 if (!vregLI->overlaps(*pregLI)) { 246 continue; 247 } 248 249 // Remove the register from the allowed set. 250 VRAllowed::iterator eraseItr = 251 std::find(vrAllowed.begin(), vrAllowed.end(), preg); 252 253 if (eraseItr != vrAllowed.end()) { 254 vrAllowed.erase(eraseItr); 255 } 256 257 // Also remove any aliases. 258 const unsigned *aliasItr = tri->getAliasSet(preg); 259 if (aliasItr != 0) { 260 for (; *aliasItr != 0; ++aliasItr) { 261 VRAllowed::iterator eraseItr = 262 std::find(vrAllowed.begin(), vrAllowed.end(), *aliasItr); 263 264 if (eraseItr != vrAllowed.end()) { 265 vrAllowed.erase(eraseItr); 266 } 267 } 268 } 269 } 270 271 // Construct the node. 272 PBQP::Graph::NodeItr node = 273 g.addNode(PBQP::Vector(vrAllowed.size() + 1, 0)); 274 275 // Record the mapping and allowed set in the problem. 276 p->recordVReg(vreg, node, vrAllowed.begin(), vrAllowed.end()); 277 278 PBQP::PBQPNum spillCost = (vregLI->weight != 0.0) ? 279 vregLI->weight : std::numeric_limits<PBQP::PBQPNum>::min(); 280 281 addSpillCosts(g.getNodeCosts(node), spillCost); 282 } 283 284 for (RegSet::const_iterator vr1Itr = vregs.begin(), vrEnd = vregs.end(); 285 vr1Itr != vrEnd; ++vr1Itr) { 286 unsigned vr1 = *vr1Itr; 287 const LiveInterval &l1 = lis->getInterval(vr1); 288 const PBQPRAProblem::AllowedSet &vr1Allowed = p->getAllowedSet(vr1); 289 290 for (RegSet::const_iterator vr2Itr = llvm::next(vr1Itr); 291 vr2Itr != vrEnd; ++vr2Itr) { 292 unsigned vr2 = *vr2Itr; 293 const LiveInterval &l2 = lis->getInterval(vr2); 294 const PBQPRAProblem::AllowedSet &vr2Allowed = p->getAllowedSet(vr2); 295 296 assert(!l2.empty() && "Empty interval in vreg set?"); 297 if (l1.overlaps(l2)) { 298 PBQP::Graph::EdgeItr edge = 299 g.addEdge(p->getNodeForVReg(vr1), p->getNodeForVReg(vr2), 300 PBQP::Matrix(vr1Allowed.size()+1, vr2Allowed.size()+1, 0)); 301 302 addInterferenceCosts(g.getEdgeCosts(edge), vr1Allowed, vr2Allowed, tri); 303 } 304 } 305 } 306 307 return p; 308 } 309 310 void PBQPBuilder::addSpillCosts(PBQP::Vector &costVec, 311 PBQP::PBQPNum spillCost) { 312 costVec[0] = spillCost; 313 } 314 315 void PBQPBuilder::addInterferenceCosts( 316 PBQP::Matrix &costMat, 317 const PBQPRAProblem::AllowedSet &vr1Allowed, 318 const PBQPRAProblem::AllowedSet &vr2Allowed, 319 const TargetRegisterInfo *tri) { 320 assert(costMat.getRows() == vr1Allowed.size() + 1 && "Matrix height mismatch."); 321 assert(costMat.getCols() == vr2Allowed.size() + 1 && "Matrix width mismatch."); 322 323 for (unsigned i = 0; i != vr1Allowed.size(); ++i) { 324 unsigned preg1 = vr1Allowed[i]; 325 326 for (unsigned j = 0; j != vr2Allowed.size(); ++j) { 327 unsigned preg2 = vr2Allowed[j]; 328 329 if (tri->regsOverlap(preg1, preg2)) { 330 costMat[i + 1][j + 1] = std::numeric_limits<PBQP::PBQPNum>::infinity(); 331 } 332 } 333 } 334 } 335 336 std::auto_ptr<PBQPRAProblem> PBQPBuilderWithCoalescing::build( 337 MachineFunction *mf, 338 const LiveIntervals *lis, 339 const MachineLoopInfo *loopInfo, 340 const RegSet &vregs) { 341 342 std::auto_ptr<PBQPRAProblem> p = PBQPBuilder::build(mf, lis, loopInfo, vregs); 343 PBQP::Graph &g = p->getGraph(); 344 345 const TargetMachine &tm = mf->getTarget(); 346 CoalescerPair cp(*tm.getInstrInfo(), *tm.getRegisterInfo()); 347 348 // Scan the machine function and add a coalescing cost whenever CoalescerPair 349 // gives the Ok. 350 for (MachineFunction::const_iterator mbbItr = mf->begin(), 351 mbbEnd = mf->end(); 352 mbbItr != mbbEnd; ++mbbItr) { 353 const MachineBasicBlock *mbb = &*mbbItr; 354 355 for (MachineBasicBlock::const_iterator miItr = mbb->begin(), 356 miEnd = mbb->end(); 357 miItr != miEnd; ++miItr) { 358 const MachineInstr *mi = &*miItr; 359 360 if (!cp.setRegisters(mi)) { 361 continue; // Not coalescable. 362 } 363 364 if (cp.getSrcReg() == cp.getDstReg()) { 365 continue; // Already coalesced. 366 } 367 368 unsigned dst = cp.getDstReg(), 369 src = cp.getSrcReg(); 370 371 const float copyFactor = 0.5; // Cost of copy relative to load. Current 372 // value plucked randomly out of the air. 373 374 PBQP::PBQPNum cBenefit = 375 copyFactor * LiveIntervals::getSpillWeight(false, true, 376 loopInfo->getLoopDepth(mbb)); 377 378 if (cp.isPhys()) { 379 if (!lis->isAllocatable(dst)) { 380 continue; 381 } 382 383 const PBQPRAProblem::AllowedSet &allowed = p->getAllowedSet(src); 384 unsigned pregOpt = 0; 385 while (pregOpt < allowed.size() && allowed[pregOpt] != dst) { 386 ++pregOpt; 387 } 388 if (pregOpt < allowed.size()) { 389 ++pregOpt; // +1 to account for spill option. 390 PBQP::Graph::NodeItr node = p->getNodeForVReg(src); 391 addPhysRegCoalesce(g.getNodeCosts(node), pregOpt, cBenefit); 392 } 393 } else { 394 const PBQPRAProblem::AllowedSet *allowed1 = &p->getAllowedSet(dst); 395 const PBQPRAProblem::AllowedSet *allowed2 = &p->getAllowedSet(src); 396 PBQP::Graph::NodeItr node1 = p->getNodeForVReg(dst); 397 PBQP::Graph::NodeItr node2 = p->getNodeForVReg(src); 398 PBQP::Graph::EdgeItr edge = g.findEdge(node1, node2); 399 if (edge == g.edgesEnd()) { 400 edge = g.addEdge(node1, node2, PBQP::Matrix(allowed1->size() + 1, 401 allowed2->size() + 1, 402 0)); 403 } else { 404 if (g.getEdgeNode1(edge) == node2) { 405 std::swap(node1, node2); 406 std::swap(allowed1, allowed2); 407 } 408 } 409 410 addVirtRegCoalesce(g.getEdgeCosts(edge), *allowed1, *allowed2, 411 cBenefit); 412 } 413 } 414 } 415 416 return p; 417 } 418 419 void PBQPBuilderWithCoalescing::addPhysRegCoalesce(PBQP::Vector &costVec, 420 unsigned pregOption, 421 PBQP::PBQPNum benefit) { 422 costVec[pregOption] += -benefit; 423 } 424 425 void PBQPBuilderWithCoalescing::addVirtRegCoalesce( 426 PBQP::Matrix &costMat, 427 const PBQPRAProblem::AllowedSet &vr1Allowed, 428 const PBQPRAProblem::AllowedSet &vr2Allowed, 429 PBQP::PBQPNum benefit) { 430 431 assert(costMat.getRows() == vr1Allowed.size() + 1 && "Size mismatch."); 432 assert(costMat.getCols() == vr2Allowed.size() + 1 && "Size mismatch."); 433 434 for (unsigned i = 0; i != vr1Allowed.size(); ++i) { 435 unsigned preg1 = vr1Allowed[i]; 436 for (unsigned j = 0; j != vr2Allowed.size(); ++j) { 437 unsigned preg2 = vr2Allowed[j]; 438 439 if (preg1 == preg2) { 440 costMat[i + 1][j + 1] += -benefit; 441 } 442 } 443 } 444 } 445 446 447 void RegAllocPBQP::getAnalysisUsage(AnalysisUsage &au) const { 448 au.addRequired<SlotIndexes>(); 449 au.addPreserved<SlotIndexes>(); 450 au.addRequired<LiveIntervals>(); 451 //au.addRequiredID(SplitCriticalEdgesID); 452 au.addRequired<RegisterCoalescer>(); 453 au.addRequired<CalculateSpillWeights>(); 454 au.addRequired<LiveStacks>(); 455 au.addPreserved<LiveStacks>(); 456 au.addRequired<MachineLoopInfo>(); 457 au.addPreserved<MachineLoopInfo>(); 458 if (pbqpPreSplitting) 459 au.addRequired<LoopSplitter>(); 460 au.addRequired<VirtRegMap>(); 461 au.addRequired<RenderMachineFunction>(); 462 MachineFunctionPass::getAnalysisUsage(au); 463 } 464 465 void RegAllocPBQP::findVRegIntervalsToAlloc() { 466 467 // Iterate over all live ranges. 468 for (LiveIntervals::iterator itr = lis->begin(), end = lis->end(); 469 itr != end; ++itr) { 470 471 // Ignore physical ones. 472 if (TargetRegisterInfo::isPhysicalRegister(itr->first)) 473 continue; 474 475 LiveInterval *li = itr->second; 476 477 // If this live interval is non-empty we will use pbqp to allocate it. 478 // Empty intervals we allocate in a simple post-processing stage in 479 // finalizeAlloc. 480 if (!li->empty()) { 481 vregsToAlloc.insert(li->reg); 482 } else { 483 emptyIntervalVRegs.insert(li->reg); 484 } 485 } 486 } 487 488 void RegAllocPBQP::addStackInterval(const LiveInterval *spilled, 489 MachineRegisterInfo* mri) { 490 int stackSlot = vrm->getStackSlot(spilled->reg); 491 492 if (stackSlot == VirtRegMap::NO_STACK_SLOT) { 493 return; 494 } 495 496 const TargetRegisterClass *RC = mri->getRegClass(spilled->reg); 497 LiveInterval &stackInterval = lss->getOrCreateInterval(stackSlot, RC); 498 499 VNInfo *vni; 500 if (stackInterval.getNumValNums() != 0) { 501 vni = stackInterval.getValNumInfo(0); 502 } else { 503 vni = stackInterval.getNextValue( 504 SlotIndex(), 0, lss->getVNInfoAllocator()); 505 } 506 507 LiveInterval &rhsInterval = lis->getInterval(spilled->reg); 508 stackInterval.MergeRangesInAsValue(rhsInterval, vni); 509 } 510 511 bool RegAllocPBQP::mapPBQPToRegAlloc(const PBQPRAProblem &problem, 512 const PBQP::Solution &solution) { 513 // Set to true if we have any spills 514 bool anotherRoundNeeded = false; 515 516 // Clear the existing allocation. 517 vrm->clearAllVirt(); 518 519 const PBQP::Graph &g = problem.getGraph(); 520 // Iterate over the nodes mapping the PBQP solution to a register 521 // assignment. 522 for (PBQP::Graph::ConstNodeItr node = g.nodesBegin(), 523 nodeEnd = g.nodesEnd(); 524 node != nodeEnd; ++node) { 525 unsigned vreg = problem.getVRegForNode(node); 526 unsigned alloc = solution.getSelection(node); 527 528 if (problem.isPRegOption(vreg, alloc)) { 529 unsigned preg = problem.getPRegForOption(vreg, alloc); 530 DEBUG(dbgs() << "VREG " << vreg << " -> " << tri->getName(preg) << "\n"); 531 assert(preg != 0 && "Invalid preg selected."); 532 vrm->assignVirt2Phys(vreg, preg); 533 } else if (problem.isSpillOption(vreg, alloc)) { 534 vregsToAlloc.erase(vreg); 535 const LiveInterval* spillInterval = &lis->getInterval(vreg); 536 double oldWeight = spillInterval->weight; 537 SmallVector<LiveInterval*, 8> spillIs; 538 rmf->rememberUseDefs(spillInterval); 539 std::vector<LiveInterval*> newSpills = 540 lis->addIntervalsForSpills(*spillInterval, spillIs, loopInfo, *vrm); 541 addStackInterval(spillInterval, mri); 542 rmf->rememberSpills(spillInterval, newSpills); 543 544 (void) oldWeight; 545 DEBUG(dbgs() << "VREG " << vreg << " -> SPILLED (Cost: " 546 << oldWeight << ", New vregs: "); 547 548 // Copy any newly inserted live intervals into the list of regs to 549 // allocate. 550 for (std::vector<LiveInterval*>::const_iterator 551 itr = newSpills.begin(), end = newSpills.end(); 552 itr != end; ++itr) { 553 assert(!(*itr)->empty() && "Empty spill range."); 554 DEBUG(dbgs() << (*itr)->reg << " "); 555 vregsToAlloc.insert((*itr)->reg); 556 } 557 558 DEBUG(dbgs() << ")\n"); 559 560 // We need another round if spill intervals were added. 561 anotherRoundNeeded |= !newSpills.empty(); 562 } else { 563 assert(false && "Unknown allocation option."); 564 } 565 } 566 567 return !anotherRoundNeeded; 568 } 569 570 571 void RegAllocPBQP::finalizeAlloc() const { 572 typedef LiveIntervals::iterator LIIterator; 573 typedef LiveInterval::Ranges::const_iterator LRIterator; 574 575 // First allocate registers for the empty intervals. 576 for (RegSet::const_iterator 577 itr = emptyIntervalVRegs.begin(), end = emptyIntervalVRegs.end(); 578 itr != end; ++itr) { 579 LiveInterval *li = &lis->getInterval(*itr); 580 581 unsigned physReg = vrm->getRegAllocPref(li->reg); 582 583 if (physReg == 0) { 584 const TargetRegisterClass *liRC = mri->getRegClass(li->reg); 585 physReg = *liRC->allocation_order_begin(*mf); 586 } 587 588 vrm->assignVirt2Phys(li->reg, physReg); 589 } 590 591 // Finally iterate over the basic blocks to compute and set the live-in sets. 592 SmallVector<MachineBasicBlock*, 8> liveInMBBs; 593 MachineBasicBlock *entryMBB = &*mf->begin(); 594 595 for (LIIterator liItr = lis->begin(), liEnd = lis->end(); 596 liItr != liEnd; ++liItr) { 597 598 const LiveInterval *li = liItr->second; 599 unsigned reg = 0; 600 601 // Get the physical register for this interval 602 if (TargetRegisterInfo::isPhysicalRegister(li->reg)) { 603 reg = li->reg; 604 } else if (vrm->isAssignedReg(li->reg)) { 605 reg = vrm->getPhys(li->reg); 606 } else { 607 // Ranges which are assigned a stack slot only are ignored. 608 continue; 609 } 610 611 if (reg == 0) { 612 // Filter out zero regs - they're for intervals that were spilled. 613 continue; 614 } 615 616 // Iterate over the ranges of the current interval... 617 for (LRIterator lrItr = li->begin(), lrEnd = li->end(); 618 lrItr != lrEnd; ++lrItr) { 619 620 // Find the set of basic blocks which this range is live into... 621 if (lis->findLiveInMBBs(lrItr->start, lrItr->end, liveInMBBs)) { 622 // And add the physreg for this interval to their live-in sets. 623 for (unsigned i = 0; i != liveInMBBs.size(); ++i) { 624 if (liveInMBBs[i] != entryMBB) { 625 if (!liveInMBBs[i]->isLiveIn(reg)) { 626 liveInMBBs[i]->addLiveIn(reg); 627 } 628 } 629 } 630 liveInMBBs.clear(); 631 } 632 } 633 } 634 635 } 636 637 bool RegAllocPBQP::runOnMachineFunction(MachineFunction &MF) { 638 639 mf = &MF; 640 tm = &mf->getTarget(); 641 tri = tm->getRegisterInfo(); 642 tii = tm->getInstrInfo(); 643 mri = &mf->getRegInfo(); 644 645 lis = &getAnalysis<LiveIntervals>(); 646 lss = &getAnalysis<LiveStacks>(); 647 loopInfo = &getAnalysis<MachineLoopInfo>(); 648 rmf = &getAnalysis<RenderMachineFunction>(); 649 650 vrm = &getAnalysis<VirtRegMap>(); 651 652 653 DEBUG(dbgs() << "PBQP Register Allocating for " << mf->getFunction()->getName() << "\n"); 654 655 // Allocator main loop: 656 // 657 // * Map current regalloc problem to a PBQP problem 658 // * Solve the PBQP problem 659 // * Map the solution back to a register allocation 660 // * Spill if necessary 661 // 662 // This process is continued till no more spills are generated. 663 664 // Find the vreg intervals in need of allocation. 665 findVRegIntervalsToAlloc(); 666 667 // If there are non-empty intervals allocate them using pbqp. 668 if (!vregsToAlloc.empty()) { 669 670 bool pbqpAllocComplete = false; 671 unsigned round = 0; 672 673 while (!pbqpAllocComplete) { 674 DEBUG(dbgs() << " PBQP Regalloc round " << round << ":\n"); 675 676 std::auto_ptr<PBQPRAProblem> problem = 677 builder->build(mf, lis, loopInfo, vregsToAlloc); 678 PBQP::Solution solution = 679 PBQP::HeuristicSolver<PBQP::Heuristics::Briggs>::solve( 680 problem->getGraph()); 681 682 pbqpAllocComplete = mapPBQPToRegAlloc(*problem, solution); 683 684 ++round; 685 } 686 } 687 688 // Finalise allocation, allocate empty ranges. 689 finalizeAlloc(); 690 691 rmf->renderMachineFunction("After PBQP register allocation.", vrm); 692 693 vregsToAlloc.clear(); 694 emptyIntervalVRegs.clear(); 695 696 DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *vrm << "\n"); 697 698 // Run rewriter 699 std::auto_ptr<VirtRegRewriter> rewriter(createVirtRegRewriter()); 700 701 rewriter->runOnMachineFunction(*mf, *vrm, lis); 702 703 return true; 704 } 705 706 FunctionPass* llvm::createPBQPRegisterAllocator( 707 std::auto_ptr<PBQPBuilder> builder) { 708 return new RegAllocPBQP(builder); 709 } 710 711 FunctionPass* llvm::createDefaultPBQPRegisterAllocator() { 712 if (pbqpCoalescing) { 713 return createPBQPRegisterAllocator( 714 std::auto_ptr<PBQPBuilder>(new PBQPBuilderWithCoalescing())); 715 } // else 716 return createPBQPRegisterAllocator( 717 std::auto_ptr<PBQPBuilder>(new PBQPBuilder())); 718 } 719 720 #undef DEBUG_TYPE 721