1 //===-- RegAllocGreedy.cpp - greedy register allocator --------------------===//
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 defines the RAGreedy function pass for register allocation in
13 //===----------------------------------------------------------------------===//
15 #define DEBUG_TYPE "regalloc"
16 #include "AllocationOrder.h"
17 #include "InterferenceCache.h"
18 #include "LiveDebugVariables.h"
19 #include "LiveRangeEdit.h"
20 #include "RegAllocBase.h"
22 #include "SpillPlacement.h"
24 #include "VirtRegMap.h"
25 #include "RegisterCoalescer.h"
26 #include "llvm/ADT/Statistic.h"
27 #include "llvm/Analysis/AliasAnalysis.h"
28 #include "llvm/Function.h"
29 #include "llvm/PassAnalysisSupport.h"
30 #include "llvm/CodeGen/CalcSpillWeights.h"
31 #include "llvm/CodeGen/EdgeBundles.h"
32 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
33 #include "llvm/CodeGen/LiveStackAnalysis.h"
34 #include "llvm/CodeGen/MachineDominators.h"
35 #include "llvm/CodeGen/MachineFunctionPass.h"
36 #include "llvm/CodeGen/MachineLoopInfo.h"
37 #include "llvm/CodeGen/MachineLoopRanges.h"
38 #include "llvm/CodeGen/MachineRegisterInfo.h"
39 #include "llvm/CodeGen/Passes.h"
40 #include "llvm/CodeGen/RegAllocRegistry.h"
41 #include "llvm/Target/TargetOptions.h"
42 #include "llvm/Support/Debug.h"
43 #include "llvm/Support/ErrorHandling.h"
44 #include "llvm/Support/raw_ostream.h"
45 #include "llvm/Support/Timer.h"
51 STATISTIC(NumGlobalSplits
, "Number of split global live ranges");
52 STATISTIC(NumLocalSplits
, "Number of split local live ranges");
53 STATISTIC(NumEvicted
, "Number of interferences evicted");
55 static RegisterRegAlloc
greedyRegAlloc("greedy", "greedy register allocator",
56 createGreedyRegisterAllocator
);
59 class RAGreedy
: public MachineFunctionPass
,
61 private LiveRangeEdit::Delegate
{
69 MachineDominatorTree
*DomTree
;
70 MachineLoopInfo
*Loops
;
71 MachineLoopRanges
*LoopRanges
;
73 SpillPlacement
*SpillPlacer
;
74 LiveDebugVariables
*DebugVars
;
77 std::auto_ptr
<Spiller
> SpillerInstance
;
78 std::priority_queue
<std::pair
<unsigned, unsigned> > Queue
;
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:
83 // - Region splitting.
84 // - Per-block splitting.
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
94 RS_New
, ///< Never seen before.
95 RS_First
, ///< First time in the queue.
96 RS_Second
, ///< Second time in the queue.
97 RS_Global
, ///< Produced by global splitting.
98 RS_Local
, ///< Produced by local splitting.
99 RS_Spill
///< Produced by spilling.
102 static const char *const StageName
[];
104 IndexedMap
<unsigned char, VirtReg2IndexFunctor
> LRStage
;
106 LiveRangeStage
getStage(const LiveInterval
&VirtReg
) const {
107 return LiveRangeStage(LRStage
[VirtReg
.reg
]);
110 template<typename Iterator
>
111 void setStage(Iterator Begin
, Iterator End
, LiveRangeStage NewStage
) {
112 LRStage
.resize(MRI
->getNumVirtRegs());
113 for (;Begin
!= End
; ++Begin
) {
114 unsigned Reg
= (*Begin
)->reg
;
115 if (LRStage
[Reg
] == RS_New
)
116 LRStage
[Reg
] = NewStage
;
120 // Eviction. Sometimes an assigned live range can be evicted without
121 // conditions, but other times it must be split after being evicted to avoid
124 CE_Never
, ///< Can never evict.
125 CE_Always
, ///< Can always evict.
126 CE_WithSplit
///< Can evict only if range is also split or spilled.
130 std::auto_ptr
<SplitAnalysis
> SA
;
131 std::auto_ptr
<SplitEditor
> SE
;
133 /// Cached per-block interference maps
134 InterferenceCache IntfCache
;
136 /// All basic blocks where the current register has uses.
137 SmallVector
<SpillPlacement::BlockConstraint
, 8> SplitConstraints
;
139 /// Global live range splitting candidate info.
140 struct GlobalSplitCandidate
{
142 BitVector LiveBundles
;
143 SmallVector
<unsigned, 8> ActiveBlocks
;
145 void reset(unsigned Reg
) {
148 ActiveBlocks
.clear();
152 /// Candidate info for for each PhysReg in AllocationOrder.
153 /// This vector never shrinks, but grows to the size of the largest register
155 SmallVector
<GlobalSplitCandidate
, 32> GlobalCand
;
160 /// Return the pass name.
161 virtual const char* getPassName() const {
162 return "Greedy Register Allocator";
165 /// RAGreedy analysis usage.
166 virtual void getAnalysisUsage(AnalysisUsage
&AU
) const;
167 virtual void releaseMemory();
168 virtual Spiller
&spiller() { return *SpillerInstance
; }
169 virtual void enqueue(LiveInterval
*LI
);
170 virtual LiveInterval
*dequeue();
171 virtual unsigned selectOrSplit(LiveInterval
&,
172 SmallVectorImpl
<LiveInterval
*>&);
174 /// Perform register allocation.
175 virtual bool runOnMachineFunction(MachineFunction
&mf
);
180 void LRE_WillEraseInstruction(MachineInstr
*);
181 bool LRE_CanEraseVirtReg(unsigned);
182 void LRE_WillShrinkVirtReg(unsigned);
183 void LRE_DidCloneVirtReg(unsigned, unsigned);
185 float calcSpillCost();
186 bool addSplitConstraints(InterferenceCache::Cursor
, float&);
187 void addThroughConstraints(InterferenceCache::Cursor
, ArrayRef
<unsigned>);
188 void growRegion(GlobalSplitCandidate
&Cand
, InterferenceCache::Cursor
);
189 float calcGlobalSplitCost(GlobalSplitCandidate
&, InterferenceCache::Cursor
);
190 void splitAroundRegion(LiveInterval
&, GlobalSplitCandidate
&,
191 SmallVectorImpl
<LiveInterval
*>&);
192 void calcGapWeights(unsigned, SmallVectorImpl
<float>&);
193 CanEvict
canEvict(LiveInterval
&A
, LiveInterval
&B
);
194 bool canEvictInterference(LiveInterval
&, unsigned, float&);
196 unsigned tryAssign(LiveInterval
&, AllocationOrder
&,
197 SmallVectorImpl
<LiveInterval
*>&);
198 unsigned tryEvict(LiveInterval
&, AllocationOrder
&,
199 SmallVectorImpl
<LiveInterval
*>&, unsigned = ~0u);
200 unsigned tryRegionSplit(LiveInterval
&, AllocationOrder
&,
201 SmallVectorImpl
<LiveInterval
*>&);
202 unsigned tryLocalSplit(LiveInterval
&, AllocationOrder
&,
203 SmallVectorImpl
<LiveInterval
*>&);
204 unsigned trySplit(LiveInterval
&, AllocationOrder
&,
205 SmallVectorImpl
<LiveInterval
*>&);
207 } // end anonymous namespace
209 char RAGreedy::ID
= 0;
212 const char *const RAGreedy::StageName
[] = {
222 // Hysteresis to use when comparing floats.
223 // This helps stabilize decisions based on float comparisons.
224 const float Hysteresis
= 0.98f
;
227 FunctionPass
* llvm::createGreedyRegisterAllocator() {
228 return new RAGreedy();
231 RAGreedy::RAGreedy(): MachineFunctionPass(ID
), LRStage(RS_New
) {
232 initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
233 initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
234 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
235 initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
236 initializeStrongPHIEliminationPass(*PassRegistry::getPassRegistry());
237 initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
238 initializeCalculateSpillWeightsPass(*PassRegistry::getPassRegistry());
239 initializeLiveStacksPass(*PassRegistry::getPassRegistry());
240 initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
241 initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
242 initializeMachineLoopRangesPass(*PassRegistry::getPassRegistry());
243 initializeVirtRegMapPass(*PassRegistry::getPassRegistry());
244 initializeEdgeBundlesPass(*PassRegistry::getPassRegistry());
245 initializeSpillPlacementPass(*PassRegistry::getPassRegistry());
248 void RAGreedy::getAnalysisUsage(AnalysisUsage
&AU
) const {
249 AU
.setPreservesCFG();
250 AU
.addRequired
<AliasAnalysis
>();
251 AU
.addPreserved
<AliasAnalysis
>();
252 AU
.addRequired
<LiveIntervals
>();
253 AU
.addRequired
<SlotIndexes
>();
254 AU
.addPreserved
<SlotIndexes
>();
255 AU
.addRequired
<LiveDebugVariables
>();
256 AU
.addPreserved
<LiveDebugVariables
>();
258 AU
.addRequiredID(StrongPHIEliminationID
);
259 AU
.addRequiredTransitive
<RegisterCoalescer
>();
260 AU
.addRequired
<CalculateSpillWeights
>();
261 AU
.addRequired
<LiveStacks
>();
262 AU
.addPreserved
<LiveStacks
>();
263 AU
.addRequired
<MachineDominatorTree
>();
264 AU
.addPreserved
<MachineDominatorTree
>();
265 AU
.addRequired
<MachineLoopInfo
>();
266 AU
.addPreserved
<MachineLoopInfo
>();
267 AU
.addRequired
<MachineLoopRanges
>();
268 AU
.addPreserved
<MachineLoopRanges
>();
269 AU
.addRequired
<VirtRegMap
>();
270 AU
.addPreserved
<VirtRegMap
>();
271 AU
.addRequired
<EdgeBundles
>();
272 AU
.addRequired
<SpillPlacement
>();
273 MachineFunctionPass::getAnalysisUsage(AU
);
277 //===----------------------------------------------------------------------===//
278 // LiveRangeEdit delegate methods
279 //===----------------------------------------------------------------------===//
281 void RAGreedy::LRE_WillEraseInstruction(MachineInstr
*MI
) {
282 // LRE itself will remove from SlotIndexes and parent basic block.
283 VRM
->RemoveMachineInstrFromMaps(MI
);
286 bool RAGreedy::LRE_CanEraseVirtReg(unsigned VirtReg
) {
287 if (unsigned PhysReg
= VRM
->getPhys(VirtReg
)) {
288 unassign(LIS
->getInterval(VirtReg
), PhysReg
);
291 // Unassigned virtreg is probably in the priority queue.
292 // RegAllocBase will erase it after dequeueing.
296 void RAGreedy::LRE_WillShrinkVirtReg(unsigned VirtReg
) {
297 unsigned PhysReg
= VRM
->getPhys(VirtReg
);
301 // Register is assigned, put it back on the queue for reassignment.
302 LiveInterval
&LI
= LIS
->getInterval(VirtReg
);
303 unassign(LI
, PhysReg
);
307 void RAGreedy::LRE_DidCloneVirtReg(unsigned New
, unsigned Old
) {
308 // LRE may clone a virtual register because dead code elimination causes it to
309 // be split into connected components. Ensure that the new register gets the
310 // same stage as the parent.
312 LRStage
[New
] = LRStage
[Old
];
315 void RAGreedy::releaseMemory() {
316 SpillerInstance
.reset(0);
319 RegAllocBase::releaseMemory();
322 void RAGreedy::enqueue(LiveInterval
*LI
) {
323 // Prioritize live ranges by size, assigning larger ranges first.
324 // The queue holds (size, reg) pairs.
325 const unsigned Size
= LI
->getSize();
326 const unsigned Reg
= LI
->reg
;
327 assert(TargetRegisterInfo::isVirtualRegister(Reg
) &&
328 "Can only enqueue virtual registers");
332 if (LRStage
[Reg
] == RS_New
)
333 LRStage
[Reg
] = RS_First
;
335 if (LRStage
[Reg
] == RS_Second
)
336 // Unsplit ranges that couldn't be allocated immediately are deferred until
337 // everything else has been allocated. Long ranges are allocated last so
338 // they are split against realistic interference.
339 Prio
= (1u << 31) - Size
;
341 // Everything else is allocated in long->short order. Long ranges that don't
342 // fit should be spilled ASAP so they don't create interference.
343 Prio
= (1u << 31) + Size
;
345 // Boost ranges that have a physical register hint.
346 if (TargetRegisterInfo::isPhysicalRegister(VRM
->getRegAllocPref(Reg
)))
350 Queue
.push(std::make_pair(Prio
, Reg
));
353 LiveInterval
*RAGreedy::dequeue() {
356 LiveInterval
*LI
= &LIS
->getInterval(Queue
.top().second
);
362 //===----------------------------------------------------------------------===//
364 //===----------------------------------------------------------------------===//
366 /// tryAssign - Try to assign VirtReg to an available register.
367 unsigned RAGreedy::tryAssign(LiveInterval
&VirtReg
,
368 AllocationOrder
&Order
,
369 SmallVectorImpl
<LiveInterval
*> &NewVRegs
) {
372 while ((PhysReg
= Order
.next()))
373 if (!checkPhysRegInterference(VirtReg
, PhysReg
))
375 if (!PhysReg
|| Order
.isHint(PhysReg
))
378 // PhysReg is available. Try to evict interference from a cheaper alternative.
379 unsigned Cost
= TRI
->getCostPerUse(PhysReg
);
381 // Most registers have 0 additional cost.
385 DEBUG(dbgs() << PrintReg(PhysReg
, TRI
) << " is available at cost " << Cost
387 unsigned CheapReg
= tryEvict(VirtReg
, Order
, NewVRegs
, Cost
);
388 return CheapReg
? CheapReg
: PhysReg
;
392 //===----------------------------------------------------------------------===//
393 // Interference eviction
394 //===----------------------------------------------------------------------===//
396 /// canEvict - determine if A can evict the assigned live range B. The eviction
397 /// policy defined by this function together with the allocation order defined
398 /// by enqueue() decides which registers ultimately end up being split and
401 /// This function must define a non-circular relation when it returns CE_Always,
402 /// otherwise infinite eviction loops are possible. When evicting a <= RS_Second
403 /// range, it is possible to return CE_WithSplit which forces the evicted
404 /// register to be split or spilled before it can evict anything again. That
405 /// guarantees progress.
406 RAGreedy::CanEvict
RAGreedy::canEvict(LiveInterval
&A
, LiveInterval
&B
) {
407 return A
.weight
> B
.weight
? CE_Always
: CE_Never
;
410 /// canEvict - Return true if all interferences between VirtReg and PhysReg can
412 /// Return false if any interference is heavier than MaxWeight.
413 /// On return, set MaxWeight to the maximal spill weight of an interference.
414 bool RAGreedy::canEvictInterference(LiveInterval
&VirtReg
, unsigned PhysReg
,
417 for (const unsigned *AliasI
= TRI
->getOverlaps(PhysReg
); *AliasI
; ++AliasI
) {
418 LiveIntervalUnion::Query
&Q
= query(VirtReg
, *AliasI
);
419 // If there is 10 or more interferences, chances are one is heavier.
420 if (Q
.collectInterferingVRegs(10, MaxWeight
) >= 10)
423 // Check if any interfering live range is heavier than MaxWeight.
424 for (unsigned i
= Q
.interferingVRegs().size(); i
; --i
) {
425 LiveInterval
*Intf
= Q
.interferingVRegs()[i
- 1];
426 if (TargetRegisterInfo::isPhysicalRegister(Intf
->reg
))
428 if (Intf
->weight
>= MaxWeight
)
430 switch (canEvict(VirtReg
, *Intf
)) {
436 if (getStage(*Intf
) > RS_Second
)
440 Weight
= std::max(Weight
, Intf
->weight
);
447 /// tryEvict - Try to evict all interferences for a physreg.
448 /// @param VirtReg Currently unassigned virtual register.
449 /// @param Order Physregs to try.
450 /// @return Physreg to assign VirtReg, or 0.
451 unsigned RAGreedy::tryEvict(LiveInterval
&VirtReg
,
452 AllocationOrder
&Order
,
453 SmallVectorImpl
<LiveInterval
*> &NewVRegs
,
454 unsigned CostPerUseLimit
) {
455 NamedRegionTimer
T("Evict", TimerGroupName
, TimePassesIsEnabled
);
457 // Keep track of the lightest single interference seen so far.
458 float BestWeight
= HUGE_VALF
;
459 unsigned BestPhys
= 0;
462 while (unsigned PhysReg
= Order
.next()) {
463 if (TRI
->getCostPerUse(PhysReg
) >= CostPerUseLimit
)
465 // The first use of a register in a function has cost 1.
466 if (CostPerUseLimit
== 1 && !MRI
->isPhysRegUsed(PhysReg
))
469 float Weight
= BestWeight
;
470 if (!canEvictInterference(VirtReg
, PhysReg
, Weight
))
473 // This is an eviction candidate.
474 DEBUG(dbgs() << PrintReg(PhysReg
, TRI
) << " interference = "
476 if (BestPhys
&& Weight
>= BestWeight
)
482 // Stop if the hint can be used.
483 if (Order
.isHint(PhysReg
))
490 DEBUG(dbgs() << "evicting " << PrintReg(BestPhys
, TRI
) << " interference\n");
491 for (const unsigned *AliasI
= TRI
->getOverlaps(BestPhys
); *AliasI
; ++AliasI
) {
492 LiveIntervalUnion::Query
&Q
= query(VirtReg
, *AliasI
);
493 assert(Q
.seenAllInterferences() && "Didn't check all interfererences.");
494 for (unsigned i
= 0, e
= Q
.interferingVRegs().size(); i
!= e
; ++i
) {
495 LiveInterval
*Intf
= Q
.interferingVRegs()[i
];
496 unassign(*Intf
, VRM
->getPhys(Intf
->reg
));
498 NewVRegs
.push_back(Intf
);
499 // Prevent looping by forcing the evicted ranges to be split before they
500 // can evict anything else.
501 if (getStage(*Intf
) < RS_Second
&&
502 canEvict(VirtReg
, *Intf
) == CE_WithSplit
)
503 LRStage
[Intf
->reg
] = RS_Second
;
510 //===----------------------------------------------------------------------===//
512 //===----------------------------------------------------------------------===//
514 /// addSplitConstraints - Fill out the SplitConstraints vector based on the
515 /// interference pattern in Physreg and its aliases. Add the constraints to
516 /// SpillPlacement and return the static cost of this split in Cost, assuming
517 /// that all preferences in SplitConstraints are met.
518 /// Return false if there are no bundles with positive bias.
519 bool RAGreedy::addSplitConstraints(InterferenceCache::Cursor Intf
,
521 ArrayRef
<SplitAnalysis::BlockInfo
> UseBlocks
= SA
->getUseBlocks();
523 // Reset interference dependent info.
524 SplitConstraints
.resize(UseBlocks
.size());
525 float StaticCost
= 0;
526 for (unsigned i
= 0; i
!= UseBlocks
.size(); ++i
) {
527 const SplitAnalysis::BlockInfo
&BI
= UseBlocks
[i
];
528 SpillPlacement::BlockConstraint
&BC
= SplitConstraints
[i
];
530 BC
.Number
= BI
.MBB
->getNumber();
531 Intf
.moveToBlock(BC
.Number
);
532 BC
.Entry
= BI
.LiveIn
? SpillPlacement::PrefReg
: SpillPlacement::DontCare
;
533 BC
.Exit
= BI
.LiveOut
? SpillPlacement::PrefReg
: SpillPlacement::DontCare
;
535 if (!Intf
.hasInterference())
538 // Number of spill code instructions to insert.
541 // Interference for the live-in value.
543 if (Intf
.first() <= Indexes
->getMBBStartIdx(BC
.Number
))
544 BC
.Entry
= SpillPlacement::MustSpill
, ++Ins
;
545 else if (Intf
.first() < BI
.FirstUse
)
546 BC
.Entry
= SpillPlacement::PrefSpill
, ++Ins
;
547 else if (Intf
.first() < BI
.LastUse
)
551 // Interference for the live-out value.
553 if (Intf
.last() >= SA
->getLastSplitPoint(BC
.Number
))
554 BC
.Exit
= SpillPlacement::MustSpill
, ++Ins
;
555 else if (Intf
.last() > BI
.LastUse
)
556 BC
.Exit
= SpillPlacement::PrefSpill
, ++Ins
;
557 else if (Intf
.last() > BI
.FirstUse
)
561 // Accumulate the total frequency of inserted spill code.
563 StaticCost
+= Ins
* SpillPlacer
->getBlockFrequency(BC
.Number
);
567 // Add constraints for use-blocks. Note that these are the only constraints
568 // that may add a positive bias, it is downhill from here.
569 SpillPlacer
->addConstraints(SplitConstraints
);
570 return SpillPlacer
->scanActiveBundles();
574 /// addThroughConstraints - Add constraints and links to SpillPlacer from the
575 /// live-through blocks in Blocks.
576 void RAGreedy::addThroughConstraints(InterferenceCache::Cursor Intf
,
577 ArrayRef
<unsigned> Blocks
) {
578 const unsigned GroupSize
= 8;
579 SpillPlacement::BlockConstraint BCS
[GroupSize
];
580 unsigned TBS
[GroupSize
];
581 unsigned B
= 0, T
= 0;
583 for (unsigned i
= 0; i
!= Blocks
.size(); ++i
) {
584 unsigned Number
= Blocks
[i
];
585 Intf
.moveToBlock(Number
);
587 if (!Intf
.hasInterference()) {
588 assert(T
< GroupSize
&& "Array overflow");
590 if (++T
== GroupSize
) {
591 SpillPlacer
->addLinks(ArrayRef
<unsigned>(TBS
, T
));
597 assert(B
< GroupSize
&& "Array overflow");
598 BCS
[B
].Number
= Number
;
600 // Interference for the live-in value.
601 if (Intf
.first() <= Indexes
->getMBBStartIdx(Number
))
602 BCS
[B
].Entry
= SpillPlacement::MustSpill
;
604 BCS
[B
].Entry
= SpillPlacement::PrefSpill
;
606 // Interference for the live-out value.
607 if (Intf
.last() >= SA
->getLastSplitPoint(Number
))
608 BCS
[B
].Exit
= SpillPlacement::MustSpill
;
610 BCS
[B
].Exit
= SpillPlacement::PrefSpill
;
612 if (++B
== GroupSize
) {
613 ArrayRef
<SpillPlacement::BlockConstraint
> Array(BCS
, B
);
614 SpillPlacer
->addConstraints(Array
);
619 ArrayRef
<SpillPlacement::BlockConstraint
> Array(BCS
, B
);
620 SpillPlacer
->addConstraints(Array
);
621 SpillPlacer
->addLinks(ArrayRef
<unsigned>(TBS
, T
));
624 void RAGreedy::growRegion(GlobalSplitCandidate
&Cand
,
625 InterferenceCache::Cursor Intf
) {
626 // Keep track of through blocks that have not been added to SpillPlacer.
627 BitVector Todo
= SA
->getThroughBlocks();
628 SmallVectorImpl
<unsigned> &ActiveBlocks
= Cand
.ActiveBlocks
;
629 unsigned AddedTo
= 0;
631 unsigned Visited
= 0;
635 ArrayRef
<unsigned> NewBundles
= SpillPlacer
->getRecentPositive();
636 if (NewBundles
.empty())
638 // Find new through blocks in the periphery of PrefRegBundles.
639 for (int i
= 0, e
= NewBundles
.size(); i
!= e
; ++i
) {
640 unsigned Bundle
= NewBundles
[i
];
641 // Look at all blocks connected to Bundle in the full graph.
642 ArrayRef
<unsigned> Blocks
= Bundles
->getBlocks(Bundle
);
643 for (ArrayRef
<unsigned>::iterator I
= Blocks
.begin(), E
= Blocks
.end();
646 if (!Todo
.test(Block
))
649 // This is a new through block. Add it to SpillPlacer later.
650 ActiveBlocks
.push_back(Block
);
656 // Any new blocks to add?
657 if (ActiveBlocks
.size() > AddedTo
) {
658 ArrayRef
<unsigned> Add(&ActiveBlocks
[AddedTo
],
659 ActiveBlocks
.size() - AddedTo
);
660 addThroughConstraints(Intf
, Add
);
661 AddedTo
= ActiveBlocks
.size();
663 // Perhaps iterating can enable more bundles?
664 SpillPlacer
->iterate();
666 DEBUG(dbgs() << ", v=" << Visited
);
669 /// calcSpillCost - Compute how expensive it would be to split the live range in
670 /// SA around all use blocks instead of forming bundle regions.
671 float RAGreedy::calcSpillCost() {
673 const LiveInterval
&LI
= SA
->getParent();
674 ArrayRef
<SplitAnalysis::BlockInfo
> UseBlocks
= SA
->getUseBlocks();
675 for (unsigned i
= 0; i
!= UseBlocks
.size(); ++i
) {
676 const SplitAnalysis::BlockInfo
&BI
= UseBlocks
[i
];
677 unsigned Number
= BI
.MBB
->getNumber();
678 // We normally only need one spill instruction - a load or a store.
679 Cost
+= SpillPlacer
->getBlockFrequency(Number
);
681 // Unless the value is redefined in the block.
682 if (BI
.LiveIn
&& BI
.LiveOut
) {
683 SlotIndex Start
, Stop
;
684 tie(Start
, Stop
) = Indexes
->getMBBRange(Number
);
685 LiveInterval::const_iterator I
= LI
.find(Start
);
686 assert(I
!= LI
.end() && "Expected live-in value");
687 // Is there a different live-out value? If so, we need an extra spill
690 Cost
+= SpillPlacer
->getBlockFrequency(Number
);
696 /// calcGlobalSplitCost - Return the global split cost of following the split
697 /// pattern in LiveBundles. This cost should be added to the local cost of the
698 /// interference pattern in SplitConstraints.
700 float RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate
&Cand
,
701 InterferenceCache::Cursor Intf
) {
702 float GlobalCost
= 0;
703 const BitVector
&LiveBundles
= Cand
.LiveBundles
;
704 ArrayRef
<SplitAnalysis::BlockInfo
> UseBlocks
= SA
->getUseBlocks();
705 for (unsigned i
= 0; i
!= UseBlocks
.size(); ++i
) {
706 const SplitAnalysis::BlockInfo
&BI
= UseBlocks
[i
];
707 SpillPlacement::BlockConstraint
&BC
= SplitConstraints
[i
];
708 bool RegIn
= LiveBundles
[Bundles
->getBundle(BC
.Number
, 0)];
709 bool RegOut
= LiveBundles
[Bundles
->getBundle(BC
.Number
, 1)];
713 Ins
+= RegIn
!= (BC
.Entry
== SpillPlacement::PrefReg
);
715 Ins
+= RegOut
!= (BC
.Exit
== SpillPlacement::PrefReg
);
717 GlobalCost
+= Ins
* SpillPlacer
->getBlockFrequency(BC
.Number
);
720 for (unsigned i
= 0, e
= Cand
.ActiveBlocks
.size(); i
!= e
; ++i
) {
721 unsigned Number
= Cand
.ActiveBlocks
[i
];
722 bool RegIn
= LiveBundles
[Bundles
->getBundle(Number
, 0)];
723 bool RegOut
= LiveBundles
[Bundles
->getBundle(Number
, 1)];
724 if (!RegIn
&& !RegOut
)
726 if (RegIn
&& RegOut
) {
727 // We need double spill code if this block has interference.
728 Intf
.moveToBlock(Number
);
729 if (Intf
.hasInterference())
730 GlobalCost
+= 2*SpillPlacer
->getBlockFrequency(Number
);
733 // live-in / stack-out or stack-in live-out.
734 GlobalCost
+= SpillPlacer
->getBlockFrequency(Number
);
739 /// splitAroundRegion - Split VirtReg around the region determined by
740 /// LiveBundles. Make an effort to avoid interference from PhysReg.
742 /// The 'register' interval is going to contain as many uses as possible while
743 /// avoiding interference. The 'stack' interval is the complement constructed by
744 /// SplitEditor. It will contain the rest.
746 void RAGreedy::splitAroundRegion(LiveInterval
&VirtReg
,
747 GlobalSplitCandidate
&Cand
,
748 SmallVectorImpl
<LiveInterval
*> &NewVRegs
) {
749 const BitVector
&LiveBundles
= Cand
.LiveBundles
;
752 dbgs() << "Splitting around region for " << PrintReg(Cand
.PhysReg
, TRI
)
754 for (int i
= LiveBundles
.find_first(); i
>=0; i
= LiveBundles
.find_next(i
))
755 dbgs() << " EB#" << i
;
759 InterferenceCache::Cursor
Intf(IntfCache
, Cand
.PhysReg
);
760 LiveRangeEdit
LREdit(VirtReg
, NewVRegs
, this);
763 // Create the main cross-block interval.
764 const unsigned MainIntv
= SE
->openIntv();
766 // First add all defs that are live out of a block.
767 ArrayRef
<SplitAnalysis::BlockInfo
> UseBlocks
= SA
->getUseBlocks();
768 for (unsigned i
= 0; i
!= UseBlocks
.size(); ++i
) {
769 const SplitAnalysis::BlockInfo
&BI
= UseBlocks
[i
];
770 bool RegIn
= LiveBundles
[Bundles
->getBundle(BI
.MBB
->getNumber(), 0)];
771 bool RegOut
= LiveBundles
[Bundles
->getBundle(BI
.MBB
->getNumber(), 1)];
773 // Create separate intervals for isolated blocks with multiple uses.
774 if (!RegIn
&& !RegOut
&& BI
.FirstUse
!= BI
.LastUse
) {
775 DEBUG(dbgs() << "BB#" << BI
.MBB
->getNumber() << " isolated.\n");
776 SE
->splitSingleBlock(BI
);
777 SE
->selectIntv(MainIntv
);
781 // Should the register be live out?
782 if (!BI
.LiveOut
|| !RegOut
)
785 SlotIndex Start
, Stop
;
786 tie(Start
, Stop
) = Indexes
->getMBBRange(BI
.MBB
);
787 Intf
.moveToBlock(BI
.MBB
->getNumber());
788 DEBUG(dbgs() << "BB#" << BI
.MBB
->getNumber() << " -> EB#"
789 << Bundles
->getBundle(BI
.MBB
->getNumber(), 1)
790 << " [" << Start
<< ';'
791 << SA
->getLastSplitPoint(BI
.MBB
->getNumber()) << '-' << Stop
792 << ") intf [" << Intf
.first() << ';' << Intf
.last() << ')');
794 // The interference interval should either be invalid or overlap MBB.
795 assert((!Intf
.hasInterference() || Intf
.first() < Stop
)
796 && "Bad interference");
797 assert((!Intf
.hasInterference() || Intf
.last() > Start
)
798 && "Bad interference");
800 // Check interference leaving the block.
801 if (!Intf
.hasInterference()) {
802 // Block is interference-free.
803 DEBUG(dbgs() << ", no interference");
804 if (!BI
.LiveThrough
) {
805 DEBUG(dbgs() << ", not live-through.\n");
806 SE
->useIntv(SE
->enterIntvBefore(BI
.FirstUse
), Stop
);
810 // Block is live-through, but entry bundle is on the stack.
811 // Reload just before the first use.
812 DEBUG(dbgs() << ", not live-in, enter before first use.\n");
813 SE
->useIntv(SE
->enterIntvBefore(BI
.FirstUse
), Stop
);
816 DEBUG(dbgs() << ", live-through.\n");
820 // Block has interference.
821 DEBUG(dbgs() << ", interference to " << Intf
.last());
823 if (!BI
.LiveThrough
&& Intf
.last() <= BI
.FirstUse
) {
824 // The interference doesn't reach the outgoing segment.
825 DEBUG(dbgs() << " doesn't affect def from " << BI
.FirstUse
<< '\n');
826 SE
->useIntv(BI
.FirstUse
, Stop
);
830 SlotIndex LastSplitPoint
= SA
->getLastSplitPoint(BI
.MBB
->getNumber());
831 if (Intf
.last().getBoundaryIndex() < BI
.LastUse
) {
832 // There are interference-free uses at the end of the block.
833 // Find the first use that can get the live-out register.
834 SmallVectorImpl
<SlotIndex
>::const_iterator UI
=
835 std::lower_bound(SA
->UseSlots
.begin(), SA
->UseSlots
.end(),
836 Intf
.last().getBoundaryIndex());
837 assert(UI
!= SA
->UseSlots
.end() && "Couldn't find last use");
839 assert(Use
<= BI
.LastUse
&& "Couldn't find last use");
840 // Only attempt a split befroe the last split point.
841 if (Use
.getBaseIndex() <= LastSplitPoint
) {
842 DEBUG(dbgs() << ", free use at " << Use
<< ".\n");
843 SlotIndex SegStart
= SE
->enterIntvBefore(Use
);
844 assert(SegStart
>= Intf
.last() && "Couldn't avoid interference");
845 assert(SegStart
< LastSplitPoint
&& "Impossible split point");
846 SE
->useIntv(SegStart
, Stop
);
851 // Interference is after the last use.
852 DEBUG(dbgs() << " after last use.\n");
853 SlotIndex SegStart
= SE
->enterIntvAtEnd(*BI
.MBB
);
854 assert(SegStart
>= Intf
.last() && "Couldn't avoid interference");
857 // Now all defs leading to live bundles are handled, do everything else.
858 for (unsigned i
= 0; i
!= UseBlocks
.size(); ++i
) {
859 const SplitAnalysis::BlockInfo
&BI
= UseBlocks
[i
];
860 bool RegIn
= LiveBundles
[Bundles
->getBundle(BI
.MBB
->getNumber(), 0)];
861 bool RegOut
= LiveBundles
[Bundles
->getBundle(BI
.MBB
->getNumber(), 1)];
863 // Is the register live-in?
864 if (!BI
.LiveIn
|| !RegIn
)
867 // We have an incoming register. Check for interference.
868 SlotIndex Start
, Stop
;
869 tie(Start
, Stop
) = Indexes
->getMBBRange(BI
.MBB
);
870 Intf
.moveToBlock(BI
.MBB
->getNumber());
871 DEBUG(dbgs() << "EB#" << Bundles
->getBundle(BI
.MBB
->getNumber(), 0)
872 << " -> BB#" << BI
.MBB
->getNumber() << " [" << Start
<< ';'
873 << SA
->getLastSplitPoint(BI
.MBB
->getNumber()) << '-' << Stop
876 // Check interference entering the block.
877 if (!Intf
.hasInterference()) {
878 // Block is interference-free.
879 DEBUG(dbgs() << ", no interference");
880 if (!BI
.LiveThrough
) {
881 DEBUG(dbgs() << ", killed in block.\n");
882 SE
->useIntv(Start
, SE
->leaveIntvAfter(BI
.LastUse
));
886 SlotIndex LastSplitPoint
= SA
->getLastSplitPoint(BI
.MBB
->getNumber());
887 // Block is live-through, but exit bundle is on the stack.
888 // Spill immediately after the last use.
889 if (BI
.LastUse
< LastSplitPoint
) {
890 DEBUG(dbgs() << ", uses, stack-out.\n");
891 SE
->useIntv(Start
, SE
->leaveIntvAfter(BI
.LastUse
));
894 // The last use is after the last split point, it is probably an
896 DEBUG(dbgs() << ", uses at " << BI
.LastUse
<< " after split point "
897 << LastSplitPoint
<< ", stack-out.\n");
898 SlotIndex SegEnd
= SE
->leaveIntvBefore(LastSplitPoint
);
899 SE
->useIntv(Start
, SegEnd
);
900 // Run a double interval from the split to the last use.
901 // This makes it possible to spill the complement without affecting the
903 SE
->overlapIntv(SegEnd
, BI
.LastUse
);
906 // Register is live-through.
907 DEBUG(dbgs() << ", uses, live-through.\n");
908 SE
->useIntv(Start
, Stop
);
912 // Block has interference.
913 DEBUG(dbgs() << ", interference from " << Intf
.first());
915 if (!BI
.LiveThrough
&& Intf
.first() >= BI
.LastUse
) {
916 // The interference doesn't reach the outgoing segment.
917 DEBUG(dbgs() << " doesn't affect kill at " << BI
.LastUse
<< '\n');
918 SE
->useIntv(Start
, BI
.LastUse
);
922 if (Intf
.first().getBaseIndex() > BI
.FirstUse
) {
923 // There are interference-free uses at the beginning of the block.
924 // Find the last use that can get the register.
925 SmallVectorImpl
<SlotIndex
>::const_iterator UI
=
926 std::lower_bound(SA
->UseSlots
.begin(), SA
->UseSlots
.end(),
927 Intf
.first().getBaseIndex());
928 assert(UI
!= SA
->UseSlots
.begin() && "Couldn't find first use");
929 SlotIndex Use
= (--UI
)->getBoundaryIndex();
930 DEBUG(dbgs() << ", free use at " << *UI
<< ".\n");
931 SlotIndex SegEnd
= SE
->leaveIntvAfter(Use
);
932 assert(SegEnd
<= Intf
.first() && "Couldn't avoid interference");
933 SE
->useIntv(Start
, SegEnd
);
937 // Interference is before the first use.
938 DEBUG(dbgs() << " before first use.\n");
939 SlotIndex SegEnd
= SE
->leaveIntvAtTop(*BI
.MBB
);
940 assert(SegEnd
<= Intf
.first() && "Couldn't avoid interference");
943 // Handle live-through blocks.
944 for (unsigned i
= 0, e
= Cand
.ActiveBlocks
.size(); i
!= e
; ++i
) {
945 unsigned Number
= Cand
.ActiveBlocks
[i
];
946 bool RegIn
= LiveBundles
[Bundles
->getBundle(Number
, 0)];
947 bool RegOut
= LiveBundles
[Bundles
->getBundle(Number
, 1)];
948 DEBUG(dbgs() << "Live through BB#" << Number
<< '\n');
949 if (RegIn
&& RegOut
) {
950 Intf
.moveToBlock(Number
);
951 if (!Intf
.hasInterference()) {
952 SE
->useIntv(Indexes
->getMBBStartIdx(Number
),
953 Indexes
->getMBBEndIdx(Number
));
957 MachineBasicBlock
*MBB
= MF
->getBlockNumbered(Number
);
959 SE
->leaveIntvAtTop(*MBB
);
961 SE
->enterIntvAtEnd(*MBB
);
966 SmallVector
<unsigned, 8> IntvMap
;
967 SE
->finish(&IntvMap
);
968 DebugVars
->splitRegister(VirtReg
.reg
, LREdit
.regs());
970 LRStage
.resize(MRI
->getNumVirtRegs());
971 unsigned OrigBlocks
= SA
->getNumLiveBlocks();
973 // Sort out the new intervals created by splitting. We get four kinds:
974 // - Remainder intervals should not be split again.
975 // - Candidate intervals can be assigned to Cand.PhysReg.
976 // - Block-local splits are candidates for local splitting.
977 // - DCE leftovers should go back on the queue.
978 for (unsigned i
= 0, e
= LREdit
.size(); i
!= e
; ++i
) {
979 unsigned Reg
= LREdit
.get(i
)->reg
;
981 // Ignore old intervals from DCE.
982 if (LRStage
[Reg
] != RS_New
)
985 // Remainder interval. Don't try splitting again, spill if it doesn't
987 if (IntvMap
[i
] == 0) {
988 LRStage
[Reg
] = RS_Global
;
992 // Main interval. Allow repeated splitting as long as the number of live
993 // blocks is strictly decreasing.
994 if (IntvMap
[i
] == MainIntv
) {
995 if (SA
->countLiveBlocks(LREdit
.get(i
)) >= OrigBlocks
) {
996 DEBUG(dbgs() << "Main interval covers the same " << OrigBlocks
997 << " blocks as original.\n");
998 // Don't allow repeated splitting as a safe guard against looping.
999 LRStage
[Reg
] = RS_Global
;
1004 // Other intervals are treated as new. This includes local intervals created
1005 // for blocks with multiple uses, and anything created by DCE.
1009 MF
->verify(this, "After splitting live range around region");
1012 unsigned RAGreedy::tryRegionSplit(LiveInterval
&VirtReg
, AllocationOrder
&Order
,
1013 SmallVectorImpl
<LiveInterval
*> &NewVRegs
) {
1014 float BestCost
= Hysteresis
* calcSpillCost();
1015 DEBUG(dbgs() << "Cost of isolating all blocks = " << BestCost
<< '\n');
1016 const unsigned NoCand
= ~0u;
1017 unsigned BestCand
= NoCand
;
1020 for (unsigned Cand
= 0; unsigned PhysReg
= Order
.next(); ++Cand
) {
1021 if (GlobalCand
.size() <= Cand
)
1022 GlobalCand
.resize(Cand
+1);
1023 GlobalCand
[Cand
].reset(PhysReg
);
1025 SpillPlacer
->prepare(GlobalCand
[Cand
].LiveBundles
);
1027 InterferenceCache::Cursor
Intf(IntfCache
, PhysReg
);
1028 if (!addSplitConstraints(Intf
, Cost
)) {
1029 DEBUG(dbgs() << PrintReg(PhysReg
, TRI
) << "\tno positive bundles\n");
1032 DEBUG(dbgs() << PrintReg(PhysReg
, TRI
) << "\tstatic = " << Cost
);
1033 if (Cost
>= BestCost
) {
1035 if (BestCand
== NoCand
)
1036 dbgs() << " worse than no bundles\n";
1038 dbgs() << " worse than "
1039 << PrintReg(GlobalCand
[BestCand
].PhysReg
, TRI
) << '\n';
1043 growRegion(GlobalCand
[Cand
], Intf
);
1045 SpillPlacer
->finish();
1047 // No live bundles, defer to splitSingleBlocks().
1048 if (!GlobalCand
[Cand
].LiveBundles
.any()) {
1049 DEBUG(dbgs() << " no bundles.\n");
1053 Cost
+= calcGlobalSplitCost(GlobalCand
[Cand
], Intf
);
1055 dbgs() << ", total = " << Cost
<< " with bundles";
1056 for (int i
= GlobalCand
[Cand
].LiveBundles
.find_first(); i
>=0;
1057 i
= GlobalCand
[Cand
].LiveBundles
.find_next(i
))
1058 dbgs() << " EB#" << i
;
1061 if (Cost
< BestCost
) {
1063 BestCost
= Hysteresis
* Cost
; // Prevent rounding effects.
1067 if (BestCand
== NoCand
)
1070 splitAroundRegion(VirtReg
, GlobalCand
[BestCand
], NewVRegs
);
1075 //===----------------------------------------------------------------------===//
1077 //===----------------------------------------------------------------------===//
1080 /// calcGapWeights - Compute the maximum spill weight that needs to be evicted
1081 /// in order to use PhysReg between two entries in SA->UseSlots.
1083 /// GapWeight[i] represents the gap between UseSlots[i] and UseSlots[i+1].
1085 void RAGreedy::calcGapWeights(unsigned PhysReg
,
1086 SmallVectorImpl
<float> &GapWeight
) {
1087 assert(SA
->getUseBlocks().size() == 1 && "Not a local interval");
1088 const SplitAnalysis::BlockInfo
&BI
= SA
->getUseBlocks().front();
1089 const SmallVectorImpl
<SlotIndex
> &Uses
= SA
->UseSlots
;
1090 const unsigned NumGaps
= Uses
.size()-1;
1092 // Start and end points for the interference check.
1093 SlotIndex StartIdx
= BI
.LiveIn
? BI
.FirstUse
.getBaseIndex() : BI
.FirstUse
;
1094 SlotIndex StopIdx
= BI
.LiveOut
? BI
.LastUse
.getBoundaryIndex() : BI
.LastUse
;
1096 GapWeight
.assign(NumGaps
, 0.0f
);
1098 // Add interference from each overlapping register.
1099 for (const unsigned *AI
= TRI
->getOverlaps(PhysReg
); *AI
; ++AI
) {
1100 if (!query(const_cast<LiveInterval
&>(SA
->getParent()), *AI
)
1101 .checkInterference())
1104 // We know that VirtReg is a continuous interval from FirstUse to LastUse,
1105 // so we don't need InterferenceQuery.
1107 // Interference that overlaps an instruction is counted in both gaps
1108 // surrounding the instruction. The exception is interference before
1109 // StartIdx and after StopIdx.
1111 LiveIntervalUnion::SegmentIter IntI
= PhysReg2LiveUnion
[*AI
].find(StartIdx
);
1112 for (unsigned Gap
= 0; IntI
.valid() && IntI
.start() < StopIdx
; ++IntI
) {
1113 // Skip the gaps before IntI.
1114 while (Uses
[Gap
+1].getBoundaryIndex() < IntI
.start())
1115 if (++Gap
== NumGaps
)
1120 // Update the gaps covered by IntI.
1121 const float weight
= IntI
.value()->weight
;
1122 for (; Gap
!= NumGaps
; ++Gap
) {
1123 GapWeight
[Gap
] = std::max(GapWeight
[Gap
], weight
);
1124 if (Uses
[Gap
+1].getBaseIndex() >= IntI
.stop())
1133 /// tryLocalSplit - Try to split VirtReg into smaller intervals inside its only
1136 unsigned RAGreedy::tryLocalSplit(LiveInterval
&VirtReg
, AllocationOrder
&Order
,
1137 SmallVectorImpl
<LiveInterval
*> &NewVRegs
) {
1138 assert(SA
->getUseBlocks().size() == 1 && "Not a local interval");
1139 const SplitAnalysis::BlockInfo
&BI
= SA
->getUseBlocks().front();
1141 // Note that it is possible to have an interval that is live-in or live-out
1142 // while only covering a single block - A phi-def can use undef values from
1143 // predecessors, and the block could be a single-block loop.
1144 // We don't bother doing anything clever about such a case, we simply assume
1145 // that the interval is continuous from FirstUse to LastUse. We should make
1146 // sure that we don't do anything illegal to such an interval, though.
1148 const SmallVectorImpl
<SlotIndex
> &Uses
= SA
->UseSlots
;
1149 if (Uses
.size() <= 2)
1151 const unsigned NumGaps
= Uses
.size()-1;
1154 dbgs() << "tryLocalSplit: ";
1155 for (unsigned i
= 0, e
= Uses
.size(); i
!= e
; ++i
)
1156 dbgs() << ' ' << SA
->UseSlots
[i
];
1160 // Since we allow local split results to be split again, there is a risk of
1161 // creating infinite loops. It is tempting to require that the new live
1162 // ranges have less instructions than the original. That would guarantee
1163 // convergence, but it is too strict. A live range with 3 instructions can be
1164 // split 2+3 (including the COPY), and we want to allow that.
1166 // Instead we use these rules:
1168 // 1. Allow any split for ranges with getStage() < RS_Local. (Except for the
1169 // noop split, of course).
1170 // 2. Require progress be made for ranges with getStage() >= RS_Local. All
1171 // the new ranges must have fewer instructions than before the split.
1172 // 3. New ranges with the same number of instructions are marked RS_Local,
1173 // smaller ranges are marked RS_New.
1175 // These rules allow a 3 -> 2+3 split once, which we need. They also prevent
1176 // excessive splitting and infinite loops.
1178 bool ProgressRequired
= getStage(VirtReg
) >= RS_Local
;
1180 // Best split candidate.
1181 unsigned BestBefore
= NumGaps
;
1182 unsigned BestAfter
= 0;
1185 const float blockFreq
= SpillPlacer
->getBlockFrequency(BI
.MBB
->getNumber());
1186 SmallVector
<float, 8> GapWeight
;
1189 while (unsigned PhysReg
= Order
.next()) {
1190 // Keep track of the largest spill weight that would need to be evicted in
1191 // order to make use of PhysReg between UseSlots[i] and UseSlots[i+1].
1192 calcGapWeights(PhysReg
, GapWeight
);
1194 // Try to find the best sequence of gaps to close.
1195 // The new spill weight must be larger than any gap interference.
1197 // We will split before Uses[SplitBefore] and after Uses[SplitAfter].
1198 unsigned SplitBefore
= 0, SplitAfter
= 1;
1200 // MaxGap should always be max(GapWeight[SplitBefore..SplitAfter-1]).
1201 // It is the spill weight that needs to be evicted.
1202 float MaxGap
= GapWeight
[0];
1205 // Live before/after split?
1206 const bool LiveBefore
= SplitBefore
!= 0 || BI
.LiveIn
;
1207 const bool LiveAfter
= SplitAfter
!= NumGaps
|| BI
.LiveOut
;
1209 DEBUG(dbgs() << PrintReg(PhysReg
, TRI
) << ' '
1210 << Uses
[SplitBefore
] << '-' << Uses
[SplitAfter
]
1211 << " i=" << MaxGap
);
1213 // Stop before the interval gets so big we wouldn't be making progress.
1214 if (!LiveBefore
&& !LiveAfter
) {
1215 DEBUG(dbgs() << " all\n");
1218 // Should the interval be extended or shrunk?
1221 // How many gaps would the new range have?
1222 unsigned NewGaps
= LiveBefore
+ SplitAfter
- SplitBefore
+ LiveAfter
;
1224 // Legally, without causing looping?
1225 bool Legal
= !ProgressRequired
|| NewGaps
< NumGaps
;
1227 if (Legal
&& MaxGap
< HUGE_VALF
) {
1228 // Estimate the new spill weight. Each instruction reads or writes the
1229 // register. Conservatively assume there are no read-modify-write
1232 // Try to guess the size of the new interval.
1233 const float EstWeight
= normalizeSpillWeight(blockFreq
* (NewGaps
+ 1),
1234 Uses
[SplitBefore
].distance(Uses
[SplitAfter
]) +
1235 (LiveBefore
+ LiveAfter
)*SlotIndex::InstrDist
);
1236 // Would this split be possible to allocate?
1237 // Never allocate all gaps, we wouldn't be making progress.
1238 DEBUG(dbgs() << " w=" << EstWeight
);
1239 if (EstWeight
* Hysteresis
>= MaxGap
) {
1241 float Diff
= EstWeight
- MaxGap
;
1242 if (Diff
> BestDiff
) {
1243 DEBUG(dbgs() << " (best)");
1244 BestDiff
= Hysteresis
* Diff
;
1245 BestBefore
= SplitBefore
;
1246 BestAfter
= SplitAfter
;
1253 if (++SplitBefore
< SplitAfter
) {
1254 DEBUG(dbgs() << " shrink\n");
1255 // Recompute the max when necessary.
1256 if (GapWeight
[SplitBefore
- 1] >= MaxGap
) {
1257 MaxGap
= GapWeight
[SplitBefore
];
1258 for (unsigned i
= SplitBefore
+ 1; i
!= SplitAfter
; ++i
)
1259 MaxGap
= std::max(MaxGap
, GapWeight
[i
]);
1266 // Try to extend the interval.
1267 if (SplitAfter
>= NumGaps
) {
1268 DEBUG(dbgs() << " end\n");
1272 DEBUG(dbgs() << " extend\n");
1273 MaxGap
= std::max(MaxGap
, GapWeight
[SplitAfter
++]);
1277 // Didn't find any candidates?
1278 if (BestBefore
== NumGaps
)
1281 DEBUG(dbgs() << "Best local split range: " << Uses
[BestBefore
]
1282 << '-' << Uses
[BestAfter
] << ", " << BestDiff
1283 << ", " << (BestAfter
- BestBefore
+ 1) << " instrs\n");
1285 LiveRangeEdit
LREdit(VirtReg
, NewVRegs
, this);
1289 SlotIndex SegStart
= SE
->enterIntvBefore(Uses
[BestBefore
]);
1290 SlotIndex SegStop
= SE
->leaveIntvAfter(Uses
[BestAfter
]);
1291 SE
->useIntv(SegStart
, SegStop
);
1292 SmallVector
<unsigned, 8> IntvMap
;
1293 SE
->finish(&IntvMap
);
1294 DebugVars
->splitRegister(VirtReg
.reg
, LREdit
.regs());
1296 // If the new range has the same number of instructions as before, mark it as
1297 // RS_Local so the next split will be forced to make progress. Otherwise,
1298 // leave the new intervals as RS_New so they can compete.
1299 bool LiveBefore
= BestBefore
!= 0 || BI
.LiveIn
;
1300 bool LiveAfter
= BestAfter
!= NumGaps
|| BI
.LiveOut
;
1301 unsigned NewGaps
= LiveBefore
+ BestAfter
- BestBefore
+ LiveAfter
;
1302 if (NewGaps
>= NumGaps
) {
1303 DEBUG(dbgs() << "Tagging non-progress ranges: ");
1304 assert(!ProgressRequired
&& "Didn't make progress when it was required.");
1305 LRStage
.resize(MRI
->getNumVirtRegs());
1306 for (unsigned i
= 0, e
= IntvMap
.size(); i
!= e
; ++i
)
1307 if (IntvMap
[i
] == 1) {
1308 LRStage
[LREdit
.get(i
)->reg
] = RS_Local
;
1309 DEBUG(dbgs() << PrintReg(LREdit
.get(i
)->reg
));
1311 DEBUG(dbgs() << '\n');
1318 //===----------------------------------------------------------------------===//
1319 // Live Range Splitting
1320 //===----------------------------------------------------------------------===//
1322 /// trySplit - Try to split VirtReg or one of its interferences, making it
1324 /// @return Physreg when VirtReg may be assigned and/or new NewVRegs.
1325 unsigned RAGreedy::trySplit(LiveInterval
&VirtReg
, AllocationOrder
&Order
,
1326 SmallVectorImpl
<LiveInterval
*>&NewVRegs
) {
1327 // Local intervals are handled separately.
1328 if (LIS
->intervalIsInOneMBB(VirtReg
)) {
1329 NamedRegionTimer
T("Local Splitting", TimerGroupName
, TimePassesIsEnabled
);
1330 SA
->analyze(&VirtReg
);
1331 return tryLocalSplit(VirtReg
, Order
, NewVRegs
);
1334 NamedRegionTimer
T("Global Splitting", TimerGroupName
, TimePassesIsEnabled
);
1336 // Don't iterate global splitting.
1337 // Move straight to spilling if this range was produced by a global split.
1338 if (getStage(VirtReg
) >= RS_Global
)
1341 SA
->analyze(&VirtReg
);
1343 // FIXME: SplitAnalysis may repair broken live ranges coming from the
1344 // coalescer. That may cause the range to become allocatable which means that
1345 // tryRegionSplit won't be making progress. This check should be replaced with
1346 // an assertion when the coalescer is fixed.
1347 if (SA
->didRepairRange()) {
1348 // VirtReg has changed, so all cached queries are invalid.
1349 invalidateVirtRegs();
1350 if (unsigned PhysReg
= tryAssign(VirtReg
, Order
, NewVRegs
))
1354 // First try to split around a region spanning multiple blocks.
1355 unsigned PhysReg
= tryRegionSplit(VirtReg
, Order
, NewVRegs
);
1356 if (PhysReg
|| !NewVRegs
.empty())
1359 // Then isolate blocks with multiple uses.
1360 SplitAnalysis::BlockPtrSet Blocks
;
1361 if (SA
->getMultiUseBlocks(Blocks
)) {
1362 LiveRangeEdit
LREdit(VirtReg
, NewVRegs
, this);
1364 SE
->splitSingleBlocks(Blocks
);
1365 setStage(NewVRegs
.begin(), NewVRegs
.end(), RS_Global
);
1367 MF
->verify(this, "After splitting live range around basic blocks");
1370 // Don't assign any physregs.
1375 //===----------------------------------------------------------------------===//
1377 //===----------------------------------------------------------------------===//
1379 unsigned RAGreedy::selectOrSplit(LiveInterval
&VirtReg
,
1380 SmallVectorImpl
<LiveInterval
*> &NewVRegs
) {
1381 // First try assigning a free register.
1382 AllocationOrder
Order(VirtReg
.reg
, *VRM
, RegClassInfo
);
1383 if (unsigned PhysReg
= tryAssign(VirtReg
, Order
, NewVRegs
))
1386 LiveRangeStage Stage
= getStage(VirtReg
);
1387 DEBUG(dbgs() << StageName
[Stage
] << '\n');
1389 // Try to evict a less worthy live range, but only for ranges from the primary
1390 // queue. The RS_Second ranges already failed to do this, and they should not
1391 // get a second chance until they have been split.
1392 if (Stage
!= RS_Second
)
1393 if (unsigned PhysReg
= tryEvict(VirtReg
, Order
, NewVRegs
))
1396 assert(NewVRegs
.empty() && "Cannot append to existing NewVRegs");
1398 // The first time we see a live range, don't try to split or spill.
1399 // Wait until the second time, when all smaller ranges have been allocated.
1400 // This gives a better picture of the interference to split around.
1401 if (Stage
== RS_First
) {
1402 LRStage
[VirtReg
.reg
] = RS_Second
;
1403 DEBUG(dbgs() << "wait for second round\n");
1404 NewVRegs
.push_back(&VirtReg
);
1408 // If we couldn't allocate a register from spilling, there is probably some
1409 // invalid inline assembly. The base class wil report it.
1410 if (Stage
>= RS_Spill
)
1413 // Try splitting VirtReg or interferences.
1414 unsigned PhysReg
= trySplit(VirtReg
, Order
, NewVRegs
);
1415 if (PhysReg
|| !NewVRegs
.empty())
1418 // Finally spill VirtReg itself.
1419 NamedRegionTimer
T("Spiller", TimerGroupName
, TimePassesIsEnabled
);
1420 LiveRangeEdit
LRE(VirtReg
, NewVRegs
, this);
1421 spiller().spill(LRE
);
1422 setStage(NewVRegs
.begin(), NewVRegs
.end(), RS_Spill
);
1425 MF
->verify(this, "After spilling");
1427 // The live virtual register requesting allocation was spilled, so tell
1428 // the caller not to allocate anything during this round.
1432 bool RAGreedy::runOnMachineFunction(MachineFunction
&mf
) {
1433 DEBUG(dbgs() << "********** GREEDY REGISTER ALLOCATION **********\n"
1434 << "********** Function: "
1435 << ((Value
*)mf
.getFunction())->getName() << '\n');
1439 MF
->verify(this, "Before greedy register allocator");
1441 RegAllocBase::init(getAnalysis
<VirtRegMap
>(), getAnalysis
<LiveIntervals
>());
1442 Indexes
= &getAnalysis
<SlotIndexes
>();
1443 DomTree
= &getAnalysis
<MachineDominatorTree
>();
1444 SpillerInstance
.reset(createInlineSpiller(*this, *MF
, *VRM
));
1445 Loops
= &getAnalysis
<MachineLoopInfo
>();
1446 LoopRanges
= &getAnalysis
<MachineLoopRanges
>();
1447 Bundles
= &getAnalysis
<EdgeBundles
>();
1448 SpillPlacer
= &getAnalysis
<SpillPlacement
>();
1449 DebugVars
= &getAnalysis
<LiveDebugVariables
>();
1451 SA
.reset(new SplitAnalysis(*VRM
, *LIS
, *Loops
));
1452 SE
.reset(new SplitEditor(*SA
, *LIS
, *VRM
, *DomTree
));
1454 LRStage
.resize(MRI
->getNumVirtRegs());
1455 IntfCache
.init(MF
, &PhysReg2LiveUnion
[0], Indexes
, TRI
);
1459 LIS
->addKillFlags();
1463 NamedRegionTimer
T("Rewriter", TimerGroupName
, TimePassesIsEnabled
);
1464 VRM
->rewrite(Indexes
);
1467 // Write out new DBG_VALUE instructions.
1468 DebugVars
->emitDebugValues(VRM
);
1470 // The pass output is in VirtRegMap. Release all the transient data.