1 //===------ RegAllocPBQP.cpp ---- PBQP Register Allocator -------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
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:
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.
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,
30 //===----------------------------------------------------------------------===//
32 #define DEBUG_TYPE "regalloc"
34 #include "RenderMachineFunction.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"
61 static RegisterRegAlloc
62 registerPBQPRepAlloc("pbqp", "PBQP register allocator",
63 createDefaultPBQPRegisterAllocator
);
66 pbqpCoalescing("pbqp-coalescing",
67 cl::desc("Attempt coalescing during PBQP register allocation."),
68 cl::init(false), cl::Hidden
);
71 pbqpPreSplitting("pbqp-pre-splitting",
72 cl::desc("Pre-split before PBQP register allocation."),
73 cl::init(false), cl::Hidden
);
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
{
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());
100 /// Return the pass name.
101 virtual const char* getPassName() const {
102 return "PBQP Register Allocator";
105 /// PBQP analysis usage.
106 virtual void getAnalysisUsage(AnalysisUsage
&au
) const;
108 /// Perform register allocation
109 virtual bool runOnMachineFunction(MachineFunction
&MF
);
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
;
123 std::auto_ptr
<PBQPBuilder
> builder
;
126 const TargetMachine
*tm
;
127 const TargetRegisterInfo
*tri
;
128 const TargetInstrInfo
*tii
;
129 const MachineLoopInfo
*loopInfo
;
130 MachineRegisterInfo
*mri
;
131 RenderMachineFunction
*rmf
;
137 RegSet vregsToAlloc
, emptyIntervalVRegs
;
139 /// \brief Finds the initial set of vreg intervals to allocate.
140 void findVRegIntervalsToAlloc();
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
);
146 /// \brief Given a solved PBQP problem maps this solution back to a register
148 bool mapPBQPToRegAlloc(const PBQPRAProblem
&problem
,
149 const PBQP::Solution
&solution
);
151 /// \brief Postprocessing before final spilling. Sets basic block "live in"
153 void finalizeAlloc() const;
157 char RegAllocPBQP::ID
= 0;
159 } // End anonymous namespace.
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
;
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
;
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
;
182 unsigned PBQPRAProblem::getPRegForOption(unsigned vreg
, unsigned option
) const {
183 assert(isPRegOption(vreg
, option
) && "Not a preg option.");
185 const AllowedSet
& allowedSet
= getAllowedSet(vreg
);
186 assert(option
<= allowedSet
.size() && "Option outside allowed set.");
187 return allowedSet
[option
- 1];
190 std::auto_ptr
<PBQPRAProblem
> PBQPBuilder::build(MachineFunction
*mf
,
191 const LiveIntervals
*lis
,
192 const MachineLoopInfo
*loopInfo
,
193 const RegSet
&vregs
) {
195 typedef std::vector
<const LiveInterval
*> LIVector
;
197 MachineRegisterInfo
*mri
= &mf
->getRegInfo();
198 const TargetRegisterInfo
*tri
= mf
->getTarget().getRegisterInfo();
200 std::auto_ptr
<PBQPRAProblem
> p(new PBQPRAProblem());
201 PBQP::Graph
&g
= p
->getGraph();
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();
207 if (TargetRegisterInfo::isPhysicalRegister(itr
->first
)) {
208 pregs
.insert(itr
->first
);
209 mri
->setPhysRegUsed(itr
->first
);
213 BitVector reservedRegs
= tri
->getReservedRegs(*mf
);
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
);
222 // Compute an initial allowed set for the current vreg.
223 typedef std::vector
<unsigned> 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
);
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
);
244 if (!vregLI
->overlaps(*pregLI
))
247 // Remove the register from the allowed set.
248 VRAllowed::iterator eraseItr
=
249 std::find(vrAllowed
.begin(), vrAllowed
.end(), preg
);
251 if (eraseItr
!= vrAllowed
.end()) {
252 vrAllowed
.erase(eraseItr
);
255 // Also remove any aliases.
256 const unsigned *aliasItr
= tri
->getAliasSet(preg
);
258 for (; *aliasItr
!= 0; ++aliasItr
) {
259 VRAllowed::iterator eraseItr
=
260 std::find(vrAllowed
.begin(), vrAllowed
.end(), *aliasItr
);
262 if (eraseItr
!= vrAllowed
.end()) {
263 vrAllowed
.erase(eraseItr
);
269 // Construct the node.
270 PBQP::Graph::NodeItr node
=
271 g
.addNode(PBQP::Vector(vrAllowed
.size() + 1, 0));
273 // Record the mapping and allowed set in the problem.
274 p
->recordVReg(vreg
, node
, vrAllowed
.begin(), vrAllowed
.end());
276 PBQP::PBQPNum spillCost
= (vregLI
->weight
!= 0.0) ?
277 vregLI
->weight
: std::numeric_limits
<PBQP::PBQPNum
>::min();
279 addSpillCosts(g
.getNodeCosts(node
), spillCost
);
282 for (RegSet::const_iterator vr1Itr
= vregs
.begin(), vrEnd
= vregs
.end();
283 vr1Itr
!= vrEnd
; ++vr1Itr
) {
284 unsigned vr1
= *vr1Itr
;
285 const LiveInterval
&l1
= lis
->getInterval(vr1
);
286 const PBQPRAProblem::AllowedSet
&vr1Allowed
= p
->getAllowedSet(vr1
);
288 for (RegSet::const_iterator vr2Itr
= llvm::next(vr1Itr
);
289 vr2Itr
!= vrEnd
; ++vr2Itr
) {
290 unsigned vr2
= *vr2Itr
;
291 const LiveInterval
&l2
= lis
->getInterval(vr2
);
292 const PBQPRAProblem::AllowedSet
&vr2Allowed
= p
->getAllowedSet(vr2
);
294 assert(!l2
.empty() && "Empty interval in vreg set?");
295 if (l1
.overlaps(l2
)) {
296 PBQP::Graph::EdgeItr edge
=
297 g
.addEdge(p
->getNodeForVReg(vr1
), p
->getNodeForVReg(vr2
),
298 PBQP::Matrix(vr1Allowed
.size()+1, vr2Allowed
.size()+1, 0));
300 addInterferenceCosts(g
.getEdgeCosts(edge
), vr1Allowed
, vr2Allowed
, tri
);
308 void PBQPBuilder::addSpillCosts(PBQP::Vector
&costVec
,
309 PBQP::PBQPNum spillCost
) {
310 costVec
[0] = spillCost
;
313 void PBQPBuilder::addInterferenceCosts(
314 PBQP::Matrix
&costMat
,
315 const PBQPRAProblem::AllowedSet
&vr1Allowed
,
316 const PBQPRAProblem::AllowedSet
&vr2Allowed
,
317 const TargetRegisterInfo
*tri
) {
318 assert(costMat
.getRows() == vr1Allowed
.size() + 1 && "Matrix height mismatch.");
319 assert(costMat
.getCols() == vr2Allowed
.size() + 1 && "Matrix width mismatch.");
321 for (unsigned i
= 0; i
< vr1Allowed
.size(); ++i
) {
322 unsigned preg1
= vr1Allowed
[i
];
324 for (unsigned j
= 0; j
< vr2Allowed
.size(); ++j
) {
325 unsigned preg2
= vr2Allowed
[j
];
327 if (tri
->regsOverlap(preg1
, preg2
)) {
328 costMat
[i
+ 1][j
+ 1] = std::numeric_limits
<PBQP::PBQPNum
>::infinity();
334 std::auto_ptr
<PBQPRAProblem
> PBQPBuilderWithCoalescing::build(
336 const LiveIntervals
*lis
,
337 const MachineLoopInfo
*loopInfo
,
338 const RegSet
&vregs
) {
340 std::auto_ptr
<PBQPRAProblem
> p
= PBQPBuilder::build(mf
, lis
, loopInfo
, vregs
);
341 PBQP::Graph
&g
= p
->getGraph();
343 const TargetMachine
&tm
= mf
->getTarget();
344 CoalescerPair
cp(*tm
.getInstrInfo(), *tm
.getRegisterInfo());
346 // Scan the machine function and add a coalescing cost whenever CoalescerPair
348 for (MachineFunction::const_iterator mbbItr
= mf
->begin(),
350 mbbItr
!= mbbEnd
; ++mbbItr
) {
351 const MachineBasicBlock
*mbb
= &*mbbItr
;
353 for (MachineBasicBlock::const_iterator miItr
= mbb
->begin(),
355 miItr
!= miEnd
; ++miItr
) {
356 const MachineInstr
*mi
= &*miItr
;
358 if (!cp
.setRegisters(mi
))
359 continue; // Not coalescable.
361 if (cp
.getSrcReg() == cp
.getDstReg())
362 continue; // Already coalesced.
364 unsigned dst
= cp
.getDstReg(),
365 src
= cp
.getSrcReg();
367 const float copyFactor
= 0.5; // Cost of copy relative to load. Current
368 // value plucked randomly out of the air.
370 PBQP::PBQPNum cBenefit
=
371 copyFactor
* LiveIntervals::getSpillWeight(false, true,
372 loopInfo
->getLoopDepth(mbb
));
375 if (!lis
->isAllocatable(dst
))
378 const PBQPRAProblem::AllowedSet
&allowed
= p
->getAllowedSet(src
);
379 unsigned pregOpt
= 0;
380 while (pregOpt
< allowed
.size() && allowed
[pregOpt
] != dst
)
382 if (pregOpt
< allowed
.size()) {
383 ++pregOpt
; // +1 to account for spill option.
384 PBQP::Graph::NodeItr node
= p
->getNodeForVReg(src
);
385 addPhysRegCoalesce(g
.getNodeCosts(node
), pregOpt
, cBenefit
);
388 const PBQPRAProblem::AllowedSet
*allowed1
= &p
->getAllowedSet(dst
);
389 const PBQPRAProblem::AllowedSet
*allowed2
= &p
->getAllowedSet(src
);
390 PBQP::Graph::NodeItr node1
= p
->getNodeForVReg(dst
);
391 PBQP::Graph::NodeItr node2
= p
->getNodeForVReg(src
);
392 PBQP::Graph::EdgeItr edge
= g
.findEdge(node1
, node2
);
393 if (edge
== g
.edgesEnd()) {
394 edge
= g
.addEdge(node1
, node2
, PBQP::Matrix(allowed1
->size() + 1,
395 allowed2
->size() + 1,
398 if (g
.getEdgeNode1(edge
) == node2
) {
399 std::swap(node1
, node2
);
400 std::swap(allowed1
, allowed2
);
404 addVirtRegCoalesce(g
.getEdgeCosts(edge
), *allowed1
, *allowed2
,
413 void PBQPBuilderWithCoalescing::addPhysRegCoalesce(PBQP::Vector
&costVec
,
415 PBQP::PBQPNum benefit
) {
416 costVec
[pregOption
] += -benefit
;
419 void PBQPBuilderWithCoalescing::addVirtRegCoalesce(
420 PBQP::Matrix
&costMat
,
421 const PBQPRAProblem::AllowedSet
&vr1Allowed
,
422 const PBQPRAProblem::AllowedSet
&vr2Allowed
,
423 PBQP::PBQPNum benefit
) {
425 assert(costMat
.getRows() == vr1Allowed
.size() + 1 && "Size mismatch.");
426 assert(costMat
.getCols() == vr2Allowed
.size() + 1 && "Size mismatch.");
428 for (unsigned i
= 0; i
< vr1Allowed
.size(); ++i
) {
429 unsigned preg1
= vr1Allowed
[i
];
430 for (unsigned j
= 0; j
< vr2Allowed
.size(); ++j
) {
431 unsigned preg2
= vr2Allowed
[j
];
433 if (preg1
== preg2
) {
434 costMat
[i
+ 1][j
+ 1] += -benefit
;
441 void RegAllocPBQP::getAnalysisUsage(AnalysisUsage
&au
) const {
442 au
.addRequired
<SlotIndexes
>();
443 au
.addPreserved
<SlotIndexes
>();
444 au
.addRequired
<LiveIntervals
>();
445 //au.addRequiredID(SplitCriticalEdgesID);
446 au
.addRequired
<RegisterCoalescer
>();
447 au
.addRequired
<CalculateSpillWeights
>();
448 au
.addRequired
<LiveStacks
>();
449 au
.addPreserved
<LiveStacks
>();
450 au
.addRequired
<MachineLoopInfo
>();
451 au
.addPreserved
<MachineLoopInfo
>();
452 if (pbqpPreSplitting
)
453 au
.addRequired
<LoopSplitter
>();
454 au
.addRequired
<VirtRegMap
>();
455 au
.addRequired
<RenderMachineFunction
>();
456 MachineFunctionPass::getAnalysisUsage(au
);
459 void RegAllocPBQP::findVRegIntervalsToAlloc() {
461 // Iterate over all live ranges.
462 for (LiveIntervals::iterator itr
= lis
->begin(), end
= lis
->end();
465 // Ignore physical ones.
466 if (TargetRegisterInfo::isPhysicalRegister(itr
->first
))
469 LiveInterval
*li
= itr
->second
;
471 // If this live interval is non-empty we will use pbqp to allocate it.
472 // Empty intervals we allocate in a simple post-processing stage in
475 vregsToAlloc
.insert(li
->reg
);
478 emptyIntervalVRegs
.insert(li
->reg
);
483 void RegAllocPBQP::addStackInterval(const LiveInterval
*spilled
,
484 MachineRegisterInfo
* mri
) {
485 int stackSlot
= vrm
->getStackSlot(spilled
->reg
);
487 if (stackSlot
== VirtRegMap::NO_STACK_SLOT
)
490 const TargetRegisterClass
*RC
= mri
->getRegClass(spilled
->reg
);
491 LiveInterval
&stackInterval
= lss
->getOrCreateInterval(stackSlot
, RC
);
494 if (stackInterval
.getNumValNums() != 0)
495 vni
= stackInterval
.getValNumInfo(0);
497 vni
= stackInterval
.getNextValue(
498 SlotIndex(), 0, lss
->getVNInfoAllocator());
500 LiveInterval
&rhsInterval
= lis
->getInterval(spilled
->reg
);
501 stackInterval
.MergeRangesInAsValue(rhsInterval
, vni
);
504 bool RegAllocPBQP::mapPBQPToRegAlloc(const PBQPRAProblem
&problem
,
505 const PBQP::Solution
&solution
) {
506 // Set to true if we have any spills
507 bool anotherRoundNeeded
= false;
509 // Clear the existing allocation.
512 const PBQP::Graph
&g
= problem
.getGraph();
513 // Iterate over the nodes mapping the PBQP solution to a register
515 for (PBQP::Graph::ConstNodeItr node
= g
.nodesBegin(),
516 nodeEnd
= g
.nodesEnd();
517 node
!= nodeEnd
; ++node
) {
518 unsigned vreg
= problem
.getVRegForNode(node
);
519 unsigned alloc
= solution
.getSelection(node
);
521 if (problem
.isPRegOption(vreg
, alloc
)) {
522 unsigned preg
= problem
.getPRegForOption(vreg
, alloc
);
523 DEBUG(dbgs() << "VREG " << vreg
<< " -> " << tri
->getName(preg
) << "\n");
524 assert(preg
!= 0 && "Invalid preg selected.");
525 vrm
->assignVirt2Phys(vreg
, preg
);
526 } else if (problem
.isSpillOption(vreg
, alloc
)) {
527 vregsToAlloc
.erase(vreg
);
528 const LiveInterval
* spillInterval
= &lis
->getInterval(vreg
);
529 double oldWeight
= spillInterval
->weight
;
530 SmallVector
<LiveInterval
*, 8> spillIs
;
531 rmf
->rememberUseDefs(spillInterval
);
532 std::vector
<LiveInterval
*> newSpills
=
533 lis
->addIntervalsForSpills(*spillInterval
, spillIs
, loopInfo
, *vrm
);
534 addStackInterval(spillInterval
, mri
);
535 rmf
->rememberSpills(spillInterval
, newSpills
);
538 DEBUG(dbgs() << "VREG " << vreg
<< " -> SPILLED (Cost: "
539 << oldWeight
<< ", New vregs: ");
541 // Copy any newly inserted live intervals into the list of regs to
543 for (std::vector
<LiveInterval
*>::const_iterator
544 itr
= newSpills
.begin(), end
= newSpills
.end();
546 assert(!(*itr
)->empty() && "Empty spill range.");
547 DEBUG(dbgs() << (*itr
)->reg
<< " ");
548 vregsToAlloc
.insert((*itr
)->reg
);
551 DEBUG(dbgs() << ")\n");
553 // We need another round if spill intervals were added.
554 anotherRoundNeeded
|= !newSpills
.empty();
556 assert(false && "Unknown allocation option.");
560 return !anotherRoundNeeded
;
564 void RegAllocPBQP::finalizeAlloc() const {
565 typedef LiveIntervals::iterator LIIterator
;
566 typedef LiveInterval::Ranges::const_iterator LRIterator
;
568 // First allocate registers for the empty intervals.
569 for (RegSet::const_iterator
570 itr
= emptyIntervalVRegs
.begin(), end
= emptyIntervalVRegs
.end();
572 LiveInterval
*li
= &lis
->getInterval(*itr
);
574 unsigned physReg
= vrm
->getRegAllocPref(li
->reg
);
577 const TargetRegisterClass
*liRC
= mri
->getRegClass(li
->reg
);
578 physReg
= *liRC
->allocation_order_begin(*mf
);
581 vrm
->assignVirt2Phys(li
->reg
, physReg
);
584 // Finally iterate over the basic blocks to compute and set the live-in sets.
585 SmallVector
<MachineBasicBlock
*, 8> liveInMBBs
;
586 MachineBasicBlock
*entryMBB
= &*mf
->begin();
588 for (LIIterator liItr
= lis
->begin(), liEnd
= lis
->end();
589 liItr
!= liEnd
; ++liItr
) {
591 const LiveInterval
*li
= liItr
->second
;
594 // Get the physical register for this interval
595 if (TargetRegisterInfo::isPhysicalRegister(li
->reg
)) {
598 else if (vrm
->isAssignedReg(li
->reg
)) {
599 reg
= vrm
->getPhys(li
->reg
);
602 // Ranges which are assigned a stack slot only are ignored.
607 // Filter out zero regs - they're for intervals that were spilled.
611 // Iterate over the ranges of the current interval...
612 for (LRIterator lrItr
= li
->begin(), lrEnd
= li
->end();
613 lrItr
!= lrEnd
; ++lrItr
) {
615 // Find the set of basic blocks which this range is live into...
616 if (lis
->findLiveInMBBs(lrItr
->start
, lrItr
->end
, liveInMBBs
)) {
617 // And add the physreg for this interval to their live-in sets.
618 for (unsigned i
= 0; i
< liveInMBBs
.size(); ++i
) {
619 if (liveInMBBs
[i
] != entryMBB
) {
620 if (!liveInMBBs
[i
]->isLiveIn(reg
)) {
621 liveInMBBs
[i
]->addLiveIn(reg
);
632 bool RegAllocPBQP::runOnMachineFunction(MachineFunction
&MF
) {
635 tm
= &mf
->getTarget();
636 tri
= tm
->getRegisterInfo();
637 tii
= tm
->getInstrInfo();
638 mri
= &mf
->getRegInfo();
640 lis
= &getAnalysis
<LiveIntervals
>();
641 lss
= &getAnalysis
<LiveStacks
>();
642 loopInfo
= &getAnalysis
<MachineLoopInfo
>();
643 rmf
= &getAnalysis
<RenderMachineFunction
>();
645 vrm
= &getAnalysis
<VirtRegMap
>();
648 DEBUG(dbgs() << "PBQP Register Allocating for " << mf
->getFunction()->getName() << "\n");
650 // Allocator main loop:
652 // * Map current regalloc problem to a PBQP problem
653 // * Solve the PBQP problem
654 // * Map the solution back to a register allocation
655 // * Spill if necessary
657 // This process is continued till no more spills are generated.
659 // Find the vreg intervals in need of allocation.
660 findVRegIntervalsToAlloc();
662 // If there are non-empty intervals allocate them using pbqp.
663 if (!vregsToAlloc
.empty()) {
665 bool pbqpAllocComplete
= false;
668 while (!pbqpAllocComplete
) {
669 DEBUG(dbgs() << " PBQP Regalloc round " << round
<< ":\n");
671 std::auto_ptr
<PBQPRAProblem
> problem
=
672 builder
->build(mf
, lis
, loopInfo
, vregsToAlloc
);
673 PBQP::Solution solution
=
674 PBQP::HeuristicSolver
<PBQP::Heuristics::Briggs
>::solve(
675 problem
->getGraph());
677 pbqpAllocComplete
= mapPBQPToRegAlloc(*problem
, solution
);
683 // Finalise allocation, allocate empty ranges.
686 rmf
->renderMachineFunction("After PBQP register allocation.", vrm
);
688 vregsToAlloc
.clear();
689 emptyIntervalVRegs
.clear();
691 DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *vrm
<< "\n");
694 std::auto_ptr
<VirtRegRewriter
> rewriter(createVirtRegRewriter());
696 rewriter
->runOnMachineFunction(*mf
, *vrm
, lis
);
701 FunctionPass
* llvm::createPBQPRegisterAllocator(
702 std::auto_ptr
<PBQPBuilder
> builder
) {
703 return new RegAllocPBQP(builder
);
706 FunctionPass
* llvm::createDefaultPBQPRegisterAllocator() {
707 if (pbqpCoalescing
) {
708 return createPBQPRegisterAllocator(
709 std::auto_ptr
<PBQPBuilder
>(new PBQPBuilderWithCoalescing()));
711 return createPBQPRegisterAllocator(
712 std::auto_ptr
<PBQPBuilder
>(new PBQPBuilder()));