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