1*9880d681SAndroid Build Coastguard Worker //===-- RegAllocGreedy.cpp - greedy register allocator --------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines the RAGreedy function pass for register allocation in
11*9880d681SAndroid Build Coastguard Worker // optimized builds.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "AllocationOrder.h"
16*9880d681SAndroid Build Coastguard Worker #include "InterferenceCache.h"
17*9880d681SAndroid Build Coastguard Worker #include "LiveDebugVariables.h"
18*9880d681SAndroid Build Coastguard Worker #include "RegAllocBase.h"
19*9880d681SAndroid Build Coastguard Worker #include "SpillPlacement.h"
20*9880d681SAndroid Build Coastguard Worker #include "Spiller.h"
21*9880d681SAndroid Build Coastguard Worker #include "SplitKit.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Statistic.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/AliasAnalysis.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/CalcSpillWeights.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/EdgeBundles.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveIntervalAnalysis.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveRangeEdit.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveRegMatrix.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveStackAnalysis.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineDominators.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunctionPass.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineLoopInfo.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/RegAllocRegistry.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/RegisterClassInfo.h"
38*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/VirtRegMap.h"
39*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
40*9880d681SAndroid Build Coastguard Worker #include "llvm/PassAnalysisSupport.h"
41*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/BranchProbability.h"
42*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
43*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
44*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
45*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Timer.h"
46*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
47*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetInstrInfo.h"
48*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h"
49*9880d681SAndroid Build Coastguard Worker #include <queue>
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker using namespace llvm;
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "regalloc"
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker STATISTIC(NumGlobalSplits, "Number of split global live ranges");
56*9880d681SAndroid Build Coastguard Worker STATISTIC(NumLocalSplits, "Number of split local live ranges");
57*9880d681SAndroid Build Coastguard Worker STATISTIC(NumEvicted, "Number of interferences evicted");
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker static cl::opt<SplitEditor::ComplementSpillMode> SplitSpillMode(
60*9880d681SAndroid Build Coastguard Worker "split-spill-mode", cl::Hidden,
61*9880d681SAndroid Build Coastguard Worker cl::desc("Spill mode for splitting live ranges"),
62*9880d681SAndroid Build Coastguard Worker cl::values(clEnumValN(SplitEditor::SM_Partition, "default", "Default"),
63*9880d681SAndroid Build Coastguard Worker clEnumValN(SplitEditor::SM_Size, "size", "Optimize for size"),
64*9880d681SAndroid Build Coastguard Worker clEnumValN(SplitEditor::SM_Speed, "speed", "Optimize for speed"),
65*9880d681SAndroid Build Coastguard Worker clEnumValEnd),
66*9880d681SAndroid Build Coastguard Worker cl::init(SplitEditor::SM_Speed));
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned>
69*9880d681SAndroid Build Coastguard Worker LastChanceRecoloringMaxDepth("lcr-max-depth", cl::Hidden,
70*9880d681SAndroid Build Coastguard Worker cl::desc("Last chance recoloring max depth"),
71*9880d681SAndroid Build Coastguard Worker cl::init(5));
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned> LastChanceRecoloringMaxInterference(
74*9880d681SAndroid Build Coastguard Worker "lcr-max-interf", cl::Hidden,
75*9880d681SAndroid Build Coastguard Worker cl::desc("Last chance recoloring maximum number of considered"
76*9880d681SAndroid Build Coastguard Worker " interference at a time"),
77*9880d681SAndroid Build Coastguard Worker cl::init(8));
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
80*9880d681SAndroid Build Coastguard Worker ExhaustiveSearch("exhaustive-register-search", cl::NotHidden,
81*9880d681SAndroid Build Coastguard Worker cl::desc("Exhaustive Search for registers bypassing the depth "
82*9880d681SAndroid Build Coastguard Worker "and interference cutoffs of last chance recoloring"));
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> EnableLocalReassignment(
85*9880d681SAndroid Build Coastguard Worker "enable-local-reassign", cl::Hidden,
86*9880d681SAndroid Build Coastguard Worker cl::desc("Local reassignment can yield better allocation decisions, but "
87*9880d681SAndroid Build Coastguard Worker "may be compile time intensive"),
88*9880d681SAndroid Build Coastguard Worker cl::init(false));
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> EnableDeferredSpilling(
91*9880d681SAndroid Build Coastguard Worker "enable-deferred-spilling", cl::Hidden,
92*9880d681SAndroid Build Coastguard Worker cl::desc("Instead of spilling a variable right away, defer the actual "
93*9880d681SAndroid Build Coastguard Worker "code insertion to the end of the allocation. That way the "
94*9880d681SAndroid Build Coastguard Worker "allocator might still find a suitable coloring for this "
95*9880d681SAndroid Build Coastguard Worker "variable because of other evicted variables."),
96*9880d681SAndroid Build Coastguard Worker cl::init(false));
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker // FIXME: Find a good default for this flag and remove the flag.
99*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned>
100*9880d681SAndroid Build Coastguard Worker CSRFirstTimeCost("regalloc-csr-first-time-cost",
101*9880d681SAndroid Build Coastguard Worker cl::desc("Cost for first time use of callee-saved register."),
102*9880d681SAndroid Build Coastguard Worker cl::init(0), cl::Hidden);
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker static RegisterRegAlloc greedyRegAlloc("greedy", "greedy register allocator",
105*9880d681SAndroid Build Coastguard Worker createGreedyRegisterAllocator);
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker namespace {
108*9880d681SAndroid Build Coastguard Worker class RAGreedy : public MachineFunctionPass,
109*9880d681SAndroid Build Coastguard Worker public RegAllocBase,
110*9880d681SAndroid Build Coastguard Worker private LiveRangeEdit::Delegate {
111*9880d681SAndroid Build Coastguard Worker // Convenient shortcuts.
112*9880d681SAndroid Build Coastguard Worker typedef std::priority_queue<std::pair<unsigned, unsigned> > PQueue;
113*9880d681SAndroid Build Coastguard Worker typedef SmallPtrSet<LiveInterval *, 4> SmallLISet;
114*9880d681SAndroid Build Coastguard Worker typedef SmallSet<unsigned, 16> SmallVirtRegSet;
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker // context
117*9880d681SAndroid Build Coastguard Worker MachineFunction *MF;
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker // Shortcuts to some useful interface.
120*9880d681SAndroid Build Coastguard Worker const TargetInstrInfo *TII;
121*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI;
122*9880d681SAndroid Build Coastguard Worker RegisterClassInfo RCI;
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker // analyses
125*9880d681SAndroid Build Coastguard Worker SlotIndexes *Indexes;
126*9880d681SAndroid Build Coastguard Worker MachineBlockFrequencyInfo *MBFI;
127*9880d681SAndroid Build Coastguard Worker MachineDominatorTree *DomTree;
128*9880d681SAndroid Build Coastguard Worker MachineLoopInfo *Loops;
129*9880d681SAndroid Build Coastguard Worker EdgeBundles *Bundles;
130*9880d681SAndroid Build Coastguard Worker SpillPlacement *SpillPlacer;
131*9880d681SAndroid Build Coastguard Worker LiveDebugVariables *DebugVars;
132*9880d681SAndroid Build Coastguard Worker AliasAnalysis *AA;
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker // state
135*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Spiller> SpillerInstance;
136*9880d681SAndroid Build Coastguard Worker PQueue Queue;
137*9880d681SAndroid Build Coastguard Worker unsigned NextCascade;
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker // Live ranges pass through a number of stages as we try to allocate them.
140*9880d681SAndroid Build Coastguard Worker // Some of the stages may also create new live ranges:
141*9880d681SAndroid Build Coastguard Worker //
142*9880d681SAndroid Build Coastguard Worker // - Region splitting.
143*9880d681SAndroid Build Coastguard Worker // - Per-block splitting.
144*9880d681SAndroid Build Coastguard Worker // - Local splitting.
145*9880d681SAndroid Build Coastguard Worker // - Spilling.
146*9880d681SAndroid Build Coastguard Worker //
147*9880d681SAndroid Build Coastguard Worker // Ranges produced by one of the stages skip the previous stages when they are
148*9880d681SAndroid Build Coastguard Worker // dequeued. This improves performance because we can skip interference checks
149*9880d681SAndroid Build Coastguard Worker // that are unlikely to give any results. It also guarantees that the live
150*9880d681SAndroid Build Coastguard Worker // range splitting algorithm terminates, something that is otherwise hard to
151*9880d681SAndroid Build Coastguard Worker // ensure.
152*9880d681SAndroid Build Coastguard Worker enum LiveRangeStage {
153*9880d681SAndroid Build Coastguard Worker /// Newly created live range that has never been queued.
154*9880d681SAndroid Build Coastguard Worker RS_New,
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker /// Only attempt assignment and eviction. Then requeue as RS_Split.
157*9880d681SAndroid Build Coastguard Worker RS_Assign,
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker /// Attempt live range splitting if assignment is impossible.
160*9880d681SAndroid Build Coastguard Worker RS_Split,
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker /// Attempt more aggressive live range splitting that is guaranteed to make
163*9880d681SAndroid Build Coastguard Worker /// progress. This is used for split products that may not be making
164*9880d681SAndroid Build Coastguard Worker /// progress.
165*9880d681SAndroid Build Coastguard Worker RS_Split2,
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker /// Live range will be spilled. No more splitting will be attempted.
168*9880d681SAndroid Build Coastguard Worker RS_Spill,
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker /// Live range is in memory. Because of other evictions, it might get moved
172*9880d681SAndroid Build Coastguard Worker /// in a register in the end.
173*9880d681SAndroid Build Coastguard Worker RS_Memory,
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker /// There is nothing more we can do to this live range. Abort compilation
176*9880d681SAndroid Build Coastguard Worker /// if it can't be assigned.
177*9880d681SAndroid Build Coastguard Worker RS_Done
178*9880d681SAndroid Build Coastguard Worker };
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker // Enum CutOffStage to keep a track whether the register allocation failed
181*9880d681SAndroid Build Coastguard Worker // because of the cutoffs encountered in last chance recoloring.
182*9880d681SAndroid Build Coastguard Worker // Note: This is used as bitmask. New value should be next power of 2.
183*9880d681SAndroid Build Coastguard Worker enum CutOffStage {
184*9880d681SAndroid Build Coastguard Worker // No cutoffs encountered
185*9880d681SAndroid Build Coastguard Worker CO_None = 0,
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker // lcr-max-depth cutoff encountered
188*9880d681SAndroid Build Coastguard Worker CO_Depth = 1,
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker // lcr-max-interf cutoff encountered
191*9880d681SAndroid Build Coastguard Worker CO_Interf = 2
192*9880d681SAndroid Build Coastguard Worker };
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker uint8_t CutOffInfo;
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
197*9880d681SAndroid Build Coastguard Worker static const char *const StageName[];
198*9880d681SAndroid Build Coastguard Worker #endif
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker // RegInfo - Keep additional information about each live range.
201*9880d681SAndroid Build Coastguard Worker struct RegInfo {
202*9880d681SAndroid Build Coastguard Worker LiveRangeStage Stage;
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker // Cascade - Eviction loop prevention. See canEvictInterference().
205*9880d681SAndroid Build Coastguard Worker unsigned Cascade;
206*9880d681SAndroid Build Coastguard Worker
RegInfo__anon65c1e5750111::RAGreedy::RegInfo207*9880d681SAndroid Build Coastguard Worker RegInfo() : Stage(RS_New), Cascade(0) {}
208*9880d681SAndroid Build Coastguard Worker };
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker IndexedMap<RegInfo, VirtReg2IndexFunctor> ExtraRegInfo;
211*9880d681SAndroid Build Coastguard Worker
getStage(const LiveInterval & VirtReg) const212*9880d681SAndroid Build Coastguard Worker LiveRangeStage getStage(const LiveInterval &VirtReg) const {
213*9880d681SAndroid Build Coastguard Worker return ExtraRegInfo[VirtReg.reg].Stage;
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker
setStage(const LiveInterval & VirtReg,LiveRangeStage Stage)216*9880d681SAndroid Build Coastguard Worker void setStage(const LiveInterval &VirtReg, LiveRangeStage Stage) {
217*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
218*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[VirtReg.reg].Stage = Stage;
219*9880d681SAndroid Build Coastguard Worker }
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker template<typename Iterator>
setStage(Iterator Begin,Iterator End,LiveRangeStage NewStage)222*9880d681SAndroid Build Coastguard Worker void setStage(Iterator Begin, Iterator End, LiveRangeStage NewStage) {
223*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
224*9880d681SAndroid Build Coastguard Worker for (;Begin != End; ++Begin) {
225*9880d681SAndroid Build Coastguard Worker unsigned Reg = *Begin;
226*9880d681SAndroid Build Coastguard Worker if (ExtraRegInfo[Reg].Stage == RS_New)
227*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[Reg].Stage = NewStage;
228*9880d681SAndroid Build Coastguard Worker }
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker /// Cost of evicting interference.
232*9880d681SAndroid Build Coastguard Worker struct EvictionCost {
233*9880d681SAndroid Build Coastguard Worker unsigned BrokenHints; ///< Total number of broken hints.
234*9880d681SAndroid Build Coastguard Worker float MaxWeight; ///< Maximum spill weight evicted.
235*9880d681SAndroid Build Coastguard Worker
EvictionCost__anon65c1e5750111::RAGreedy::EvictionCost236*9880d681SAndroid Build Coastguard Worker EvictionCost(): BrokenHints(0), MaxWeight(0) {}
237*9880d681SAndroid Build Coastguard Worker
isMax__anon65c1e5750111::RAGreedy::EvictionCost238*9880d681SAndroid Build Coastguard Worker bool isMax() const { return BrokenHints == ~0u; }
239*9880d681SAndroid Build Coastguard Worker
setMax__anon65c1e5750111::RAGreedy::EvictionCost240*9880d681SAndroid Build Coastguard Worker void setMax() { BrokenHints = ~0u; }
241*9880d681SAndroid Build Coastguard Worker
setBrokenHints__anon65c1e5750111::RAGreedy::EvictionCost242*9880d681SAndroid Build Coastguard Worker void setBrokenHints(unsigned NHints) { BrokenHints = NHints; }
243*9880d681SAndroid Build Coastguard Worker
operator <__anon65c1e5750111::RAGreedy::EvictionCost244*9880d681SAndroid Build Coastguard Worker bool operator<(const EvictionCost &O) const {
245*9880d681SAndroid Build Coastguard Worker return std::tie(BrokenHints, MaxWeight) <
246*9880d681SAndroid Build Coastguard Worker std::tie(O.BrokenHints, O.MaxWeight);
247*9880d681SAndroid Build Coastguard Worker }
248*9880d681SAndroid Build Coastguard Worker };
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker // splitting state.
251*9880d681SAndroid Build Coastguard Worker std::unique_ptr<SplitAnalysis> SA;
252*9880d681SAndroid Build Coastguard Worker std::unique_ptr<SplitEditor> SE;
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker /// Cached per-block interference maps
255*9880d681SAndroid Build Coastguard Worker InterferenceCache IntfCache;
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker /// All basic blocks where the current register has uses.
258*9880d681SAndroid Build Coastguard Worker SmallVector<SpillPlacement::BlockConstraint, 8> SplitConstraints;
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker /// Global live range splitting candidate info.
261*9880d681SAndroid Build Coastguard Worker struct GlobalSplitCandidate {
262*9880d681SAndroid Build Coastguard Worker // Register intended for assignment, or 0.
263*9880d681SAndroid Build Coastguard Worker unsigned PhysReg;
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker // SplitKit interval index for this candidate.
266*9880d681SAndroid Build Coastguard Worker unsigned IntvIdx;
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker // Interference for PhysReg.
269*9880d681SAndroid Build Coastguard Worker InterferenceCache::Cursor Intf;
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker // Bundles where this candidate should be live.
272*9880d681SAndroid Build Coastguard Worker BitVector LiveBundles;
273*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> ActiveBlocks;
274*9880d681SAndroid Build Coastguard Worker
reset__anon65c1e5750111::RAGreedy::GlobalSplitCandidate275*9880d681SAndroid Build Coastguard Worker void reset(InterferenceCache &Cache, unsigned Reg) {
276*9880d681SAndroid Build Coastguard Worker PhysReg = Reg;
277*9880d681SAndroid Build Coastguard Worker IntvIdx = 0;
278*9880d681SAndroid Build Coastguard Worker Intf.setPhysReg(Cache, Reg);
279*9880d681SAndroid Build Coastguard Worker LiveBundles.clear();
280*9880d681SAndroid Build Coastguard Worker ActiveBlocks.clear();
281*9880d681SAndroid Build Coastguard Worker }
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker // Set B[i] = C for every live bundle where B[i] was NoCand.
getBundles__anon65c1e5750111::RAGreedy::GlobalSplitCandidate284*9880d681SAndroid Build Coastguard Worker unsigned getBundles(SmallVectorImpl<unsigned> &B, unsigned C) {
285*9880d681SAndroid Build Coastguard Worker unsigned Count = 0;
286*9880d681SAndroid Build Coastguard Worker for (int i = LiveBundles.find_first(); i >= 0;
287*9880d681SAndroid Build Coastguard Worker i = LiveBundles.find_next(i))
288*9880d681SAndroid Build Coastguard Worker if (B[i] == NoCand) {
289*9880d681SAndroid Build Coastguard Worker B[i] = C;
290*9880d681SAndroid Build Coastguard Worker Count++;
291*9880d681SAndroid Build Coastguard Worker }
292*9880d681SAndroid Build Coastguard Worker return Count;
293*9880d681SAndroid Build Coastguard Worker }
294*9880d681SAndroid Build Coastguard Worker };
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker /// Candidate info for each PhysReg in AllocationOrder.
297*9880d681SAndroid Build Coastguard Worker /// This vector never shrinks, but grows to the size of the largest register
298*9880d681SAndroid Build Coastguard Worker /// class.
299*9880d681SAndroid Build Coastguard Worker SmallVector<GlobalSplitCandidate, 32> GlobalCand;
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker enum : unsigned { NoCand = ~0u };
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker /// Candidate map. Each edge bundle is assigned to a GlobalCand entry, or to
304*9880d681SAndroid Build Coastguard Worker /// NoCand which indicates the stack interval.
305*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 32> BundleCand;
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Worker /// Callee-save register cost, calculated once per machine function.
308*9880d681SAndroid Build Coastguard Worker BlockFrequency CSRCost;
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker /// Run or not the local reassignment heuristic. This information is
311*9880d681SAndroid Build Coastguard Worker /// obtained from the TargetSubtargetInfo.
312*9880d681SAndroid Build Coastguard Worker bool EnableLocalReassign;
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker /// Set of broken hints that may be reconciled later because of eviction.
315*9880d681SAndroid Build Coastguard Worker SmallSetVector<LiveInterval *, 8> SetOfBrokenHints;
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Worker public:
318*9880d681SAndroid Build Coastguard Worker RAGreedy();
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker /// Return the pass name.
getPassName() const321*9880d681SAndroid Build Coastguard Worker const char* getPassName() const override {
322*9880d681SAndroid Build Coastguard Worker return "Greedy Register Allocator";
323*9880d681SAndroid Build Coastguard Worker }
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker /// RAGreedy analysis usage.
326*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override;
327*9880d681SAndroid Build Coastguard Worker void releaseMemory() override;
spiller()328*9880d681SAndroid Build Coastguard Worker Spiller &spiller() override { return *SpillerInstance; }
329*9880d681SAndroid Build Coastguard Worker void enqueue(LiveInterval *LI) override;
330*9880d681SAndroid Build Coastguard Worker LiveInterval *dequeue() override;
331*9880d681SAndroid Build Coastguard Worker unsigned selectOrSplit(LiveInterval&, SmallVectorImpl<unsigned>&) override;
332*9880d681SAndroid Build Coastguard Worker void aboutToRemoveInterval(LiveInterval &) override;
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker /// Perform register allocation.
335*9880d681SAndroid Build Coastguard Worker bool runOnMachineFunction(MachineFunction &mf) override;
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker static char ID;
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker private:
340*9880d681SAndroid Build Coastguard Worker unsigned selectOrSplitImpl(LiveInterval &, SmallVectorImpl<unsigned> &,
341*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &, unsigned = 0);
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker bool LRE_CanEraseVirtReg(unsigned) override;
344*9880d681SAndroid Build Coastguard Worker void LRE_WillShrinkVirtReg(unsigned) override;
345*9880d681SAndroid Build Coastguard Worker void LRE_DidCloneVirtReg(unsigned, unsigned) override;
346*9880d681SAndroid Build Coastguard Worker void enqueue(PQueue &CurQueue, LiveInterval *LI);
347*9880d681SAndroid Build Coastguard Worker LiveInterval *dequeue(PQueue &CurQueue);
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker BlockFrequency calcSpillCost();
350*9880d681SAndroid Build Coastguard Worker bool addSplitConstraints(InterferenceCache::Cursor, BlockFrequency&);
351*9880d681SAndroid Build Coastguard Worker void addThroughConstraints(InterferenceCache::Cursor, ArrayRef<unsigned>);
352*9880d681SAndroid Build Coastguard Worker void growRegion(GlobalSplitCandidate &Cand);
353*9880d681SAndroid Build Coastguard Worker BlockFrequency calcGlobalSplitCost(GlobalSplitCandidate&);
354*9880d681SAndroid Build Coastguard Worker bool calcCompactRegion(GlobalSplitCandidate&);
355*9880d681SAndroid Build Coastguard Worker void splitAroundRegion(LiveRangeEdit&, ArrayRef<unsigned>);
356*9880d681SAndroid Build Coastguard Worker void calcGapWeights(unsigned, SmallVectorImpl<float>&);
357*9880d681SAndroid Build Coastguard Worker unsigned canReassign(LiveInterval &VirtReg, unsigned PhysReg);
358*9880d681SAndroid Build Coastguard Worker bool shouldEvict(LiveInterval &A, bool, LiveInterval &B, bool);
359*9880d681SAndroid Build Coastguard Worker bool canEvictInterference(LiveInterval&, unsigned, bool, EvictionCost&);
360*9880d681SAndroid Build Coastguard Worker void evictInterference(LiveInterval&, unsigned,
361*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
362*9880d681SAndroid Build Coastguard Worker bool mayRecolorAllInterferences(unsigned PhysReg, LiveInterval &VirtReg,
363*9880d681SAndroid Build Coastguard Worker SmallLISet &RecoloringCandidates,
364*9880d681SAndroid Build Coastguard Worker const SmallVirtRegSet &FixedRegisters);
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker unsigned tryAssign(LiveInterval&, AllocationOrder&,
367*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
368*9880d681SAndroid Build Coastguard Worker unsigned tryEvict(LiveInterval&, AllocationOrder&,
369*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&, unsigned = ~0u);
370*9880d681SAndroid Build Coastguard Worker unsigned tryRegionSplit(LiveInterval&, AllocationOrder&,
371*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
372*9880d681SAndroid Build Coastguard Worker /// Calculate cost of region splitting.
373*9880d681SAndroid Build Coastguard Worker unsigned calculateRegionSplitCost(LiveInterval &VirtReg,
374*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
375*9880d681SAndroid Build Coastguard Worker BlockFrequency &BestCost,
376*9880d681SAndroid Build Coastguard Worker unsigned &NumCands, bool IgnoreCSR);
377*9880d681SAndroid Build Coastguard Worker /// Perform region splitting.
378*9880d681SAndroid Build Coastguard Worker unsigned doRegionSplit(LiveInterval &VirtReg, unsigned BestCand,
379*9880d681SAndroid Build Coastguard Worker bool HasCompact,
380*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs);
381*9880d681SAndroid Build Coastguard Worker /// Check other options before using a callee-saved register for the first
382*9880d681SAndroid Build Coastguard Worker /// time.
383*9880d681SAndroid Build Coastguard Worker unsigned tryAssignCSRFirstTime(LiveInterval &VirtReg, AllocationOrder &Order,
384*9880d681SAndroid Build Coastguard Worker unsigned PhysReg, unsigned &CostPerUseLimit,
385*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs);
386*9880d681SAndroid Build Coastguard Worker void initializeCSRCost();
387*9880d681SAndroid Build Coastguard Worker unsigned tryBlockSplit(LiveInterval&, AllocationOrder&,
388*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
389*9880d681SAndroid Build Coastguard Worker unsigned tryInstructionSplit(LiveInterval&, AllocationOrder&,
390*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
391*9880d681SAndroid Build Coastguard Worker unsigned tryLocalSplit(LiveInterval&, AllocationOrder&,
392*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
393*9880d681SAndroid Build Coastguard Worker unsigned trySplit(LiveInterval&, AllocationOrder&,
394*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&);
395*9880d681SAndroid Build Coastguard Worker unsigned tryLastChanceRecoloring(LiveInterval &, AllocationOrder &,
396*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &,
397*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &, unsigned);
398*9880d681SAndroid Build Coastguard Worker bool tryRecoloringCandidates(PQueue &, SmallVectorImpl<unsigned> &,
399*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &, unsigned);
400*9880d681SAndroid Build Coastguard Worker void tryHintRecoloring(LiveInterval &);
401*9880d681SAndroid Build Coastguard Worker void tryHintsRecoloring();
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker /// Model the information carried by one end of a copy.
404*9880d681SAndroid Build Coastguard Worker struct HintInfo {
405*9880d681SAndroid Build Coastguard Worker /// The frequency of the copy.
406*9880d681SAndroid Build Coastguard Worker BlockFrequency Freq;
407*9880d681SAndroid Build Coastguard Worker /// The virtual register or physical register.
408*9880d681SAndroid Build Coastguard Worker unsigned Reg;
409*9880d681SAndroid Build Coastguard Worker /// Its currently assigned register.
410*9880d681SAndroid Build Coastguard Worker /// In case of a physical register Reg == PhysReg.
411*9880d681SAndroid Build Coastguard Worker unsigned PhysReg;
HintInfo__anon65c1e5750111::RAGreedy::HintInfo412*9880d681SAndroid Build Coastguard Worker HintInfo(BlockFrequency Freq, unsigned Reg, unsigned PhysReg)
413*9880d681SAndroid Build Coastguard Worker : Freq(Freq), Reg(Reg), PhysReg(PhysReg) {}
414*9880d681SAndroid Build Coastguard Worker };
415*9880d681SAndroid Build Coastguard Worker typedef SmallVector<HintInfo, 4> HintsInfo;
416*9880d681SAndroid Build Coastguard Worker BlockFrequency getBrokenHintFreq(const HintsInfo &, unsigned);
417*9880d681SAndroid Build Coastguard Worker void collectHintInfo(unsigned, HintsInfo &);
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker bool isUnusedCalleeSavedReg(unsigned PhysReg) const;
420*9880d681SAndroid Build Coastguard Worker };
421*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker char RAGreedy::ID = 0;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
426*9880d681SAndroid Build Coastguard Worker const char *const RAGreedy::StageName[] = {
427*9880d681SAndroid Build Coastguard Worker "RS_New",
428*9880d681SAndroid Build Coastguard Worker "RS_Assign",
429*9880d681SAndroid Build Coastguard Worker "RS_Split",
430*9880d681SAndroid Build Coastguard Worker "RS_Split2",
431*9880d681SAndroid Build Coastguard Worker "RS_Spill",
432*9880d681SAndroid Build Coastguard Worker "RS_Memory",
433*9880d681SAndroid Build Coastguard Worker "RS_Done"
434*9880d681SAndroid Build Coastguard Worker };
435*9880d681SAndroid Build Coastguard Worker #endif
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker // Hysteresis to use when comparing floats.
438*9880d681SAndroid Build Coastguard Worker // This helps stabilize decisions based on float comparisons.
439*9880d681SAndroid Build Coastguard Worker const float Hysteresis = (2007 / 2048.0f); // 0.97998046875
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker
createGreedyRegisterAllocator()442*9880d681SAndroid Build Coastguard Worker FunctionPass* llvm::createGreedyRegisterAllocator() {
443*9880d681SAndroid Build Coastguard Worker return new RAGreedy();
444*9880d681SAndroid Build Coastguard Worker }
445*9880d681SAndroid Build Coastguard Worker
RAGreedy()446*9880d681SAndroid Build Coastguard Worker RAGreedy::RAGreedy(): MachineFunctionPass(ID) {
447*9880d681SAndroid Build Coastguard Worker initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
448*9880d681SAndroid Build Coastguard Worker initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
449*9880d681SAndroid Build Coastguard Worker initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
450*9880d681SAndroid Build Coastguard Worker initializeSlotIndexesPass(*PassRegistry::getPassRegistry());
451*9880d681SAndroid Build Coastguard Worker initializeRegisterCoalescerPass(*PassRegistry::getPassRegistry());
452*9880d681SAndroid Build Coastguard Worker initializeMachineSchedulerPass(*PassRegistry::getPassRegistry());
453*9880d681SAndroid Build Coastguard Worker initializeLiveStacksPass(*PassRegistry::getPassRegistry());
454*9880d681SAndroid Build Coastguard Worker initializeMachineDominatorTreePass(*PassRegistry::getPassRegistry());
455*9880d681SAndroid Build Coastguard Worker initializeMachineLoopInfoPass(*PassRegistry::getPassRegistry());
456*9880d681SAndroid Build Coastguard Worker initializeVirtRegMapPass(*PassRegistry::getPassRegistry());
457*9880d681SAndroid Build Coastguard Worker initializeLiveRegMatrixPass(*PassRegistry::getPassRegistry());
458*9880d681SAndroid Build Coastguard Worker initializeEdgeBundlesPass(*PassRegistry::getPassRegistry());
459*9880d681SAndroid Build Coastguard Worker initializeSpillPlacementPass(*PassRegistry::getPassRegistry());
460*9880d681SAndroid Build Coastguard Worker }
461*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const462*9880d681SAndroid Build Coastguard Worker void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const {
463*9880d681SAndroid Build Coastguard Worker AU.setPreservesCFG();
464*9880d681SAndroid Build Coastguard Worker AU.addRequired<MachineBlockFrequencyInfo>();
465*9880d681SAndroid Build Coastguard Worker AU.addPreserved<MachineBlockFrequencyInfo>();
466*9880d681SAndroid Build Coastguard Worker AU.addRequired<AAResultsWrapperPass>();
467*9880d681SAndroid Build Coastguard Worker AU.addPreserved<AAResultsWrapperPass>();
468*9880d681SAndroid Build Coastguard Worker AU.addRequired<LiveIntervals>();
469*9880d681SAndroid Build Coastguard Worker AU.addPreserved<LiveIntervals>();
470*9880d681SAndroid Build Coastguard Worker AU.addRequired<SlotIndexes>();
471*9880d681SAndroid Build Coastguard Worker AU.addPreserved<SlotIndexes>();
472*9880d681SAndroid Build Coastguard Worker AU.addRequired<LiveDebugVariables>();
473*9880d681SAndroid Build Coastguard Worker AU.addPreserved<LiveDebugVariables>();
474*9880d681SAndroid Build Coastguard Worker AU.addRequired<LiveStacks>();
475*9880d681SAndroid Build Coastguard Worker AU.addPreserved<LiveStacks>();
476*9880d681SAndroid Build Coastguard Worker AU.addRequired<MachineDominatorTree>();
477*9880d681SAndroid Build Coastguard Worker AU.addPreserved<MachineDominatorTree>();
478*9880d681SAndroid Build Coastguard Worker AU.addRequired<MachineLoopInfo>();
479*9880d681SAndroid Build Coastguard Worker AU.addPreserved<MachineLoopInfo>();
480*9880d681SAndroid Build Coastguard Worker AU.addRequired<VirtRegMap>();
481*9880d681SAndroid Build Coastguard Worker AU.addPreserved<VirtRegMap>();
482*9880d681SAndroid Build Coastguard Worker AU.addRequired<LiveRegMatrix>();
483*9880d681SAndroid Build Coastguard Worker AU.addPreserved<LiveRegMatrix>();
484*9880d681SAndroid Build Coastguard Worker AU.addRequired<EdgeBundles>();
485*9880d681SAndroid Build Coastguard Worker AU.addRequired<SpillPlacement>();
486*9880d681SAndroid Build Coastguard Worker MachineFunctionPass::getAnalysisUsage(AU);
487*9880d681SAndroid Build Coastguard Worker }
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
491*9880d681SAndroid Build Coastguard Worker // LiveRangeEdit delegate methods
492*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
493*9880d681SAndroid Build Coastguard Worker
LRE_CanEraseVirtReg(unsigned VirtReg)494*9880d681SAndroid Build Coastguard Worker bool RAGreedy::LRE_CanEraseVirtReg(unsigned VirtReg) {
495*9880d681SAndroid Build Coastguard Worker if (VRM->hasPhys(VirtReg)) {
496*9880d681SAndroid Build Coastguard Worker LiveInterval &LI = LIS->getInterval(VirtReg);
497*9880d681SAndroid Build Coastguard Worker Matrix->unassign(LI);
498*9880d681SAndroid Build Coastguard Worker aboutToRemoveInterval(LI);
499*9880d681SAndroid Build Coastguard Worker return true;
500*9880d681SAndroid Build Coastguard Worker }
501*9880d681SAndroid Build Coastguard Worker // Unassigned virtreg is probably in the priority queue.
502*9880d681SAndroid Build Coastguard Worker // RegAllocBase will erase it after dequeueing.
503*9880d681SAndroid Build Coastguard Worker return false;
504*9880d681SAndroid Build Coastguard Worker }
505*9880d681SAndroid Build Coastguard Worker
LRE_WillShrinkVirtReg(unsigned VirtReg)506*9880d681SAndroid Build Coastguard Worker void RAGreedy::LRE_WillShrinkVirtReg(unsigned VirtReg) {
507*9880d681SAndroid Build Coastguard Worker if (!VRM->hasPhys(VirtReg))
508*9880d681SAndroid Build Coastguard Worker return;
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Worker // Register is assigned, put it back on the queue for reassignment.
511*9880d681SAndroid Build Coastguard Worker LiveInterval &LI = LIS->getInterval(VirtReg);
512*9880d681SAndroid Build Coastguard Worker Matrix->unassign(LI);
513*9880d681SAndroid Build Coastguard Worker enqueue(&LI);
514*9880d681SAndroid Build Coastguard Worker }
515*9880d681SAndroid Build Coastguard Worker
LRE_DidCloneVirtReg(unsigned New,unsigned Old)516*9880d681SAndroid Build Coastguard Worker void RAGreedy::LRE_DidCloneVirtReg(unsigned New, unsigned Old) {
517*9880d681SAndroid Build Coastguard Worker // Cloning a register we haven't even heard about yet? Just ignore it.
518*9880d681SAndroid Build Coastguard Worker if (!ExtraRegInfo.inBounds(Old))
519*9880d681SAndroid Build Coastguard Worker return;
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker // LRE may clone a virtual register because dead code elimination causes it to
522*9880d681SAndroid Build Coastguard Worker // be split into connected components. The new components are much smaller
523*9880d681SAndroid Build Coastguard Worker // than the original, so they should get a new chance at being assigned.
524*9880d681SAndroid Build Coastguard Worker // same stage as the parent.
525*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[Old].Stage = RS_Assign;
526*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.grow(New);
527*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[New] = ExtraRegInfo[Old];
528*9880d681SAndroid Build Coastguard Worker }
529*9880d681SAndroid Build Coastguard Worker
releaseMemory()530*9880d681SAndroid Build Coastguard Worker void RAGreedy::releaseMemory() {
531*9880d681SAndroid Build Coastguard Worker SpillerInstance.reset();
532*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.clear();
533*9880d681SAndroid Build Coastguard Worker GlobalCand.clear();
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker
enqueue(LiveInterval * LI)536*9880d681SAndroid Build Coastguard Worker void RAGreedy::enqueue(LiveInterval *LI) { enqueue(Queue, LI); }
537*9880d681SAndroid Build Coastguard Worker
enqueue(PQueue & CurQueue,LiveInterval * LI)538*9880d681SAndroid Build Coastguard Worker void RAGreedy::enqueue(PQueue &CurQueue, LiveInterval *LI) {
539*9880d681SAndroid Build Coastguard Worker // Prioritize live ranges by size, assigning larger ranges first.
540*9880d681SAndroid Build Coastguard Worker // The queue holds (size, reg) pairs.
541*9880d681SAndroid Build Coastguard Worker const unsigned Size = LI->getSize();
542*9880d681SAndroid Build Coastguard Worker const unsigned Reg = LI->reg;
543*9880d681SAndroid Build Coastguard Worker assert(TargetRegisterInfo::isVirtualRegister(Reg) &&
544*9880d681SAndroid Build Coastguard Worker "Can only enqueue virtual registers");
545*9880d681SAndroid Build Coastguard Worker unsigned Prio;
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.grow(Reg);
548*9880d681SAndroid Build Coastguard Worker if (ExtraRegInfo[Reg].Stage == RS_New)
549*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[Reg].Stage = RS_Assign;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker if (ExtraRegInfo[Reg].Stage == RS_Split) {
552*9880d681SAndroid Build Coastguard Worker // Unsplit ranges that couldn't be allocated immediately are deferred until
553*9880d681SAndroid Build Coastguard Worker // everything else has been allocated.
554*9880d681SAndroid Build Coastguard Worker Prio = Size;
555*9880d681SAndroid Build Coastguard Worker } else if (ExtraRegInfo[Reg].Stage == RS_Memory) {
556*9880d681SAndroid Build Coastguard Worker // Memory operand should be considered last.
557*9880d681SAndroid Build Coastguard Worker // Change the priority such that Memory operand are assigned in
558*9880d681SAndroid Build Coastguard Worker // the reverse order that they came in.
559*9880d681SAndroid Build Coastguard Worker // TODO: Make this a member variable and probably do something about hints.
560*9880d681SAndroid Build Coastguard Worker static unsigned MemOp = 0;
561*9880d681SAndroid Build Coastguard Worker Prio = MemOp++;
562*9880d681SAndroid Build Coastguard Worker } else {
563*9880d681SAndroid Build Coastguard Worker // Giant live ranges fall back to the global assignment heuristic, which
564*9880d681SAndroid Build Coastguard Worker // prevents excessive spilling in pathological cases.
565*9880d681SAndroid Build Coastguard Worker bool ReverseLocal = TRI->reverseLocalAssignment();
566*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass &RC = *MRI->getRegClass(Reg);
567*9880d681SAndroid Build Coastguard Worker bool ForceGlobal = !ReverseLocal &&
568*9880d681SAndroid Build Coastguard Worker (Size / SlotIndex::InstrDist) > (2 * RC.getNumRegs());
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker if (ExtraRegInfo[Reg].Stage == RS_Assign && !ForceGlobal && !LI->empty() &&
571*9880d681SAndroid Build Coastguard Worker LIS->intervalIsInOneMBB(*LI)) {
572*9880d681SAndroid Build Coastguard Worker // Allocate original local ranges in linear instruction order. Since they
573*9880d681SAndroid Build Coastguard Worker // are singly defined, this produces optimal coloring in the absence of
574*9880d681SAndroid Build Coastguard Worker // global interference and other constraints.
575*9880d681SAndroid Build Coastguard Worker if (!ReverseLocal)
576*9880d681SAndroid Build Coastguard Worker Prio = LI->beginIndex().getInstrDistance(Indexes->getLastIndex());
577*9880d681SAndroid Build Coastguard Worker else {
578*9880d681SAndroid Build Coastguard Worker // Allocating bottom up may allow many short LRGs to be assigned first
579*9880d681SAndroid Build Coastguard Worker // to one of the cheap registers. This could be much faster for very
580*9880d681SAndroid Build Coastguard Worker // large blocks on targets with many physical registers.
581*9880d681SAndroid Build Coastguard Worker Prio = Indexes->getZeroIndex().getInstrDistance(LI->endIndex());
582*9880d681SAndroid Build Coastguard Worker }
583*9880d681SAndroid Build Coastguard Worker Prio |= RC.AllocationPriority << 24;
584*9880d681SAndroid Build Coastguard Worker } else {
585*9880d681SAndroid Build Coastguard Worker // Allocate global and split ranges in long->short order. Long ranges that
586*9880d681SAndroid Build Coastguard Worker // don't fit should be spilled (or split) ASAP so they don't create
587*9880d681SAndroid Build Coastguard Worker // interference. Mark a bit to prioritize global above local ranges.
588*9880d681SAndroid Build Coastguard Worker Prio = (1u << 29) + Size;
589*9880d681SAndroid Build Coastguard Worker }
590*9880d681SAndroid Build Coastguard Worker // Mark a higher bit to prioritize global and local above RS_Split.
591*9880d681SAndroid Build Coastguard Worker Prio |= (1u << 31);
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Worker // Boost ranges that have a physical register hint.
594*9880d681SAndroid Build Coastguard Worker if (VRM->hasKnownPreference(Reg))
595*9880d681SAndroid Build Coastguard Worker Prio |= (1u << 30);
596*9880d681SAndroid Build Coastguard Worker }
597*9880d681SAndroid Build Coastguard Worker // The virtual register number is a tie breaker for same-sized ranges.
598*9880d681SAndroid Build Coastguard Worker // Give lower vreg numbers higher priority to assign them first.
599*9880d681SAndroid Build Coastguard Worker CurQueue.push(std::make_pair(Prio, ~Reg));
600*9880d681SAndroid Build Coastguard Worker }
601*9880d681SAndroid Build Coastguard Worker
dequeue()602*9880d681SAndroid Build Coastguard Worker LiveInterval *RAGreedy::dequeue() { return dequeue(Queue); }
603*9880d681SAndroid Build Coastguard Worker
dequeue(PQueue & CurQueue)604*9880d681SAndroid Build Coastguard Worker LiveInterval *RAGreedy::dequeue(PQueue &CurQueue) {
605*9880d681SAndroid Build Coastguard Worker if (CurQueue.empty())
606*9880d681SAndroid Build Coastguard Worker return nullptr;
607*9880d681SAndroid Build Coastguard Worker LiveInterval *LI = &LIS->getInterval(~CurQueue.top().second);
608*9880d681SAndroid Build Coastguard Worker CurQueue.pop();
609*9880d681SAndroid Build Coastguard Worker return LI;
610*9880d681SAndroid Build Coastguard Worker }
611*9880d681SAndroid Build Coastguard Worker
612*9880d681SAndroid Build Coastguard Worker
613*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
614*9880d681SAndroid Build Coastguard Worker // Direct Assignment
615*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Worker /// tryAssign - Try to assign VirtReg to an available register.
tryAssign(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)618*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryAssign(LiveInterval &VirtReg,
619*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
620*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
621*9880d681SAndroid Build Coastguard Worker Order.rewind();
622*9880d681SAndroid Build Coastguard Worker unsigned PhysReg;
623*9880d681SAndroid Build Coastguard Worker while ((PhysReg = Order.next()))
624*9880d681SAndroid Build Coastguard Worker if (!Matrix->checkInterference(VirtReg, PhysReg))
625*9880d681SAndroid Build Coastguard Worker break;
626*9880d681SAndroid Build Coastguard Worker if (!PhysReg || Order.isHint())
627*9880d681SAndroid Build Coastguard Worker return PhysReg;
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Worker // PhysReg is available, but there may be a better choice.
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker // If we missed a simple hint, try to cheaply evict interference from the
632*9880d681SAndroid Build Coastguard Worker // preferred register.
633*9880d681SAndroid Build Coastguard Worker if (unsigned Hint = MRI->getSimpleHint(VirtReg.reg))
634*9880d681SAndroid Build Coastguard Worker if (Order.isHint(Hint)) {
635*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "missed hint " << PrintReg(Hint, TRI) << '\n');
636*9880d681SAndroid Build Coastguard Worker EvictionCost MaxCost;
637*9880d681SAndroid Build Coastguard Worker MaxCost.setBrokenHints(1);
638*9880d681SAndroid Build Coastguard Worker if (canEvictInterference(VirtReg, Hint, true, MaxCost)) {
639*9880d681SAndroid Build Coastguard Worker evictInterference(VirtReg, Hint, NewVRegs);
640*9880d681SAndroid Build Coastguard Worker return Hint;
641*9880d681SAndroid Build Coastguard Worker }
642*9880d681SAndroid Build Coastguard Worker }
643*9880d681SAndroid Build Coastguard Worker
644*9880d681SAndroid Build Coastguard Worker // Try to evict interference from a cheaper alternative.
645*9880d681SAndroid Build Coastguard Worker unsigned Cost = TRI->getCostPerUse(PhysReg);
646*9880d681SAndroid Build Coastguard Worker
647*9880d681SAndroid Build Coastguard Worker // Most registers have 0 additional cost.
648*9880d681SAndroid Build Coastguard Worker if (!Cost)
649*9880d681SAndroid Build Coastguard Worker return PhysReg;
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is available at cost " << Cost
652*9880d681SAndroid Build Coastguard Worker << '\n');
653*9880d681SAndroid Build Coastguard Worker unsigned CheapReg = tryEvict(VirtReg, Order, NewVRegs, Cost);
654*9880d681SAndroid Build Coastguard Worker return CheapReg ? CheapReg : PhysReg;
655*9880d681SAndroid Build Coastguard Worker }
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Worker
658*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
659*9880d681SAndroid Build Coastguard Worker // Interference eviction
660*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
661*9880d681SAndroid Build Coastguard Worker
canReassign(LiveInterval & VirtReg,unsigned PrevReg)662*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::canReassign(LiveInterval &VirtReg, unsigned PrevReg) {
663*9880d681SAndroid Build Coastguard Worker AllocationOrder Order(VirtReg.reg, *VRM, RegClassInfo, Matrix);
664*9880d681SAndroid Build Coastguard Worker unsigned PhysReg;
665*9880d681SAndroid Build Coastguard Worker while ((PhysReg = Order.next())) {
666*9880d681SAndroid Build Coastguard Worker if (PhysReg == PrevReg)
667*9880d681SAndroid Build Coastguard Worker continue;
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Worker MCRegUnitIterator Units(PhysReg, TRI);
670*9880d681SAndroid Build Coastguard Worker for (; Units.isValid(); ++Units) {
671*9880d681SAndroid Build Coastguard Worker // Instantiate a "subquery", not to be confused with the Queries array.
672*9880d681SAndroid Build Coastguard Worker LiveIntervalUnion::Query subQ(&VirtReg, &Matrix->getLiveUnions()[*Units]);
673*9880d681SAndroid Build Coastguard Worker if (subQ.checkInterference())
674*9880d681SAndroid Build Coastguard Worker break;
675*9880d681SAndroid Build Coastguard Worker }
676*9880d681SAndroid Build Coastguard Worker // If no units have interference, break out with the current PhysReg.
677*9880d681SAndroid Build Coastguard Worker if (!Units.isValid())
678*9880d681SAndroid Build Coastguard Worker break;
679*9880d681SAndroid Build Coastguard Worker }
680*9880d681SAndroid Build Coastguard Worker if (PhysReg)
681*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "can reassign: " << VirtReg << " from "
682*9880d681SAndroid Build Coastguard Worker << PrintReg(PrevReg, TRI) << " to " << PrintReg(PhysReg, TRI)
683*9880d681SAndroid Build Coastguard Worker << '\n');
684*9880d681SAndroid Build Coastguard Worker return PhysReg;
685*9880d681SAndroid Build Coastguard Worker }
686*9880d681SAndroid Build Coastguard Worker
687*9880d681SAndroid Build Coastguard Worker /// shouldEvict - determine if A should evict the assigned live range B. The
688*9880d681SAndroid Build Coastguard Worker /// eviction policy defined by this function together with the allocation order
689*9880d681SAndroid Build Coastguard Worker /// defined by enqueue() decides which registers ultimately end up being split
690*9880d681SAndroid Build Coastguard Worker /// and spilled.
691*9880d681SAndroid Build Coastguard Worker ///
692*9880d681SAndroid Build Coastguard Worker /// Cascade numbers are used to prevent infinite loops if this function is a
693*9880d681SAndroid Build Coastguard Worker /// cyclic relation.
694*9880d681SAndroid Build Coastguard Worker ///
695*9880d681SAndroid Build Coastguard Worker /// @param A The live range to be assigned.
696*9880d681SAndroid Build Coastguard Worker /// @param IsHint True when A is about to be assigned to its preferred
697*9880d681SAndroid Build Coastguard Worker /// register.
698*9880d681SAndroid Build Coastguard Worker /// @param B The live range to be evicted.
699*9880d681SAndroid Build Coastguard Worker /// @param BreaksHint True when B is already assigned to its preferred register.
shouldEvict(LiveInterval & A,bool IsHint,LiveInterval & B,bool BreaksHint)700*9880d681SAndroid Build Coastguard Worker bool RAGreedy::shouldEvict(LiveInterval &A, bool IsHint,
701*9880d681SAndroid Build Coastguard Worker LiveInterval &B, bool BreaksHint) {
702*9880d681SAndroid Build Coastguard Worker bool CanSplit = getStage(B) < RS_Spill;
703*9880d681SAndroid Build Coastguard Worker
704*9880d681SAndroid Build Coastguard Worker // Be fairly aggressive about following hints as long as the evictee can be
705*9880d681SAndroid Build Coastguard Worker // split.
706*9880d681SAndroid Build Coastguard Worker if (CanSplit && IsHint && !BreaksHint)
707*9880d681SAndroid Build Coastguard Worker return true;
708*9880d681SAndroid Build Coastguard Worker
709*9880d681SAndroid Build Coastguard Worker if (A.weight > B.weight) {
710*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "should evict: " << B << " w= " << B.weight << '\n');
711*9880d681SAndroid Build Coastguard Worker return true;
712*9880d681SAndroid Build Coastguard Worker }
713*9880d681SAndroid Build Coastguard Worker return false;
714*9880d681SAndroid Build Coastguard Worker }
715*9880d681SAndroid Build Coastguard Worker
716*9880d681SAndroid Build Coastguard Worker /// canEvictInterference - Return true if all interferences between VirtReg and
717*9880d681SAndroid Build Coastguard Worker /// PhysReg can be evicted.
718*9880d681SAndroid Build Coastguard Worker ///
719*9880d681SAndroid Build Coastguard Worker /// @param VirtReg Live range that is about to be assigned.
720*9880d681SAndroid Build Coastguard Worker /// @param PhysReg Desired register for assignment.
721*9880d681SAndroid Build Coastguard Worker /// @param IsHint True when PhysReg is VirtReg's preferred register.
722*9880d681SAndroid Build Coastguard Worker /// @param MaxCost Only look for cheaper candidates and update with new cost
723*9880d681SAndroid Build Coastguard Worker /// when returning true.
724*9880d681SAndroid Build Coastguard Worker /// @returns True when interference can be evicted cheaper than MaxCost.
canEvictInterference(LiveInterval & VirtReg,unsigned PhysReg,bool IsHint,EvictionCost & MaxCost)725*9880d681SAndroid Build Coastguard Worker bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
726*9880d681SAndroid Build Coastguard Worker bool IsHint, EvictionCost &MaxCost) {
727*9880d681SAndroid Build Coastguard Worker // It is only possible to evict virtual register interference.
728*9880d681SAndroid Build Coastguard Worker if (Matrix->checkInterference(VirtReg, PhysReg) > LiveRegMatrix::IK_VirtReg)
729*9880d681SAndroid Build Coastguard Worker return false;
730*9880d681SAndroid Build Coastguard Worker
731*9880d681SAndroid Build Coastguard Worker bool IsLocal = LIS->intervalIsInOneMBB(VirtReg);
732*9880d681SAndroid Build Coastguard Worker
733*9880d681SAndroid Build Coastguard Worker // Find VirtReg's cascade number. This will be unassigned if VirtReg was never
734*9880d681SAndroid Build Coastguard Worker // involved in an eviction before. If a cascade number was assigned, deny
735*9880d681SAndroid Build Coastguard Worker // evicting anything with the same or a newer cascade number. This prevents
736*9880d681SAndroid Build Coastguard Worker // infinite eviction loops.
737*9880d681SAndroid Build Coastguard Worker //
738*9880d681SAndroid Build Coastguard Worker // This works out so a register without a cascade number is allowed to evict
739*9880d681SAndroid Build Coastguard Worker // anything, and it can be evicted by anything.
740*9880d681SAndroid Build Coastguard Worker unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
741*9880d681SAndroid Build Coastguard Worker if (!Cascade)
742*9880d681SAndroid Build Coastguard Worker Cascade = NextCascade;
743*9880d681SAndroid Build Coastguard Worker
744*9880d681SAndroid Build Coastguard Worker EvictionCost Cost;
745*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
746*9880d681SAndroid Build Coastguard Worker LiveIntervalUnion::Query &Q = Matrix->query(VirtReg, *Units);
747*9880d681SAndroid Build Coastguard Worker // If there is 10 or more interferences, chances are one is heavier.
748*9880d681SAndroid Build Coastguard Worker if (Q.collectInterferingVRegs(10) >= 10)
749*9880d681SAndroid Build Coastguard Worker return false;
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Worker // Check if any interfering live range is heavier than MaxWeight.
752*9880d681SAndroid Build Coastguard Worker for (unsigned i = Q.interferingVRegs().size(); i; --i) {
753*9880d681SAndroid Build Coastguard Worker LiveInterval *Intf = Q.interferingVRegs()[i - 1];
754*9880d681SAndroid Build Coastguard Worker assert(TargetRegisterInfo::isVirtualRegister(Intf->reg) &&
755*9880d681SAndroid Build Coastguard Worker "Only expecting virtual register interference from query");
756*9880d681SAndroid Build Coastguard Worker // Never evict spill products. They cannot split or spill.
757*9880d681SAndroid Build Coastguard Worker if (getStage(*Intf) == RS_Done)
758*9880d681SAndroid Build Coastguard Worker return false;
759*9880d681SAndroid Build Coastguard Worker // Once a live range becomes small enough, it is urgent that we find a
760*9880d681SAndroid Build Coastguard Worker // register for it. This is indicated by an infinite spill weight. These
761*9880d681SAndroid Build Coastguard Worker // urgent live ranges get to evict almost anything.
762*9880d681SAndroid Build Coastguard Worker //
763*9880d681SAndroid Build Coastguard Worker // Also allow urgent evictions of unspillable ranges from a strictly
764*9880d681SAndroid Build Coastguard Worker // larger allocation order.
765*9880d681SAndroid Build Coastguard Worker bool Urgent = !VirtReg.isSpillable() &&
766*9880d681SAndroid Build Coastguard Worker (Intf->isSpillable() ||
767*9880d681SAndroid Build Coastguard Worker RegClassInfo.getNumAllocatableRegs(MRI->getRegClass(VirtReg.reg)) <
768*9880d681SAndroid Build Coastguard Worker RegClassInfo.getNumAllocatableRegs(MRI->getRegClass(Intf->reg)));
769*9880d681SAndroid Build Coastguard Worker // Only evict older cascades or live ranges without a cascade.
770*9880d681SAndroid Build Coastguard Worker unsigned IntfCascade = ExtraRegInfo[Intf->reg].Cascade;
771*9880d681SAndroid Build Coastguard Worker if (Cascade <= IntfCascade) {
772*9880d681SAndroid Build Coastguard Worker if (!Urgent)
773*9880d681SAndroid Build Coastguard Worker return false;
774*9880d681SAndroid Build Coastguard Worker // We permit breaking cascades for urgent evictions. It should be the
775*9880d681SAndroid Build Coastguard Worker // last resort, though, so make it really expensive.
776*9880d681SAndroid Build Coastguard Worker Cost.BrokenHints += 10;
777*9880d681SAndroid Build Coastguard Worker }
778*9880d681SAndroid Build Coastguard Worker // Would this break a satisfied hint?
779*9880d681SAndroid Build Coastguard Worker bool BreaksHint = VRM->hasPreferredPhys(Intf->reg);
780*9880d681SAndroid Build Coastguard Worker // Update eviction cost.
781*9880d681SAndroid Build Coastguard Worker Cost.BrokenHints += BreaksHint;
782*9880d681SAndroid Build Coastguard Worker Cost.MaxWeight = std::max(Cost.MaxWeight, Intf->weight);
783*9880d681SAndroid Build Coastguard Worker // Abort if this would be too expensive.
784*9880d681SAndroid Build Coastguard Worker if (!(Cost < MaxCost))
785*9880d681SAndroid Build Coastguard Worker return false;
786*9880d681SAndroid Build Coastguard Worker if (Urgent)
787*9880d681SAndroid Build Coastguard Worker continue;
788*9880d681SAndroid Build Coastguard Worker // Apply the eviction policy for non-urgent evictions.
789*9880d681SAndroid Build Coastguard Worker if (!shouldEvict(VirtReg, IsHint, *Intf, BreaksHint))
790*9880d681SAndroid Build Coastguard Worker return false;
791*9880d681SAndroid Build Coastguard Worker // If !MaxCost.isMax(), then we're just looking for a cheap register.
792*9880d681SAndroid Build Coastguard Worker // Evicting another local live range in this case could lead to suboptimal
793*9880d681SAndroid Build Coastguard Worker // coloring.
794*9880d681SAndroid Build Coastguard Worker if (!MaxCost.isMax() && IsLocal && LIS->intervalIsInOneMBB(*Intf) &&
795*9880d681SAndroid Build Coastguard Worker (!EnableLocalReassign || !canReassign(*Intf, PhysReg))) {
796*9880d681SAndroid Build Coastguard Worker return false;
797*9880d681SAndroid Build Coastguard Worker }
798*9880d681SAndroid Build Coastguard Worker }
799*9880d681SAndroid Build Coastguard Worker }
800*9880d681SAndroid Build Coastguard Worker MaxCost = Cost;
801*9880d681SAndroid Build Coastguard Worker return true;
802*9880d681SAndroid Build Coastguard Worker }
803*9880d681SAndroid Build Coastguard Worker
804*9880d681SAndroid Build Coastguard Worker /// evictInterference - Evict any interferring registers that prevent VirtReg
805*9880d681SAndroid Build Coastguard Worker /// from being assigned to Physreg. This assumes that canEvictInterference
806*9880d681SAndroid Build Coastguard Worker /// returned true.
evictInterference(LiveInterval & VirtReg,unsigned PhysReg,SmallVectorImpl<unsigned> & NewVRegs)807*9880d681SAndroid Build Coastguard Worker void RAGreedy::evictInterference(LiveInterval &VirtReg, unsigned PhysReg,
808*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
809*9880d681SAndroid Build Coastguard Worker // Make sure that VirtReg has a cascade number, and assign that cascade
810*9880d681SAndroid Build Coastguard Worker // number to every evicted register. These live ranges than then only be
811*9880d681SAndroid Build Coastguard Worker // evicted by a newer cascade, preventing infinite loops.
812*9880d681SAndroid Build Coastguard Worker unsigned Cascade = ExtraRegInfo[VirtReg.reg].Cascade;
813*9880d681SAndroid Build Coastguard Worker if (!Cascade)
814*9880d681SAndroid Build Coastguard Worker Cascade = ExtraRegInfo[VirtReg.reg].Cascade = NextCascade++;
815*9880d681SAndroid Build Coastguard Worker
816*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "evicting " << PrintReg(PhysReg, TRI)
817*9880d681SAndroid Build Coastguard Worker << " interference: Cascade " << Cascade << '\n');
818*9880d681SAndroid Build Coastguard Worker
819*9880d681SAndroid Build Coastguard Worker // Collect all interfering virtregs first.
820*9880d681SAndroid Build Coastguard Worker SmallVector<LiveInterval*, 8> Intfs;
821*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
822*9880d681SAndroid Build Coastguard Worker LiveIntervalUnion::Query &Q = Matrix->query(VirtReg, *Units);
823*9880d681SAndroid Build Coastguard Worker assert(Q.seenAllInterferences() && "Didn't check all interfererences.");
824*9880d681SAndroid Build Coastguard Worker ArrayRef<LiveInterval*> IVR = Q.interferingVRegs();
825*9880d681SAndroid Build Coastguard Worker Intfs.append(IVR.begin(), IVR.end());
826*9880d681SAndroid Build Coastguard Worker }
827*9880d681SAndroid Build Coastguard Worker
828*9880d681SAndroid Build Coastguard Worker // Evict them second. This will invalidate the queries.
829*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Intfs.size(); i != e; ++i) {
830*9880d681SAndroid Build Coastguard Worker LiveInterval *Intf = Intfs[i];
831*9880d681SAndroid Build Coastguard Worker // The same VirtReg may be present in multiple RegUnits. Skip duplicates.
832*9880d681SAndroid Build Coastguard Worker if (!VRM->hasPhys(Intf->reg))
833*9880d681SAndroid Build Coastguard Worker continue;
834*9880d681SAndroid Build Coastguard Worker Matrix->unassign(*Intf);
835*9880d681SAndroid Build Coastguard Worker assert((ExtraRegInfo[Intf->reg].Cascade < Cascade ||
836*9880d681SAndroid Build Coastguard Worker VirtReg.isSpillable() < Intf->isSpillable()) &&
837*9880d681SAndroid Build Coastguard Worker "Cannot decrease cascade number, illegal eviction");
838*9880d681SAndroid Build Coastguard Worker ExtraRegInfo[Intf->reg].Cascade = Cascade;
839*9880d681SAndroid Build Coastguard Worker ++NumEvicted;
840*9880d681SAndroid Build Coastguard Worker NewVRegs.push_back(Intf->reg);
841*9880d681SAndroid Build Coastguard Worker }
842*9880d681SAndroid Build Coastguard Worker }
843*9880d681SAndroid Build Coastguard Worker
844*9880d681SAndroid Build Coastguard Worker /// Returns true if the given \p PhysReg is a callee saved register and has not
845*9880d681SAndroid Build Coastguard Worker /// been used for allocation yet.
isUnusedCalleeSavedReg(unsigned PhysReg) const846*9880d681SAndroid Build Coastguard Worker bool RAGreedy::isUnusedCalleeSavedReg(unsigned PhysReg) const {
847*9880d681SAndroid Build Coastguard Worker unsigned CSR = RegClassInfo.getLastCalleeSavedAlias(PhysReg);
848*9880d681SAndroid Build Coastguard Worker if (CSR == 0)
849*9880d681SAndroid Build Coastguard Worker return false;
850*9880d681SAndroid Build Coastguard Worker
851*9880d681SAndroid Build Coastguard Worker return !Matrix->isPhysRegUsed(PhysReg);
852*9880d681SAndroid Build Coastguard Worker }
853*9880d681SAndroid Build Coastguard Worker
854*9880d681SAndroid Build Coastguard Worker /// tryEvict - Try to evict all interferences for a physreg.
855*9880d681SAndroid Build Coastguard Worker /// @param VirtReg Currently unassigned virtual register.
856*9880d681SAndroid Build Coastguard Worker /// @param Order Physregs to try.
857*9880d681SAndroid Build Coastguard Worker /// @return Physreg to assign VirtReg, or 0.
tryEvict(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs,unsigned CostPerUseLimit)858*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryEvict(LiveInterval &VirtReg,
859*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
860*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs,
861*9880d681SAndroid Build Coastguard Worker unsigned CostPerUseLimit) {
862*9880d681SAndroid Build Coastguard Worker NamedRegionTimer T("Evict", TimerGroupName, TimePassesIsEnabled);
863*9880d681SAndroid Build Coastguard Worker
864*9880d681SAndroid Build Coastguard Worker // Keep track of the cheapest interference seen so far.
865*9880d681SAndroid Build Coastguard Worker EvictionCost BestCost;
866*9880d681SAndroid Build Coastguard Worker BestCost.setMax();
867*9880d681SAndroid Build Coastguard Worker unsigned BestPhys = 0;
868*9880d681SAndroid Build Coastguard Worker unsigned OrderLimit = Order.getOrder().size();
869*9880d681SAndroid Build Coastguard Worker
870*9880d681SAndroid Build Coastguard Worker // When we are just looking for a reduced cost per use, don't break any
871*9880d681SAndroid Build Coastguard Worker // hints, and only evict smaller spill weights.
872*9880d681SAndroid Build Coastguard Worker if (CostPerUseLimit < ~0u) {
873*9880d681SAndroid Build Coastguard Worker BestCost.BrokenHints = 0;
874*9880d681SAndroid Build Coastguard Worker BestCost.MaxWeight = VirtReg.weight;
875*9880d681SAndroid Build Coastguard Worker
876*9880d681SAndroid Build Coastguard Worker // Check of any registers in RC are below CostPerUseLimit.
877*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC = MRI->getRegClass(VirtReg.reg);
878*9880d681SAndroid Build Coastguard Worker unsigned MinCost = RegClassInfo.getMinCost(RC);
879*9880d681SAndroid Build Coastguard Worker if (MinCost >= CostPerUseLimit) {
880*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << TRI->getRegClassName(RC) << " minimum cost = " << MinCost
881*9880d681SAndroid Build Coastguard Worker << ", no cheaper registers to be found.\n");
882*9880d681SAndroid Build Coastguard Worker return 0;
883*9880d681SAndroid Build Coastguard Worker }
884*9880d681SAndroid Build Coastguard Worker
885*9880d681SAndroid Build Coastguard Worker // It is normal for register classes to have a long tail of registers with
886*9880d681SAndroid Build Coastguard Worker // the same cost. We don't need to look at them if they're too expensive.
887*9880d681SAndroid Build Coastguard Worker if (TRI->getCostPerUse(Order.getOrder().back()) >= CostPerUseLimit) {
888*9880d681SAndroid Build Coastguard Worker OrderLimit = RegClassInfo.getLastCostChange(RC);
889*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Only trying the first " << OrderLimit << " regs.\n");
890*9880d681SAndroid Build Coastguard Worker }
891*9880d681SAndroid Build Coastguard Worker }
892*9880d681SAndroid Build Coastguard Worker
893*9880d681SAndroid Build Coastguard Worker Order.rewind();
894*9880d681SAndroid Build Coastguard Worker while (unsigned PhysReg = Order.next(OrderLimit)) {
895*9880d681SAndroid Build Coastguard Worker if (TRI->getCostPerUse(PhysReg) >= CostPerUseLimit)
896*9880d681SAndroid Build Coastguard Worker continue;
897*9880d681SAndroid Build Coastguard Worker // The first use of a callee-saved register in a function has cost 1.
898*9880d681SAndroid Build Coastguard Worker // Don't start using a CSR when the CostPerUseLimit is low.
899*9880d681SAndroid Build Coastguard Worker if (CostPerUseLimit == 1 && isUnusedCalleeSavedReg(PhysReg)) {
900*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " would clobber CSR "
901*9880d681SAndroid Build Coastguard Worker << PrintReg(RegClassInfo.getLastCalleeSavedAlias(PhysReg), TRI)
902*9880d681SAndroid Build Coastguard Worker << '\n');
903*9880d681SAndroid Build Coastguard Worker continue;
904*9880d681SAndroid Build Coastguard Worker }
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Worker if (!canEvictInterference(VirtReg, PhysReg, false, BestCost))
907*9880d681SAndroid Build Coastguard Worker continue;
908*9880d681SAndroid Build Coastguard Worker
909*9880d681SAndroid Build Coastguard Worker // Best so far.
910*9880d681SAndroid Build Coastguard Worker BestPhys = PhysReg;
911*9880d681SAndroid Build Coastguard Worker
912*9880d681SAndroid Build Coastguard Worker // Stop if the hint can be used.
913*9880d681SAndroid Build Coastguard Worker if (Order.isHint())
914*9880d681SAndroid Build Coastguard Worker break;
915*9880d681SAndroid Build Coastguard Worker }
916*9880d681SAndroid Build Coastguard Worker
917*9880d681SAndroid Build Coastguard Worker if (!BestPhys)
918*9880d681SAndroid Build Coastguard Worker return 0;
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Worker evictInterference(VirtReg, BestPhys, NewVRegs);
921*9880d681SAndroid Build Coastguard Worker return BestPhys;
922*9880d681SAndroid Build Coastguard Worker }
923*9880d681SAndroid Build Coastguard Worker
924*9880d681SAndroid Build Coastguard Worker
925*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
926*9880d681SAndroid Build Coastguard Worker // Region Splitting
927*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
928*9880d681SAndroid Build Coastguard Worker
929*9880d681SAndroid Build Coastguard Worker /// addSplitConstraints - Fill out the SplitConstraints vector based on the
930*9880d681SAndroid Build Coastguard Worker /// interference pattern in Physreg and its aliases. Add the constraints to
931*9880d681SAndroid Build Coastguard Worker /// SpillPlacement and return the static cost of this split in Cost, assuming
932*9880d681SAndroid Build Coastguard Worker /// that all preferences in SplitConstraints are met.
933*9880d681SAndroid Build Coastguard Worker /// Return false if there are no bundles with positive bias.
addSplitConstraints(InterferenceCache::Cursor Intf,BlockFrequency & Cost)934*9880d681SAndroid Build Coastguard Worker bool RAGreedy::addSplitConstraints(InterferenceCache::Cursor Intf,
935*9880d681SAndroid Build Coastguard Worker BlockFrequency &Cost) {
936*9880d681SAndroid Build Coastguard Worker ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
937*9880d681SAndroid Build Coastguard Worker
938*9880d681SAndroid Build Coastguard Worker // Reset interference dependent info.
939*9880d681SAndroid Build Coastguard Worker SplitConstraints.resize(UseBlocks.size());
940*9880d681SAndroid Build Coastguard Worker BlockFrequency StaticCost = 0;
941*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != UseBlocks.size(); ++i) {
942*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
943*9880d681SAndroid Build Coastguard Worker SpillPlacement::BlockConstraint &BC = SplitConstraints[i];
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Worker BC.Number = BI.MBB->getNumber();
946*9880d681SAndroid Build Coastguard Worker Intf.moveToBlock(BC.Number);
947*9880d681SAndroid Build Coastguard Worker BC.Entry = BI.LiveIn ? SpillPlacement::PrefReg : SpillPlacement::DontCare;
948*9880d681SAndroid Build Coastguard Worker BC.Exit = BI.LiveOut ? SpillPlacement::PrefReg : SpillPlacement::DontCare;
949*9880d681SAndroid Build Coastguard Worker BC.ChangesValue = BI.FirstDef.isValid();
950*9880d681SAndroid Build Coastguard Worker
951*9880d681SAndroid Build Coastguard Worker if (!Intf.hasInterference())
952*9880d681SAndroid Build Coastguard Worker continue;
953*9880d681SAndroid Build Coastguard Worker
954*9880d681SAndroid Build Coastguard Worker // Number of spill code instructions to insert.
955*9880d681SAndroid Build Coastguard Worker unsigned Ins = 0;
956*9880d681SAndroid Build Coastguard Worker
957*9880d681SAndroid Build Coastguard Worker // Interference for the live-in value.
958*9880d681SAndroid Build Coastguard Worker if (BI.LiveIn) {
959*9880d681SAndroid Build Coastguard Worker if (Intf.first() <= Indexes->getMBBStartIdx(BC.Number)) {
960*9880d681SAndroid Build Coastguard Worker BC.Entry = SpillPlacement::MustSpill;
961*9880d681SAndroid Build Coastguard Worker ++Ins;
962*9880d681SAndroid Build Coastguard Worker } else if (Intf.first() < BI.FirstInstr) {
963*9880d681SAndroid Build Coastguard Worker BC.Entry = SpillPlacement::PrefSpill;
964*9880d681SAndroid Build Coastguard Worker ++Ins;
965*9880d681SAndroid Build Coastguard Worker } else if (Intf.first() < BI.LastInstr) {
966*9880d681SAndroid Build Coastguard Worker ++Ins;
967*9880d681SAndroid Build Coastguard Worker }
968*9880d681SAndroid Build Coastguard Worker }
969*9880d681SAndroid Build Coastguard Worker
970*9880d681SAndroid Build Coastguard Worker // Interference for the live-out value.
971*9880d681SAndroid Build Coastguard Worker if (BI.LiveOut) {
972*9880d681SAndroid Build Coastguard Worker if (Intf.last() >= SA->getLastSplitPoint(BC.Number)) {
973*9880d681SAndroid Build Coastguard Worker BC.Exit = SpillPlacement::MustSpill;
974*9880d681SAndroid Build Coastguard Worker ++Ins;
975*9880d681SAndroid Build Coastguard Worker } else if (Intf.last() > BI.LastInstr) {
976*9880d681SAndroid Build Coastguard Worker BC.Exit = SpillPlacement::PrefSpill;
977*9880d681SAndroid Build Coastguard Worker ++Ins;
978*9880d681SAndroid Build Coastguard Worker } else if (Intf.last() > BI.FirstInstr) {
979*9880d681SAndroid Build Coastguard Worker ++Ins;
980*9880d681SAndroid Build Coastguard Worker }
981*9880d681SAndroid Build Coastguard Worker }
982*9880d681SAndroid Build Coastguard Worker
983*9880d681SAndroid Build Coastguard Worker // Accumulate the total frequency of inserted spill code.
984*9880d681SAndroid Build Coastguard Worker while (Ins--)
985*9880d681SAndroid Build Coastguard Worker StaticCost += SpillPlacer->getBlockFrequency(BC.Number);
986*9880d681SAndroid Build Coastguard Worker }
987*9880d681SAndroid Build Coastguard Worker Cost = StaticCost;
988*9880d681SAndroid Build Coastguard Worker
989*9880d681SAndroid Build Coastguard Worker // Add constraints for use-blocks. Note that these are the only constraints
990*9880d681SAndroid Build Coastguard Worker // that may add a positive bias, it is downhill from here.
991*9880d681SAndroid Build Coastguard Worker SpillPlacer->addConstraints(SplitConstraints);
992*9880d681SAndroid Build Coastguard Worker return SpillPlacer->scanActiveBundles();
993*9880d681SAndroid Build Coastguard Worker }
994*9880d681SAndroid Build Coastguard Worker
995*9880d681SAndroid Build Coastguard Worker
996*9880d681SAndroid Build Coastguard Worker /// addThroughConstraints - Add constraints and links to SpillPlacer from the
997*9880d681SAndroid Build Coastguard Worker /// live-through blocks in Blocks.
addThroughConstraints(InterferenceCache::Cursor Intf,ArrayRef<unsigned> Blocks)998*9880d681SAndroid Build Coastguard Worker void RAGreedy::addThroughConstraints(InterferenceCache::Cursor Intf,
999*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> Blocks) {
1000*9880d681SAndroid Build Coastguard Worker const unsigned GroupSize = 8;
1001*9880d681SAndroid Build Coastguard Worker SpillPlacement::BlockConstraint BCS[GroupSize];
1002*9880d681SAndroid Build Coastguard Worker unsigned TBS[GroupSize];
1003*9880d681SAndroid Build Coastguard Worker unsigned B = 0, T = 0;
1004*9880d681SAndroid Build Coastguard Worker
1005*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != Blocks.size(); ++i) {
1006*9880d681SAndroid Build Coastguard Worker unsigned Number = Blocks[i];
1007*9880d681SAndroid Build Coastguard Worker Intf.moveToBlock(Number);
1008*9880d681SAndroid Build Coastguard Worker
1009*9880d681SAndroid Build Coastguard Worker if (!Intf.hasInterference()) {
1010*9880d681SAndroid Build Coastguard Worker assert(T < GroupSize && "Array overflow");
1011*9880d681SAndroid Build Coastguard Worker TBS[T] = Number;
1012*9880d681SAndroid Build Coastguard Worker if (++T == GroupSize) {
1013*9880d681SAndroid Build Coastguard Worker SpillPlacer->addLinks(makeArrayRef(TBS, T));
1014*9880d681SAndroid Build Coastguard Worker T = 0;
1015*9880d681SAndroid Build Coastguard Worker }
1016*9880d681SAndroid Build Coastguard Worker continue;
1017*9880d681SAndroid Build Coastguard Worker }
1018*9880d681SAndroid Build Coastguard Worker
1019*9880d681SAndroid Build Coastguard Worker assert(B < GroupSize && "Array overflow");
1020*9880d681SAndroid Build Coastguard Worker BCS[B].Number = Number;
1021*9880d681SAndroid Build Coastguard Worker
1022*9880d681SAndroid Build Coastguard Worker // Interference for the live-in value.
1023*9880d681SAndroid Build Coastguard Worker if (Intf.first() <= Indexes->getMBBStartIdx(Number))
1024*9880d681SAndroid Build Coastguard Worker BCS[B].Entry = SpillPlacement::MustSpill;
1025*9880d681SAndroid Build Coastguard Worker else
1026*9880d681SAndroid Build Coastguard Worker BCS[B].Entry = SpillPlacement::PrefSpill;
1027*9880d681SAndroid Build Coastguard Worker
1028*9880d681SAndroid Build Coastguard Worker // Interference for the live-out value.
1029*9880d681SAndroid Build Coastguard Worker if (Intf.last() >= SA->getLastSplitPoint(Number))
1030*9880d681SAndroid Build Coastguard Worker BCS[B].Exit = SpillPlacement::MustSpill;
1031*9880d681SAndroid Build Coastguard Worker else
1032*9880d681SAndroid Build Coastguard Worker BCS[B].Exit = SpillPlacement::PrefSpill;
1033*9880d681SAndroid Build Coastguard Worker
1034*9880d681SAndroid Build Coastguard Worker if (++B == GroupSize) {
1035*9880d681SAndroid Build Coastguard Worker SpillPlacer->addConstraints(makeArrayRef(BCS, B));
1036*9880d681SAndroid Build Coastguard Worker B = 0;
1037*9880d681SAndroid Build Coastguard Worker }
1038*9880d681SAndroid Build Coastguard Worker }
1039*9880d681SAndroid Build Coastguard Worker
1040*9880d681SAndroid Build Coastguard Worker SpillPlacer->addConstraints(makeArrayRef(BCS, B));
1041*9880d681SAndroid Build Coastguard Worker SpillPlacer->addLinks(makeArrayRef(TBS, T));
1042*9880d681SAndroid Build Coastguard Worker }
1043*9880d681SAndroid Build Coastguard Worker
growRegion(GlobalSplitCandidate & Cand)1044*9880d681SAndroid Build Coastguard Worker void RAGreedy::growRegion(GlobalSplitCandidate &Cand) {
1045*9880d681SAndroid Build Coastguard Worker // Keep track of through blocks that have not been added to SpillPlacer.
1046*9880d681SAndroid Build Coastguard Worker BitVector Todo = SA->getThroughBlocks();
1047*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &ActiveBlocks = Cand.ActiveBlocks;
1048*9880d681SAndroid Build Coastguard Worker unsigned AddedTo = 0;
1049*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
1050*9880d681SAndroid Build Coastguard Worker unsigned Visited = 0;
1051*9880d681SAndroid Build Coastguard Worker #endif
1052*9880d681SAndroid Build Coastguard Worker
1053*9880d681SAndroid Build Coastguard Worker for (;;) {
1054*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> NewBundles = SpillPlacer->getRecentPositive();
1055*9880d681SAndroid Build Coastguard Worker // Find new through blocks in the periphery of PrefRegBundles.
1056*9880d681SAndroid Build Coastguard Worker for (int i = 0, e = NewBundles.size(); i != e; ++i) {
1057*9880d681SAndroid Build Coastguard Worker unsigned Bundle = NewBundles[i];
1058*9880d681SAndroid Build Coastguard Worker // Look at all blocks connected to Bundle in the full graph.
1059*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> Blocks = Bundles->getBlocks(Bundle);
1060*9880d681SAndroid Build Coastguard Worker for (ArrayRef<unsigned>::iterator I = Blocks.begin(), E = Blocks.end();
1061*9880d681SAndroid Build Coastguard Worker I != E; ++I) {
1062*9880d681SAndroid Build Coastguard Worker unsigned Block = *I;
1063*9880d681SAndroid Build Coastguard Worker if (!Todo.test(Block))
1064*9880d681SAndroid Build Coastguard Worker continue;
1065*9880d681SAndroid Build Coastguard Worker Todo.reset(Block);
1066*9880d681SAndroid Build Coastguard Worker // This is a new through block. Add it to SpillPlacer later.
1067*9880d681SAndroid Build Coastguard Worker ActiveBlocks.push_back(Block);
1068*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
1069*9880d681SAndroid Build Coastguard Worker ++Visited;
1070*9880d681SAndroid Build Coastguard Worker #endif
1071*9880d681SAndroid Build Coastguard Worker }
1072*9880d681SAndroid Build Coastguard Worker }
1073*9880d681SAndroid Build Coastguard Worker // Any new blocks to add?
1074*9880d681SAndroid Build Coastguard Worker if (ActiveBlocks.size() == AddedTo)
1075*9880d681SAndroid Build Coastguard Worker break;
1076*9880d681SAndroid Build Coastguard Worker
1077*9880d681SAndroid Build Coastguard Worker // Compute through constraints from the interference, or assume that all
1078*9880d681SAndroid Build Coastguard Worker // through blocks prefer spilling when forming compact regions.
1079*9880d681SAndroid Build Coastguard Worker auto NewBlocks = makeArrayRef(ActiveBlocks).slice(AddedTo);
1080*9880d681SAndroid Build Coastguard Worker if (Cand.PhysReg)
1081*9880d681SAndroid Build Coastguard Worker addThroughConstraints(Cand.Intf, NewBlocks);
1082*9880d681SAndroid Build Coastguard Worker else
1083*9880d681SAndroid Build Coastguard Worker // Provide a strong negative bias on through blocks to prevent unwanted
1084*9880d681SAndroid Build Coastguard Worker // liveness on loop backedges.
1085*9880d681SAndroid Build Coastguard Worker SpillPlacer->addPrefSpill(NewBlocks, /* Strong= */ true);
1086*9880d681SAndroid Build Coastguard Worker AddedTo = ActiveBlocks.size();
1087*9880d681SAndroid Build Coastguard Worker
1088*9880d681SAndroid Build Coastguard Worker // Perhaps iterating can enable more bundles?
1089*9880d681SAndroid Build Coastguard Worker SpillPlacer->iterate();
1090*9880d681SAndroid Build Coastguard Worker }
1091*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << ", v=" << Visited);
1092*9880d681SAndroid Build Coastguard Worker }
1093*9880d681SAndroid Build Coastguard Worker
1094*9880d681SAndroid Build Coastguard Worker /// calcCompactRegion - Compute the set of edge bundles that should be live
1095*9880d681SAndroid Build Coastguard Worker /// when splitting the current live range into compact regions. Compact
1096*9880d681SAndroid Build Coastguard Worker /// regions can be computed without looking at interference. They are the
1097*9880d681SAndroid Build Coastguard Worker /// regions formed by removing all the live-through blocks from the live range.
1098*9880d681SAndroid Build Coastguard Worker ///
1099*9880d681SAndroid Build Coastguard Worker /// Returns false if the current live range is already compact, or if the
1100*9880d681SAndroid Build Coastguard Worker /// compact regions would form single block regions anyway.
calcCompactRegion(GlobalSplitCandidate & Cand)1101*9880d681SAndroid Build Coastguard Worker bool RAGreedy::calcCompactRegion(GlobalSplitCandidate &Cand) {
1102*9880d681SAndroid Build Coastguard Worker // Without any through blocks, the live range is already compact.
1103*9880d681SAndroid Build Coastguard Worker if (!SA->getNumThroughBlocks())
1104*9880d681SAndroid Build Coastguard Worker return false;
1105*9880d681SAndroid Build Coastguard Worker
1106*9880d681SAndroid Build Coastguard Worker // Compact regions don't correspond to any physreg.
1107*9880d681SAndroid Build Coastguard Worker Cand.reset(IntfCache, 0);
1108*9880d681SAndroid Build Coastguard Worker
1109*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Compact region bundles");
1110*9880d681SAndroid Build Coastguard Worker
1111*9880d681SAndroid Build Coastguard Worker // Use the spill placer to determine the live bundles. GrowRegion pretends
1112*9880d681SAndroid Build Coastguard Worker // that all the through blocks have interference when PhysReg is unset.
1113*9880d681SAndroid Build Coastguard Worker SpillPlacer->prepare(Cand.LiveBundles);
1114*9880d681SAndroid Build Coastguard Worker
1115*9880d681SAndroid Build Coastguard Worker // The static split cost will be zero since Cand.Intf reports no interference.
1116*9880d681SAndroid Build Coastguard Worker BlockFrequency Cost;
1117*9880d681SAndroid Build Coastguard Worker if (!addSplitConstraints(Cand.Intf, Cost)) {
1118*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << ", none.\n");
1119*9880d681SAndroid Build Coastguard Worker return false;
1120*9880d681SAndroid Build Coastguard Worker }
1121*9880d681SAndroid Build Coastguard Worker
1122*9880d681SAndroid Build Coastguard Worker growRegion(Cand);
1123*9880d681SAndroid Build Coastguard Worker SpillPlacer->finish();
1124*9880d681SAndroid Build Coastguard Worker
1125*9880d681SAndroid Build Coastguard Worker if (!Cand.LiveBundles.any()) {
1126*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << ", none.\n");
1127*9880d681SAndroid Build Coastguard Worker return false;
1128*9880d681SAndroid Build Coastguard Worker }
1129*9880d681SAndroid Build Coastguard Worker
1130*9880d681SAndroid Build Coastguard Worker DEBUG({
1131*9880d681SAndroid Build Coastguard Worker for (int i = Cand.LiveBundles.find_first(); i>=0;
1132*9880d681SAndroid Build Coastguard Worker i = Cand.LiveBundles.find_next(i))
1133*9880d681SAndroid Build Coastguard Worker dbgs() << " EB#" << i;
1134*9880d681SAndroid Build Coastguard Worker dbgs() << ".\n";
1135*9880d681SAndroid Build Coastguard Worker });
1136*9880d681SAndroid Build Coastguard Worker return true;
1137*9880d681SAndroid Build Coastguard Worker }
1138*9880d681SAndroid Build Coastguard Worker
1139*9880d681SAndroid Build Coastguard Worker /// calcSpillCost - Compute how expensive it would be to split the live range in
1140*9880d681SAndroid Build Coastguard Worker /// SA around all use blocks instead of forming bundle regions.
calcSpillCost()1141*9880d681SAndroid Build Coastguard Worker BlockFrequency RAGreedy::calcSpillCost() {
1142*9880d681SAndroid Build Coastguard Worker BlockFrequency Cost = 0;
1143*9880d681SAndroid Build Coastguard Worker ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
1144*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != UseBlocks.size(); ++i) {
1145*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
1146*9880d681SAndroid Build Coastguard Worker unsigned Number = BI.MBB->getNumber();
1147*9880d681SAndroid Build Coastguard Worker // We normally only need one spill instruction - a load or a store.
1148*9880d681SAndroid Build Coastguard Worker Cost += SpillPlacer->getBlockFrequency(Number);
1149*9880d681SAndroid Build Coastguard Worker
1150*9880d681SAndroid Build Coastguard Worker // Unless the value is redefined in the block.
1151*9880d681SAndroid Build Coastguard Worker if (BI.LiveIn && BI.LiveOut && BI.FirstDef)
1152*9880d681SAndroid Build Coastguard Worker Cost += SpillPlacer->getBlockFrequency(Number);
1153*9880d681SAndroid Build Coastguard Worker }
1154*9880d681SAndroid Build Coastguard Worker return Cost;
1155*9880d681SAndroid Build Coastguard Worker }
1156*9880d681SAndroid Build Coastguard Worker
1157*9880d681SAndroid Build Coastguard Worker /// calcGlobalSplitCost - Return the global split cost of following the split
1158*9880d681SAndroid Build Coastguard Worker /// pattern in LiveBundles. This cost should be added to the local cost of the
1159*9880d681SAndroid Build Coastguard Worker /// interference pattern in SplitConstraints.
1160*9880d681SAndroid Build Coastguard Worker ///
calcGlobalSplitCost(GlobalSplitCandidate & Cand)1161*9880d681SAndroid Build Coastguard Worker BlockFrequency RAGreedy::calcGlobalSplitCost(GlobalSplitCandidate &Cand) {
1162*9880d681SAndroid Build Coastguard Worker BlockFrequency GlobalCost = 0;
1163*9880d681SAndroid Build Coastguard Worker const BitVector &LiveBundles = Cand.LiveBundles;
1164*9880d681SAndroid Build Coastguard Worker ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
1165*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != UseBlocks.size(); ++i) {
1166*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
1167*9880d681SAndroid Build Coastguard Worker SpillPlacement::BlockConstraint &BC = SplitConstraints[i];
1168*9880d681SAndroid Build Coastguard Worker bool RegIn = LiveBundles[Bundles->getBundle(BC.Number, 0)];
1169*9880d681SAndroid Build Coastguard Worker bool RegOut = LiveBundles[Bundles->getBundle(BC.Number, 1)];
1170*9880d681SAndroid Build Coastguard Worker unsigned Ins = 0;
1171*9880d681SAndroid Build Coastguard Worker
1172*9880d681SAndroid Build Coastguard Worker if (BI.LiveIn)
1173*9880d681SAndroid Build Coastguard Worker Ins += RegIn != (BC.Entry == SpillPlacement::PrefReg);
1174*9880d681SAndroid Build Coastguard Worker if (BI.LiveOut)
1175*9880d681SAndroid Build Coastguard Worker Ins += RegOut != (BC.Exit == SpillPlacement::PrefReg);
1176*9880d681SAndroid Build Coastguard Worker while (Ins--)
1177*9880d681SAndroid Build Coastguard Worker GlobalCost += SpillPlacer->getBlockFrequency(BC.Number);
1178*9880d681SAndroid Build Coastguard Worker }
1179*9880d681SAndroid Build Coastguard Worker
1180*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Cand.ActiveBlocks.size(); i != e; ++i) {
1181*9880d681SAndroid Build Coastguard Worker unsigned Number = Cand.ActiveBlocks[i];
1182*9880d681SAndroid Build Coastguard Worker bool RegIn = LiveBundles[Bundles->getBundle(Number, 0)];
1183*9880d681SAndroid Build Coastguard Worker bool RegOut = LiveBundles[Bundles->getBundle(Number, 1)];
1184*9880d681SAndroid Build Coastguard Worker if (!RegIn && !RegOut)
1185*9880d681SAndroid Build Coastguard Worker continue;
1186*9880d681SAndroid Build Coastguard Worker if (RegIn && RegOut) {
1187*9880d681SAndroid Build Coastguard Worker // We need double spill code if this block has interference.
1188*9880d681SAndroid Build Coastguard Worker Cand.Intf.moveToBlock(Number);
1189*9880d681SAndroid Build Coastguard Worker if (Cand.Intf.hasInterference()) {
1190*9880d681SAndroid Build Coastguard Worker GlobalCost += SpillPlacer->getBlockFrequency(Number);
1191*9880d681SAndroid Build Coastguard Worker GlobalCost += SpillPlacer->getBlockFrequency(Number);
1192*9880d681SAndroid Build Coastguard Worker }
1193*9880d681SAndroid Build Coastguard Worker continue;
1194*9880d681SAndroid Build Coastguard Worker }
1195*9880d681SAndroid Build Coastguard Worker // live-in / stack-out or stack-in live-out.
1196*9880d681SAndroid Build Coastguard Worker GlobalCost += SpillPlacer->getBlockFrequency(Number);
1197*9880d681SAndroid Build Coastguard Worker }
1198*9880d681SAndroid Build Coastguard Worker return GlobalCost;
1199*9880d681SAndroid Build Coastguard Worker }
1200*9880d681SAndroid Build Coastguard Worker
1201*9880d681SAndroid Build Coastguard Worker /// splitAroundRegion - Split the current live range around the regions
1202*9880d681SAndroid Build Coastguard Worker /// determined by BundleCand and GlobalCand.
1203*9880d681SAndroid Build Coastguard Worker ///
1204*9880d681SAndroid Build Coastguard Worker /// Before calling this function, GlobalCand and BundleCand must be initialized
1205*9880d681SAndroid Build Coastguard Worker /// so each bundle is assigned to a valid candidate, or NoCand for the
1206*9880d681SAndroid Build Coastguard Worker /// stack-bound bundles. The shared SA/SE SplitAnalysis and SplitEditor
1207*9880d681SAndroid Build Coastguard Worker /// objects must be initialized for the current live range, and intervals
1208*9880d681SAndroid Build Coastguard Worker /// created for the used candidates.
1209*9880d681SAndroid Build Coastguard Worker ///
1210*9880d681SAndroid Build Coastguard Worker /// @param LREdit The LiveRangeEdit object handling the current split.
1211*9880d681SAndroid Build Coastguard Worker /// @param UsedCands List of used GlobalCand entries. Every BundleCand value
1212*9880d681SAndroid Build Coastguard Worker /// must appear in this list.
splitAroundRegion(LiveRangeEdit & LREdit,ArrayRef<unsigned> UsedCands)1213*9880d681SAndroid Build Coastguard Worker void RAGreedy::splitAroundRegion(LiveRangeEdit &LREdit,
1214*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> UsedCands) {
1215*9880d681SAndroid Build Coastguard Worker // These are the intervals created for new global ranges. We may create more
1216*9880d681SAndroid Build Coastguard Worker // intervals for local ranges.
1217*9880d681SAndroid Build Coastguard Worker const unsigned NumGlobalIntvs = LREdit.size();
1218*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "splitAroundRegion with " << NumGlobalIntvs << " globals.\n");
1219*9880d681SAndroid Build Coastguard Worker assert(NumGlobalIntvs && "No global intervals configured");
1220*9880d681SAndroid Build Coastguard Worker
1221*9880d681SAndroid Build Coastguard Worker // Isolate even single instructions when dealing with a proper sub-class.
1222*9880d681SAndroid Build Coastguard Worker // That guarantees register class inflation for the stack interval because it
1223*9880d681SAndroid Build Coastguard Worker // is all copies.
1224*9880d681SAndroid Build Coastguard Worker unsigned Reg = SA->getParent().reg;
1225*9880d681SAndroid Build Coastguard Worker bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg));
1226*9880d681SAndroid Build Coastguard Worker
1227*9880d681SAndroid Build Coastguard Worker // First handle all the blocks with uses.
1228*9880d681SAndroid Build Coastguard Worker ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
1229*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != UseBlocks.size(); ++i) {
1230*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
1231*9880d681SAndroid Build Coastguard Worker unsigned Number = BI.MBB->getNumber();
1232*9880d681SAndroid Build Coastguard Worker unsigned IntvIn = 0, IntvOut = 0;
1233*9880d681SAndroid Build Coastguard Worker SlotIndex IntfIn, IntfOut;
1234*9880d681SAndroid Build Coastguard Worker if (BI.LiveIn) {
1235*9880d681SAndroid Build Coastguard Worker unsigned CandIn = BundleCand[Bundles->getBundle(Number, 0)];
1236*9880d681SAndroid Build Coastguard Worker if (CandIn != NoCand) {
1237*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1238*9880d681SAndroid Build Coastguard Worker IntvIn = Cand.IntvIdx;
1239*9880d681SAndroid Build Coastguard Worker Cand.Intf.moveToBlock(Number);
1240*9880d681SAndroid Build Coastguard Worker IntfIn = Cand.Intf.first();
1241*9880d681SAndroid Build Coastguard Worker }
1242*9880d681SAndroid Build Coastguard Worker }
1243*9880d681SAndroid Build Coastguard Worker if (BI.LiveOut) {
1244*9880d681SAndroid Build Coastguard Worker unsigned CandOut = BundleCand[Bundles->getBundle(Number, 1)];
1245*9880d681SAndroid Build Coastguard Worker if (CandOut != NoCand) {
1246*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1247*9880d681SAndroid Build Coastguard Worker IntvOut = Cand.IntvIdx;
1248*9880d681SAndroid Build Coastguard Worker Cand.Intf.moveToBlock(Number);
1249*9880d681SAndroid Build Coastguard Worker IntfOut = Cand.Intf.last();
1250*9880d681SAndroid Build Coastguard Worker }
1251*9880d681SAndroid Build Coastguard Worker }
1252*9880d681SAndroid Build Coastguard Worker
1253*9880d681SAndroid Build Coastguard Worker // Create separate intervals for isolated blocks with multiple uses.
1254*9880d681SAndroid Build Coastguard Worker if (!IntvIn && !IntvOut) {
1255*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " isolated.\n");
1256*9880d681SAndroid Build Coastguard Worker if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1257*9880d681SAndroid Build Coastguard Worker SE->splitSingleBlock(BI);
1258*9880d681SAndroid Build Coastguard Worker continue;
1259*9880d681SAndroid Build Coastguard Worker }
1260*9880d681SAndroid Build Coastguard Worker
1261*9880d681SAndroid Build Coastguard Worker if (IntvIn && IntvOut)
1262*9880d681SAndroid Build Coastguard Worker SE->splitLiveThroughBlock(Number, IntvIn, IntfIn, IntvOut, IntfOut);
1263*9880d681SAndroid Build Coastguard Worker else if (IntvIn)
1264*9880d681SAndroid Build Coastguard Worker SE->splitRegInBlock(BI, IntvIn, IntfIn);
1265*9880d681SAndroid Build Coastguard Worker else
1266*9880d681SAndroid Build Coastguard Worker SE->splitRegOutBlock(BI, IntvOut, IntfOut);
1267*9880d681SAndroid Build Coastguard Worker }
1268*9880d681SAndroid Build Coastguard Worker
1269*9880d681SAndroid Build Coastguard Worker // Handle live-through blocks. The relevant live-through blocks are stored in
1270*9880d681SAndroid Build Coastguard Worker // the ActiveBlocks list with each candidate. We need to filter out
1271*9880d681SAndroid Build Coastguard Worker // duplicates.
1272*9880d681SAndroid Build Coastguard Worker BitVector Todo = SA->getThroughBlocks();
1273*9880d681SAndroid Build Coastguard Worker for (unsigned c = 0; c != UsedCands.size(); ++c) {
1274*9880d681SAndroid Build Coastguard Worker ArrayRef<unsigned> Blocks = GlobalCand[UsedCands[c]].ActiveBlocks;
1275*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Blocks.size(); i != e; ++i) {
1276*9880d681SAndroid Build Coastguard Worker unsigned Number = Blocks[i];
1277*9880d681SAndroid Build Coastguard Worker if (!Todo.test(Number))
1278*9880d681SAndroid Build Coastguard Worker continue;
1279*9880d681SAndroid Build Coastguard Worker Todo.reset(Number);
1280*9880d681SAndroid Build Coastguard Worker
1281*9880d681SAndroid Build Coastguard Worker unsigned IntvIn = 0, IntvOut = 0;
1282*9880d681SAndroid Build Coastguard Worker SlotIndex IntfIn, IntfOut;
1283*9880d681SAndroid Build Coastguard Worker
1284*9880d681SAndroid Build Coastguard Worker unsigned CandIn = BundleCand[Bundles->getBundle(Number, 0)];
1285*9880d681SAndroid Build Coastguard Worker if (CandIn != NoCand) {
1286*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[CandIn];
1287*9880d681SAndroid Build Coastguard Worker IntvIn = Cand.IntvIdx;
1288*9880d681SAndroid Build Coastguard Worker Cand.Intf.moveToBlock(Number);
1289*9880d681SAndroid Build Coastguard Worker IntfIn = Cand.Intf.first();
1290*9880d681SAndroid Build Coastguard Worker }
1291*9880d681SAndroid Build Coastguard Worker
1292*9880d681SAndroid Build Coastguard Worker unsigned CandOut = BundleCand[Bundles->getBundle(Number, 1)];
1293*9880d681SAndroid Build Coastguard Worker if (CandOut != NoCand) {
1294*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[CandOut];
1295*9880d681SAndroid Build Coastguard Worker IntvOut = Cand.IntvIdx;
1296*9880d681SAndroid Build Coastguard Worker Cand.Intf.moveToBlock(Number);
1297*9880d681SAndroid Build Coastguard Worker IntfOut = Cand.Intf.last();
1298*9880d681SAndroid Build Coastguard Worker }
1299*9880d681SAndroid Build Coastguard Worker if (!IntvIn && !IntvOut)
1300*9880d681SAndroid Build Coastguard Worker continue;
1301*9880d681SAndroid Build Coastguard Worker SE->splitLiveThroughBlock(Number, IntvIn, IntfIn, IntvOut, IntfOut);
1302*9880d681SAndroid Build Coastguard Worker }
1303*9880d681SAndroid Build Coastguard Worker }
1304*9880d681SAndroid Build Coastguard Worker
1305*9880d681SAndroid Build Coastguard Worker ++NumGlobalSplits;
1306*9880d681SAndroid Build Coastguard Worker
1307*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> IntvMap;
1308*9880d681SAndroid Build Coastguard Worker SE->finish(&IntvMap);
1309*9880d681SAndroid Build Coastguard Worker DebugVars->splitRegister(Reg, LREdit.regs(), *LIS);
1310*9880d681SAndroid Build Coastguard Worker
1311*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
1312*9880d681SAndroid Build Coastguard Worker unsigned OrigBlocks = SA->getNumLiveBlocks();
1313*9880d681SAndroid Build Coastguard Worker
1314*9880d681SAndroid Build Coastguard Worker // Sort out the new intervals created by splitting. We get four kinds:
1315*9880d681SAndroid Build Coastguard Worker // - Remainder intervals should not be split again.
1316*9880d681SAndroid Build Coastguard Worker // - Candidate intervals can be assigned to Cand.PhysReg.
1317*9880d681SAndroid Build Coastguard Worker // - Block-local splits are candidates for local splitting.
1318*9880d681SAndroid Build Coastguard Worker // - DCE leftovers should go back on the queue.
1319*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = LREdit.size(); i != e; ++i) {
1320*9880d681SAndroid Build Coastguard Worker LiveInterval &Reg = LIS->getInterval(LREdit.get(i));
1321*9880d681SAndroid Build Coastguard Worker
1322*9880d681SAndroid Build Coastguard Worker // Ignore old intervals from DCE.
1323*9880d681SAndroid Build Coastguard Worker if (getStage(Reg) != RS_New)
1324*9880d681SAndroid Build Coastguard Worker continue;
1325*9880d681SAndroid Build Coastguard Worker
1326*9880d681SAndroid Build Coastguard Worker // Remainder interval. Don't try splitting again, spill if it doesn't
1327*9880d681SAndroid Build Coastguard Worker // allocate.
1328*9880d681SAndroid Build Coastguard Worker if (IntvMap[i] == 0) {
1329*9880d681SAndroid Build Coastguard Worker setStage(Reg, RS_Spill);
1330*9880d681SAndroid Build Coastguard Worker continue;
1331*9880d681SAndroid Build Coastguard Worker }
1332*9880d681SAndroid Build Coastguard Worker
1333*9880d681SAndroid Build Coastguard Worker // Global intervals. Allow repeated splitting as long as the number of live
1334*9880d681SAndroid Build Coastguard Worker // blocks is strictly decreasing.
1335*9880d681SAndroid Build Coastguard Worker if (IntvMap[i] < NumGlobalIntvs) {
1336*9880d681SAndroid Build Coastguard Worker if (SA->countLiveBlocks(&Reg) >= OrigBlocks) {
1337*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Main interval covers the same " << OrigBlocks
1338*9880d681SAndroid Build Coastguard Worker << " blocks as original.\n");
1339*9880d681SAndroid Build Coastguard Worker // Don't allow repeated splitting as a safe guard against looping.
1340*9880d681SAndroid Build Coastguard Worker setStage(Reg, RS_Split2);
1341*9880d681SAndroid Build Coastguard Worker }
1342*9880d681SAndroid Build Coastguard Worker continue;
1343*9880d681SAndroid Build Coastguard Worker }
1344*9880d681SAndroid Build Coastguard Worker
1345*9880d681SAndroid Build Coastguard Worker // Other intervals are treated as new. This includes local intervals created
1346*9880d681SAndroid Build Coastguard Worker // for blocks with multiple uses, and anything created by DCE.
1347*9880d681SAndroid Build Coastguard Worker }
1348*9880d681SAndroid Build Coastguard Worker
1349*9880d681SAndroid Build Coastguard Worker if (VerifyEnabled)
1350*9880d681SAndroid Build Coastguard Worker MF->verify(this, "After splitting live range around region");
1351*9880d681SAndroid Build Coastguard Worker }
1352*9880d681SAndroid Build Coastguard Worker
tryRegionSplit(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)1353*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
1354*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
1355*9880d681SAndroid Build Coastguard Worker unsigned NumCands = 0;
1356*9880d681SAndroid Build Coastguard Worker BlockFrequency BestCost;
1357*9880d681SAndroid Build Coastguard Worker
1358*9880d681SAndroid Build Coastguard Worker // Check if we can split this live range around a compact region.
1359*9880d681SAndroid Build Coastguard Worker bool HasCompact = calcCompactRegion(GlobalCand.front());
1360*9880d681SAndroid Build Coastguard Worker if (HasCompact) {
1361*9880d681SAndroid Build Coastguard Worker // Yes, keep GlobalCand[0] as the compact region candidate.
1362*9880d681SAndroid Build Coastguard Worker NumCands = 1;
1363*9880d681SAndroid Build Coastguard Worker BestCost = BlockFrequency::getMaxFrequency();
1364*9880d681SAndroid Build Coastguard Worker } else {
1365*9880d681SAndroid Build Coastguard Worker // No benefit from the compact region, our fallback will be per-block
1366*9880d681SAndroid Build Coastguard Worker // splitting. Make sure we find a solution that is cheaper than spilling.
1367*9880d681SAndroid Build Coastguard Worker BestCost = calcSpillCost();
1368*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Cost of isolating all blocks = ";
1369*9880d681SAndroid Build Coastguard Worker MBFI->printBlockFreq(dbgs(), BestCost) << '\n');
1370*9880d681SAndroid Build Coastguard Worker }
1371*9880d681SAndroid Build Coastguard Worker
1372*9880d681SAndroid Build Coastguard Worker unsigned BestCand =
1373*9880d681SAndroid Build Coastguard Worker calculateRegionSplitCost(VirtReg, Order, BestCost, NumCands,
1374*9880d681SAndroid Build Coastguard Worker false/*IgnoreCSR*/);
1375*9880d681SAndroid Build Coastguard Worker
1376*9880d681SAndroid Build Coastguard Worker // No solutions found, fall back to single block splitting.
1377*9880d681SAndroid Build Coastguard Worker if (!HasCompact && BestCand == NoCand)
1378*9880d681SAndroid Build Coastguard Worker return 0;
1379*9880d681SAndroid Build Coastguard Worker
1380*9880d681SAndroid Build Coastguard Worker return doRegionSplit(VirtReg, BestCand, HasCompact, NewVRegs);
1381*9880d681SAndroid Build Coastguard Worker }
1382*9880d681SAndroid Build Coastguard Worker
calculateRegionSplitCost(LiveInterval & VirtReg,AllocationOrder & Order,BlockFrequency & BestCost,unsigned & NumCands,bool IgnoreCSR)1383*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::calculateRegionSplitCost(LiveInterval &VirtReg,
1384*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
1385*9880d681SAndroid Build Coastguard Worker BlockFrequency &BestCost,
1386*9880d681SAndroid Build Coastguard Worker unsigned &NumCands,
1387*9880d681SAndroid Build Coastguard Worker bool IgnoreCSR) {
1388*9880d681SAndroid Build Coastguard Worker unsigned BestCand = NoCand;
1389*9880d681SAndroid Build Coastguard Worker Order.rewind();
1390*9880d681SAndroid Build Coastguard Worker while (unsigned PhysReg = Order.next()) {
1391*9880d681SAndroid Build Coastguard Worker if (IgnoreCSR && isUnusedCalleeSavedReg(PhysReg))
1392*9880d681SAndroid Build Coastguard Worker continue;
1393*9880d681SAndroid Build Coastguard Worker
1394*9880d681SAndroid Build Coastguard Worker // Discard bad candidates before we run out of interference cache cursors.
1395*9880d681SAndroid Build Coastguard Worker // This will only affect register classes with a lot of registers (>32).
1396*9880d681SAndroid Build Coastguard Worker if (NumCands == IntfCache.getMaxCursors()) {
1397*9880d681SAndroid Build Coastguard Worker unsigned WorstCount = ~0u;
1398*9880d681SAndroid Build Coastguard Worker unsigned Worst = 0;
1399*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != NumCands; ++i) {
1400*9880d681SAndroid Build Coastguard Worker if (i == BestCand || !GlobalCand[i].PhysReg)
1401*9880d681SAndroid Build Coastguard Worker continue;
1402*9880d681SAndroid Build Coastguard Worker unsigned Count = GlobalCand[i].LiveBundles.count();
1403*9880d681SAndroid Build Coastguard Worker if (Count < WorstCount) {
1404*9880d681SAndroid Build Coastguard Worker Worst = i;
1405*9880d681SAndroid Build Coastguard Worker WorstCount = Count;
1406*9880d681SAndroid Build Coastguard Worker }
1407*9880d681SAndroid Build Coastguard Worker }
1408*9880d681SAndroid Build Coastguard Worker --NumCands;
1409*9880d681SAndroid Build Coastguard Worker GlobalCand[Worst] = GlobalCand[NumCands];
1410*9880d681SAndroid Build Coastguard Worker if (BestCand == NumCands)
1411*9880d681SAndroid Build Coastguard Worker BestCand = Worst;
1412*9880d681SAndroid Build Coastguard Worker }
1413*9880d681SAndroid Build Coastguard Worker
1414*9880d681SAndroid Build Coastguard Worker if (GlobalCand.size() <= NumCands)
1415*9880d681SAndroid Build Coastguard Worker GlobalCand.resize(NumCands+1);
1416*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[NumCands];
1417*9880d681SAndroid Build Coastguard Worker Cand.reset(IntfCache, PhysReg);
1418*9880d681SAndroid Build Coastguard Worker
1419*9880d681SAndroid Build Coastguard Worker SpillPlacer->prepare(Cand.LiveBundles);
1420*9880d681SAndroid Build Coastguard Worker BlockFrequency Cost;
1421*9880d681SAndroid Build Coastguard Worker if (!addSplitConstraints(Cand.Intf, Cost)) {
1422*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(PhysReg, TRI) << "\tno positive bundles\n");
1423*9880d681SAndroid Build Coastguard Worker continue;
1424*9880d681SAndroid Build Coastguard Worker }
1425*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(PhysReg, TRI) << "\tstatic = ";
1426*9880d681SAndroid Build Coastguard Worker MBFI->printBlockFreq(dbgs(), Cost));
1427*9880d681SAndroid Build Coastguard Worker if (Cost >= BestCost) {
1428*9880d681SAndroid Build Coastguard Worker DEBUG({
1429*9880d681SAndroid Build Coastguard Worker if (BestCand == NoCand)
1430*9880d681SAndroid Build Coastguard Worker dbgs() << " worse than no bundles\n";
1431*9880d681SAndroid Build Coastguard Worker else
1432*9880d681SAndroid Build Coastguard Worker dbgs() << " worse than "
1433*9880d681SAndroid Build Coastguard Worker << PrintReg(GlobalCand[BestCand].PhysReg, TRI) << '\n';
1434*9880d681SAndroid Build Coastguard Worker });
1435*9880d681SAndroid Build Coastguard Worker continue;
1436*9880d681SAndroid Build Coastguard Worker }
1437*9880d681SAndroid Build Coastguard Worker growRegion(Cand);
1438*9880d681SAndroid Build Coastguard Worker
1439*9880d681SAndroid Build Coastguard Worker SpillPlacer->finish();
1440*9880d681SAndroid Build Coastguard Worker
1441*9880d681SAndroid Build Coastguard Worker // No live bundles, defer to splitSingleBlocks().
1442*9880d681SAndroid Build Coastguard Worker if (!Cand.LiveBundles.any()) {
1443*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " no bundles.\n");
1444*9880d681SAndroid Build Coastguard Worker continue;
1445*9880d681SAndroid Build Coastguard Worker }
1446*9880d681SAndroid Build Coastguard Worker
1447*9880d681SAndroid Build Coastguard Worker Cost += calcGlobalSplitCost(Cand);
1448*9880d681SAndroid Build Coastguard Worker DEBUG({
1449*9880d681SAndroid Build Coastguard Worker dbgs() << ", total = "; MBFI->printBlockFreq(dbgs(), Cost)
1450*9880d681SAndroid Build Coastguard Worker << " with bundles";
1451*9880d681SAndroid Build Coastguard Worker for (int i = Cand.LiveBundles.find_first(); i>=0;
1452*9880d681SAndroid Build Coastguard Worker i = Cand.LiveBundles.find_next(i))
1453*9880d681SAndroid Build Coastguard Worker dbgs() << " EB#" << i;
1454*9880d681SAndroid Build Coastguard Worker dbgs() << ".\n";
1455*9880d681SAndroid Build Coastguard Worker });
1456*9880d681SAndroid Build Coastguard Worker if (Cost < BestCost) {
1457*9880d681SAndroid Build Coastguard Worker BestCand = NumCands;
1458*9880d681SAndroid Build Coastguard Worker BestCost = Cost;
1459*9880d681SAndroid Build Coastguard Worker }
1460*9880d681SAndroid Build Coastguard Worker ++NumCands;
1461*9880d681SAndroid Build Coastguard Worker }
1462*9880d681SAndroid Build Coastguard Worker return BestCand;
1463*9880d681SAndroid Build Coastguard Worker }
1464*9880d681SAndroid Build Coastguard Worker
doRegionSplit(LiveInterval & VirtReg,unsigned BestCand,bool HasCompact,SmallVectorImpl<unsigned> & NewVRegs)1465*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::doRegionSplit(LiveInterval &VirtReg, unsigned BestCand,
1466*9880d681SAndroid Build Coastguard Worker bool HasCompact,
1467*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
1468*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> UsedCands;
1469*9880d681SAndroid Build Coastguard Worker // Prepare split editor.
1470*9880d681SAndroid Build Coastguard Worker LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
1471*9880d681SAndroid Build Coastguard Worker SE->reset(LREdit, SplitSpillMode);
1472*9880d681SAndroid Build Coastguard Worker
1473*9880d681SAndroid Build Coastguard Worker // Assign all edge bundles to the preferred candidate, or NoCand.
1474*9880d681SAndroid Build Coastguard Worker BundleCand.assign(Bundles->getNumBundles(), NoCand);
1475*9880d681SAndroid Build Coastguard Worker
1476*9880d681SAndroid Build Coastguard Worker // Assign bundles for the best candidate region.
1477*9880d681SAndroid Build Coastguard Worker if (BestCand != NoCand) {
1478*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand[BestCand];
1479*9880d681SAndroid Build Coastguard Worker if (unsigned B = Cand.getBundles(BundleCand, BestCand)) {
1480*9880d681SAndroid Build Coastguard Worker UsedCands.push_back(BestCand);
1481*9880d681SAndroid Build Coastguard Worker Cand.IntvIdx = SE->openIntv();
1482*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Split for " << PrintReg(Cand.PhysReg, TRI) << " in "
1483*9880d681SAndroid Build Coastguard Worker << B << " bundles, intv " << Cand.IntvIdx << ".\n");
1484*9880d681SAndroid Build Coastguard Worker (void)B;
1485*9880d681SAndroid Build Coastguard Worker }
1486*9880d681SAndroid Build Coastguard Worker }
1487*9880d681SAndroid Build Coastguard Worker
1488*9880d681SAndroid Build Coastguard Worker // Assign bundles for the compact region.
1489*9880d681SAndroid Build Coastguard Worker if (HasCompact) {
1490*9880d681SAndroid Build Coastguard Worker GlobalSplitCandidate &Cand = GlobalCand.front();
1491*9880d681SAndroid Build Coastguard Worker assert(!Cand.PhysReg && "Compact region has no physreg");
1492*9880d681SAndroid Build Coastguard Worker if (unsigned B = Cand.getBundles(BundleCand, 0)) {
1493*9880d681SAndroid Build Coastguard Worker UsedCands.push_back(0);
1494*9880d681SAndroid Build Coastguard Worker Cand.IntvIdx = SE->openIntv();
1495*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Split for compact region in " << B << " bundles, intv "
1496*9880d681SAndroid Build Coastguard Worker << Cand.IntvIdx << ".\n");
1497*9880d681SAndroid Build Coastguard Worker (void)B;
1498*9880d681SAndroid Build Coastguard Worker }
1499*9880d681SAndroid Build Coastguard Worker }
1500*9880d681SAndroid Build Coastguard Worker
1501*9880d681SAndroid Build Coastguard Worker splitAroundRegion(LREdit, UsedCands);
1502*9880d681SAndroid Build Coastguard Worker return 0;
1503*9880d681SAndroid Build Coastguard Worker }
1504*9880d681SAndroid Build Coastguard Worker
1505*9880d681SAndroid Build Coastguard Worker
1506*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1507*9880d681SAndroid Build Coastguard Worker // Per-Block Splitting
1508*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1509*9880d681SAndroid Build Coastguard Worker
1510*9880d681SAndroid Build Coastguard Worker /// tryBlockSplit - Split a global live range around every block with uses. This
1511*9880d681SAndroid Build Coastguard Worker /// creates a lot of local live ranges, that will be split by tryLocalSplit if
1512*9880d681SAndroid Build Coastguard Worker /// they don't allocate.
tryBlockSplit(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)1513*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryBlockSplit(LiveInterval &VirtReg, AllocationOrder &Order,
1514*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
1515*9880d681SAndroid Build Coastguard Worker assert(&SA->getParent() == &VirtReg && "Live range wasn't analyzed");
1516*9880d681SAndroid Build Coastguard Worker unsigned Reg = VirtReg.reg;
1517*9880d681SAndroid Build Coastguard Worker bool SingleInstrs = RegClassInfo.isProperSubClass(MRI->getRegClass(Reg));
1518*9880d681SAndroid Build Coastguard Worker LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
1519*9880d681SAndroid Build Coastguard Worker SE->reset(LREdit, SplitSpillMode);
1520*9880d681SAndroid Build Coastguard Worker ArrayRef<SplitAnalysis::BlockInfo> UseBlocks = SA->getUseBlocks();
1521*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != UseBlocks.size(); ++i) {
1522*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = UseBlocks[i];
1523*9880d681SAndroid Build Coastguard Worker if (SA->shouldSplitSingleBlock(BI, SingleInstrs))
1524*9880d681SAndroid Build Coastguard Worker SE->splitSingleBlock(BI);
1525*9880d681SAndroid Build Coastguard Worker }
1526*9880d681SAndroid Build Coastguard Worker // No blocks were split.
1527*9880d681SAndroid Build Coastguard Worker if (LREdit.empty())
1528*9880d681SAndroid Build Coastguard Worker return 0;
1529*9880d681SAndroid Build Coastguard Worker
1530*9880d681SAndroid Build Coastguard Worker // We did split for some blocks.
1531*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> IntvMap;
1532*9880d681SAndroid Build Coastguard Worker SE->finish(&IntvMap);
1533*9880d681SAndroid Build Coastguard Worker
1534*9880d681SAndroid Build Coastguard Worker // Tell LiveDebugVariables about the new ranges.
1535*9880d681SAndroid Build Coastguard Worker DebugVars->splitRegister(Reg, LREdit.regs(), *LIS);
1536*9880d681SAndroid Build Coastguard Worker
1537*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
1538*9880d681SAndroid Build Coastguard Worker
1539*9880d681SAndroid Build Coastguard Worker // Sort out the new intervals created by splitting. The remainder interval
1540*9880d681SAndroid Build Coastguard Worker // goes straight to spilling, the new local ranges get to stay RS_New.
1541*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = LREdit.size(); i != e; ++i) {
1542*9880d681SAndroid Build Coastguard Worker LiveInterval &LI = LIS->getInterval(LREdit.get(i));
1543*9880d681SAndroid Build Coastguard Worker if (getStage(LI) == RS_New && IntvMap[i] == 0)
1544*9880d681SAndroid Build Coastguard Worker setStage(LI, RS_Spill);
1545*9880d681SAndroid Build Coastguard Worker }
1546*9880d681SAndroid Build Coastguard Worker
1547*9880d681SAndroid Build Coastguard Worker if (VerifyEnabled)
1548*9880d681SAndroid Build Coastguard Worker MF->verify(this, "After splitting live range around basic blocks");
1549*9880d681SAndroid Build Coastguard Worker return 0;
1550*9880d681SAndroid Build Coastguard Worker }
1551*9880d681SAndroid Build Coastguard Worker
1552*9880d681SAndroid Build Coastguard Worker
1553*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1554*9880d681SAndroid Build Coastguard Worker // Per-Instruction Splitting
1555*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1556*9880d681SAndroid Build Coastguard Worker
1557*9880d681SAndroid Build Coastguard Worker /// Get the number of allocatable registers that match the constraints of \p Reg
1558*9880d681SAndroid Build Coastguard Worker /// on \p MI and that are also in \p SuperRC.
getNumAllocatableRegsForConstraints(const MachineInstr * MI,unsigned Reg,const TargetRegisterClass * SuperRC,const TargetInstrInfo * TII,const TargetRegisterInfo * TRI,const RegisterClassInfo & RCI)1559*9880d681SAndroid Build Coastguard Worker static unsigned getNumAllocatableRegsForConstraints(
1560*9880d681SAndroid Build Coastguard Worker const MachineInstr *MI, unsigned Reg, const TargetRegisterClass *SuperRC,
1561*9880d681SAndroid Build Coastguard Worker const TargetInstrInfo *TII, const TargetRegisterInfo *TRI,
1562*9880d681SAndroid Build Coastguard Worker const RegisterClassInfo &RCI) {
1563*9880d681SAndroid Build Coastguard Worker assert(SuperRC && "Invalid register class");
1564*9880d681SAndroid Build Coastguard Worker
1565*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *ConstrainedRC =
1566*9880d681SAndroid Build Coastguard Worker MI->getRegClassConstraintEffectForVReg(Reg, SuperRC, TII, TRI,
1567*9880d681SAndroid Build Coastguard Worker /* ExploreBundle */ true);
1568*9880d681SAndroid Build Coastguard Worker if (!ConstrainedRC)
1569*9880d681SAndroid Build Coastguard Worker return 0;
1570*9880d681SAndroid Build Coastguard Worker return RCI.getNumAllocatableRegs(ConstrainedRC);
1571*9880d681SAndroid Build Coastguard Worker }
1572*9880d681SAndroid Build Coastguard Worker
1573*9880d681SAndroid Build Coastguard Worker /// tryInstructionSplit - Split a live range around individual instructions.
1574*9880d681SAndroid Build Coastguard Worker /// This is normally not worthwhile since the spiller is doing essentially the
1575*9880d681SAndroid Build Coastguard Worker /// same thing. However, when the live range is in a constrained register
1576*9880d681SAndroid Build Coastguard Worker /// class, it may help to insert copies such that parts of the live range can
1577*9880d681SAndroid Build Coastguard Worker /// be moved to a larger register class.
1578*9880d681SAndroid Build Coastguard Worker ///
1579*9880d681SAndroid Build Coastguard Worker /// This is similar to spilling to a larger register class.
1580*9880d681SAndroid Build Coastguard Worker unsigned
tryInstructionSplit(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)1581*9880d681SAndroid Build Coastguard Worker RAGreedy::tryInstructionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
1582*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
1583*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg);
1584*9880d681SAndroid Build Coastguard Worker // There is no point to this if there are no larger sub-classes.
1585*9880d681SAndroid Build Coastguard Worker if (!RegClassInfo.isProperSubClass(CurRC))
1586*9880d681SAndroid Build Coastguard Worker return 0;
1587*9880d681SAndroid Build Coastguard Worker
1588*9880d681SAndroid Build Coastguard Worker // Always enable split spill mode, since we're effectively spilling to a
1589*9880d681SAndroid Build Coastguard Worker // register.
1590*9880d681SAndroid Build Coastguard Worker LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
1591*9880d681SAndroid Build Coastguard Worker SE->reset(LREdit, SplitEditor::SM_Size);
1592*9880d681SAndroid Build Coastguard Worker
1593*9880d681SAndroid Build Coastguard Worker ArrayRef<SlotIndex> Uses = SA->getUseSlots();
1594*9880d681SAndroid Build Coastguard Worker if (Uses.size() <= 1)
1595*9880d681SAndroid Build Coastguard Worker return 0;
1596*9880d681SAndroid Build Coastguard Worker
1597*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Split around " << Uses.size() << " individual instrs.\n");
1598*9880d681SAndroid Build Coastguard Worker
1599*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *SuperRC =
1600*9880d681SAndroid Build Coastguard Worker TRI->getLargestLegalSuperClass(CurRC, *MF);
1601*9880d681SAndroid Build Coastguard Worker unsigned SuperRCNumAllocatableRegs = RCI.getNumAllocatableRegs(SuperRC);
1602*9880d681SAndroid Build Coastguard Worker // Split around every non-copy instruction if this split will relax
1603*9880d681SAndroid Build Coastguard Worker // the constraints on the virtual register.
1604*9880d681SAndroid Build Coastguard Worker // Otherwise, splitting just inserts uncoalescable copies that do not help
1605*9880d681SAndroid Build Coastguard Worker // the allocation.
1606*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != Uses.size(); ++i) {
1607*9880d681SAndroid Build Coastguard Worker if (const MachineInstr *MI = Indexes->getInstructionFromIndex(Uses[i]))
1608*9880d681SAndroid Build Coastguard Worker if (MI->isFullCopy() ||
1609*9880d681SAndroid Build Coastguard Worker SuperRCNumAllocatableRegs ==
1610*9880d681SAndroid Build Coastguard Worker getNumAllocatableRegsForConstraints(MI, VirtReg.reg, SuperRC, TII,
1611*9880d681SAndroid Build Coastguard Worker TRI, RCI)) {
1612*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " skip:\t" << Uses[i] << '\t' << *MI);
1613*9880d681SAndroid Build Coastguard Worker continue;
1614*9880d681SAndroid Build Coastguard Worker }
1615*9880d681SAndroid Build Coastguard Worker SE->openIntv();
1616*9880d681SAndroid Build Coastguard Worker SlotIndex SegStart = SE->enterIntvBefore(Uses[i]);
1617*9880d681SAndroid Build Coastguard Worker SlotIndex SegStop = SE->leaveIntvAfter(Uses[i]);
1618*9880d681SAndroid Build Coastguard Worker SE->useIntv(SegStart, SegStop);
1619*9880d681SAndroid Build Coastguard Worker }
1620*9880d681SAndroid Build Coastguard Worker
1621*9880d681SAndroid Build Coastguard Worker if (LREdit.empty()) {
1622*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "All uses were copies.\n");
1623*9880d681SAndroid Build Coastguard Worker return 0;
1624*9880d681SAndroid Build Coastguard Worker }
1625*9880d681SAndroid Build Coastguard Worker
1626*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> IntvMap;
1627*9880d681SAndroid Build Coastguard Worker SE->finish(&IntvMap);
1628*9880d681SAndroid Build Coastguard Worker DebugVars->splitRegister(VirtReg.reg, LREdit.regs(), *LIS);
1629*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
1630*9880d681SAndroid Build Coastguard Worker
1631*9880d681SAndroid Build Coastguard Worker // Assign all new registers to RS_Spill. This was the last chance.
1632*9880d681SAndroid Build Coastguard Worker setStage(LREdit.begin(), LREdit.end(), RS_Spill);
1633*9880d681SAndroid Build Coastguard Worker return 0;
1634*9880d681SAndroid Build Coastguard Worker }
1635*9880d681SAndroid Build Coastguard Worker
1636*9880d681SAndroid Build Coastguard Worker
1637*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1638*9880d681SAndroid Build Coastguard Worker // Local Splitting
1639*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1640*9880d681SAndroid Build Coastguard Worker
1641*9880d681SAndroid Build Coastguard Worker
1642*9880d681SAndroid Build Coastguard Worker /// calcGapWeights - Compute the maximum spill weight that needs to be evicted
1643*9880d681SAndroid Build Coastguard Worker /// in order to use PhysReg between two entries in SA->UseSlots.
1644*9880d681SAndroid Build Coastguard Worker ///
1645*9880d681SAndroid Build Coastguard Worker /// GapWeight[i] represents the gap between UseSlots[i] and UseSlots[i+1].
1646*9880d681SAndroid Build Coastguard Worker ///
calcGapWeights(unsigned PhysReg,SmallVectorImpl<float> & GapWeight)1647*9880d681SAndroid Build Coastguard Worker void RAGreedy::calcGapWeights(unsigned PhysReg,
1648*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<float> &GapWeight) {
1649*9880d681SAndroid Build Coastguard Worker assert(SA->getUseBlocks().size() == 1 && "Not a local interval");
1650*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1651*9880d681SAndroid Build Coastguard Worker ArrayRef<SlotIndex> Uses = SA->getUseSlots();
1652*9880d681SAndroid Build Coastguard Worker const unsigned NumGaps = Uses.size()-1;
1653*9880d681SAndroid Build Coastguard Worker
1654*9880d681SAndroid Build Coastguard Worker // Start and end points for the interference check.
1655*9880d681SAndroid Build Coastguard Worker SlotIndex StartIdx =
1656*9880d681SAndroid Build Coastguard Worker BI.LiveIn ? BI.FirstInstr.getBaseIndex() : BI.FirstInstr;
1657*9880d681SAndroid Build Coastguard Worker SlotIndex StopIdx =
1658*9880d681SAndroid Build Coastguard Worker BI.LiveOut ? BI.LastInstr.getBoundaryIndex() : BI.LastInstr;
1659*9880d681SAndroid Build Coastguard Worker
1660*9880d681SAndroid Build Coastguard Worker GapWeight.assign(NumGaps, 0.0f);
1661*9880d681SAndroid Build Coastguard Worker
1662*9880d681SAndroid Build Coastguard Worker // Add interference from each overlapping register.
1663*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
1664*9880d681SAndroid Build Coastguard Worker if (!Matrix->query(const_cast<LiveInterval&>(SA->getParent()), *Units)
1665*9880d681SAndroid Build Coastguard Worker .checkInterference())
1666*9880d681SAndroid Build Coastguard Worker continue;
1667*9880d681SAndroid Build Coastguard Worker
1668*9880d681SAndroid Build Coastguard Worker // We know that VirtReg is a continuous interval from FirstInstr to
1669*9880d681SAndroid Build Coastguard Worker // LastInstr, so we don't need InterferenceQuery.
1670*9880d681SAndroid Build Coastguard Worker //
1671*9880d681SAndroid Build Coastguard Worker // Interference that overlaps an instruction is counted in both gaps
1672*9880d681SAndroid Build Coastguard Worker // surrounding the instruction. The exception is interference before
1673*9880d681SAndroid Build Coastguard Worker // StartIdx and after StopIdx.
1674*9880d681SAndroid Build Coastguard Worker //
1675*9880d681SAndroid Build Coastguard Worker LiveIntervalUnion::SegmentIter IntI =
1676*9880d681SAndroid Build Coastguard Worker Matrix->getLiveUnions()[*Units] .find(StartIdx);
1677*9880d681SAndroid Build Coastguard Worker for (unsigned Gap = 0; IntI.valid() && IntI.start() < StopIdx; ++IntI) {
1678*9880d681SAndroid Build Coastguard Worker // Skip the gaps before IntI.
1679*9880d681SAndroid Build Coastguard Worker while (Uses[Gap+1].getBoundaryIndex() < IntI.start())
1680*9880d681SAndroid Build Coastguard Worker if (++Gap == NumGaps)
1681*9880d681SAndroid Build Coastguard Worker break;
1682*9880d681SAndroid Build Coastguard Worker if (Gap == NumGaps)
1683*9880d681SAndroid Build Coastguard Worker break;
1684*9880d681SAndroid Build Coastguard Worker
1685*9880d681SAndroid Build Coastguard Worker // Update the gaps covered by IntI.
1686*9880d681SAndroid Build Coastguard Worker const float weight = IntI.value()->weight;
1687*9880d681SAndroid Build Coastguard Worker for (; Gap != NumGaps; ++Gap) {
1688*9880d681SAndroid Build Coastguard Worker GapWeight[Gap] = std::max(GapWeight[Gap], weight);
1689*9880d681SAndroid Build Coastguard Worker if (Uses[Gap+1].getBaseIndex() >= IntI.stop())
1690*9880d681SAndroid Build Coastguard Worker break;
1691*9880d681SAndroid Build Coastguard Worker }
1692*9880d681SAndroid Build Coastguard Worker if (Gap == NumGaps)
1693*9880d681SAndroid Build Coastguard Worker break;
1694*9880d681SAndroid Build Coastguard Worker }
1695*9880d681SAndroid Build Coastguard Worker }
1696*9880d681SAndroid Build Coastguard Worker
1697*9880d681SAndroid Build Coastguard Worker // Add fixed interference.
1698*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
1699*9880d681SAndroid Build Coastguard Worker const LiveRange &LR = LIS->getRegUnit(*Units);
1700*9880d681SAndroid Build Coastguard Worker LiveRange::const_iterator I = LR.find(StartIdx);
1701*9880d681SAndroid Build Coastguard Worker LiveRange::const_iterator E = LR.end();
1702*9880d681SAndroid Build Coastguard Worker
1703*9880d681SAndroid Build Coastguard Worker // Same loop as above. Mark any overlapped gaps as HUGE_VALF.
1704*9880d681SAndroid Build Coastguard Worker for (unsigned Gap = 0; I != E && I->start < StopIdx; ++I) {
1705*9880d681SAndroid Build Coastguard Worker while (Uses[Gap+1].getBoundaryIndex() < I->start)
1706*9880d681SAndroid Build Coastguard Worker if (++Gap == NumGaps)
1707*9880d681SAndroid Build Coastguard Worker break;
1708*9880d681SAndroid Build Coastguard Worker if (Gap == NumGaps)
1709*9880d681SAndroid Build Coastguard Worker break;
1710*9880d681SAndroid Build Coastguard Worker
1711*9880d681SAndroid Build Coastguard Worker for (; Gap != NumGaps; ++Gap) {
1712*9880d681SAndroid Build Coastguard Worker GapWeight[Gap] = llvm::huge_valf;
1713*9880d681SAndroid Build Coastguard Worker if (Uses[Gap+1].getBaseIndex() >= I->end)
1714*9880d681SAndroid Build Coastguard Worker break;
1715*9880d681SAndroid Build Coastguard Worker }
1716*9880d681SAndroid Build Coastguard Worker if (Gap == NumGaps)
1717*9880d681SAndroid Build Coastguard Worker break;
1718*9880d681SAndroid Build Coastguard Worker }
1719*9880d681SAndroid Build Coastguard Worker }
1720*9880d681SAndroid Build Coastguard Worker }
1721*9880d681SAndroid Build Coastguard Worker
1722*9880d681SAndroid Build Coastguard Worker /// tryLocalSplit - Try to split VirtReg into smaller intervals inside its only
1723*9880d681SAndroid Build Coastguard Worker /// basic block.
1724*9880d681SAndroid Build Coastguard Worker ///
tryLocalSplit(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)1725*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order,
1726*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
1727*9880d681SAndroid Build Coastguard Worker assert(SA->getUseBlocks().size() == 1 && "Not a local interval");
1728*9880d681SAndroid Build Coastguard Worker const SplitAnalysis::BlockInfo &BI = SA->getUseBlocks().front();
1729*9880d681SAndroid Build Coastguard Worker
1730*9880d681SAndroid Build Coastguard Worker // Note that it is possible to have an interval that is live-in or live-out
1731*9880d681SAndroid Build Coastguard Worker // while only covering a single block - A phi-def can use undef values from
1732*9880d681SAndroid Build Coastguard Worker // predecessors, and the block could be a single-block loop.
1733*9880d681SAndroid Build Coastguard Worker // We don't bother doing anything clever about such a case, we simply assume
1734*9880d681SAndroid Build Coastguard Worker // that the interval is continuous from FirstInstr to LastInstr. We should
1735*9880d681SAndroid Build Coastguard Worker // make sure that we don't do anything illegal to such an interval, though.
1736*9880d681SAndroid Build Coastguard Worker
1737*9880d681SAndroid Build Coastguard Worker ArrayRef<SlotIndex> Uses = SA->getUseSlots();
1738*9880d681SAndroid Build Coastguard Worker if (Uses.size() <= 2)
1739*9880d681SAndroid Build Coastguard Worker return 0;
1740*9880d681SAndroid Build Coastguard Worker const unsigned NumGaps = Uses.size()-1;
1741*9880d681SAndroid Build Coastguard Worker
1742*9880d681SAndroid Build Coastguard Worker DEBUG({
1743*9880d681SAndroid Build Coastguard Worker dbgs() << "tryLocalSplit: ";
1744*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Uses.size(); i != e; ++i)
1745*9880d681SAndroid Build Coastguard Worker dbgs() << ' ' << Uses[i];
1746*9880d681SAndroid Build Coastguard Worker dbgs() << '\n';
1747*9880d681SAndroid Build Coastguard Worker });
1748*9880d681SAndroid Build Coastguard Worker
1749*9880d681SAndroid Build Coastguard Worker // If VirtReg is live across any register mask operands, compute a list of
1750*9880d681SAndroid Build Coastguard Worker // gaps with register masks.
1751*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> RegMaskGaps;
1752*9880d681SAndroid Build Coastguard Worker if (Matrix->checkRegMaskInterference(VirtReg)) {
1753*9880d681SAndroid Build Coastguard Worker // Get regmask slots for the whole block.
1754*9880d681SAndroid Build Coastguard Worker ArrayRef<SlotIndex> RMS = LIS->getRegMaskSlotsInBlock(BI.MBB->getNumber());
1755*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << RMS.size() << " regmasks in block:");
1756*9880d681SAndroid Build Coastguard Worker // Constrain to VirtReg's live range.
1757*9880d681SAndroid Build Coastguard Worker unsigned ri = std::lower_bound(RMS.begin(), RMS.end(),
1758*9880d681SAndroid Build Coastguard Worker Uses.front().getRegSlot()) - RMS.begin();
1759*9880d681SAndroid Build Coastguard Worker unsigned re = RMS.size();
1760*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != NumGaps && ri != re; ++i) {
1761*9880d681SAndroid Build Coastguard Worker // Look for Uses[i] <= RMS <= Uses[i+1].
1762*9880d681SAndroid Build Coastguard Worker assert(!SlotIndex::isEarlierInstr(RMS[ri], Uses[i]));
1763*9880d681SAndroid Build Coastguard Worker if (SlotIndex::isEarlierInstr(Uses[i+1], RMS[ri]))
1764*9880d681SAndroid Build Coastguard Worker continue;
1765*9880d681SAndroid Build Coastguard Worker // Skip a regmask on the same instruction as the last use. It doesn't
1766*9880d681SAndroid Build Coastguard Worker // overlap the live range.
1767*9880d681SAndroid Build Coastguard Worker if (SlotIndex::isSameInstr(Uses[i+1], RMS[ri]) && i+1 == NumGaps)
1768*9880d681SAndroid Build Coastguard Worker break;
1769*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << ' ' << RMS[ri] << ':' << Uses[i] << '-' << Uses[i+1]);
1770*9880d681SAndroid Build Coastguard Worker RegMaskGaps.push_back(i);
1771*9880d681SAndroid Build Coastguard Worker // Advance ri to the next gap. A regmask on one of the uses counts in
1772*9880d681SAndroid Build Coastguard Worker // both gaps.
1773*9880d681SAndroid Build Coastguard Worker while (ri != re && SlotIndex::isEarlierInstr(RMS[ri], Uses[i+1]))
1774*9880d681SAndroid Build Coastguard Worker ++ri;
1775*9880d681SAndroid Build Coastguard Worker }
1776*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << '\n');
1777*9880d681SAndroid Build Coastguard Worker }
1778*9880d681SAndroid Build Coastguard Worker
1779*9880d681SAndroid Build Coastguard Worker // Since we allow local split results to be split again, there is a risk of
1780*9880d681SAndroid Build Coastguard Worker // creating infinite loops. It is tempting to require that the new live
1781*9880d681SAndroid Build Coastguard Worker // ranges have less instructions than the original. That would guarantee
1782*9880d681SAndroid Build Coastguard Worker // convergence, but it is too strict. A live range with 3 instructions can be
1783*9880d681SAndroid Build Coastguard Worker // split 2+3 (including the COPY), and we want to allow that.
1784*9880d681SAndroid Build Coastguard Worker //
1785*9880d681SAndroid Build Coastguard Worker // Instead we use these rules:
1786*9880d681SAndroid Build Coastguard Worker //
1787*9880d681SAndroid Build Coastguard Worker // 1. Allow any split for ranges with getStage() < RS_Split2. (Except for the
1788*9880d681SAndroid Build Coastguard Worker // noop split, of course).
1789*9880d681SAndroid Build Coastguard Worker // 2. Require progress be made for ranges with getStage() == RS_Split2. All
1790*9880d681SAndroid Build Coastguard Worker // the new ranges must have fewer instructions than before the split.
1791*9880d681SAndroid Build Coastguard Worker // 3. New ranges with the same number of instructions are marked RS_Split2,
1792*9880d681SAndroid Build Coastguard Worker // smaller ranges are marked RS_New.
1793*9880d681SAndroid Build Coastguard Worker //
1794*9880d681SAndroid Build Coastguard Worker // These rules allow a 3 -> 2+3 split once, which we need. They also prevent
1795*9880d681SAndroid Build Coastguard Worker // excessive splitting and infinite loops.
1796*9880d681SAndroid Build Coastguard Worker //
1797*9880d681SAndroid Build Coastguard Worker bool ProgressRequired = getStage(VirtReg) >= RS_Split2;
1798*9880d681SAndroid Build Coastguard Worker
1799*9880d681SAndroid Build Coastguard Worker // Best split candidate.
1800*9880d681SAndroid Build Coastguard Worker unsigned BestBefore = NumGaps;
1801*9880d681SAndroid Build Coastguard Worker unsigned BestAfter = 0;
1802*9880d681SAndroid Build Coastguard Worker float BestDiff = 0;
1803*9880d681SAndroid Build Coastguard Worker
1804*9880d681SAndroid Build Coastguard Worker const float blockFreq =
1805*9880d681SAndroid Build Coastguard Worker SpillPlacer->getBlockFrequency(BI.MBB->getNumber()).getFrequency() *
1806*9880d681SAndroid Build Coastguard Worker (1.0f / MBFI->getEntryFreq());
1807*9880d681SAndroid Build Coastguard Worker SmallVector<float, 8> GapWeight;
1808*9880d681SAndroid Build Coastguard Worker
1809*9880d681SAndroid Build Coastguard Worker Order.rewind();
1810*9880d681SAndroid Build Coastguard Worker while (unsigned PhysReg = Order.next()) {
1811*9880d681SAndroid Build Coastguard Worker // Keep track of the largest spill weight that would need to be evicted in
1812*9880d681SAndroid Build Coastguard Worker // order to make use of PhysReg between UseSlots[i] and UseSlots[i+1].
1813*9880d681SAndroid Build Coastguard Worker calcGapWeights(PhysReg, GapWeight);
1814*9880d681SAndroid Build Coastguard Worker
1815*9880d681SAndroid Build Coastguard Worker // Remove any gaps with regmask clobbers.
1816*9880d681SAndroid Build Coastguard Worker if (Matrix->checkRegMaskInterference(VirtReg, PhysReg))
1817*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = RegMaskGaps.size(); i != e; ++i)
1818*9880d681SAndroid Build Coastguard Worker GapWeight[RegMaskGaps[i]] = llvm::huge_valf;
1819*9880d681SAndroid Build Coastguard Worker
1820*9880d681SAndroid Build Coastguard Worker // Try to find the best sequence of gaps to close.
1821*9880d681SAndroid Build Coastguard Worker // The new spill weight must be larger than any gap interference.
1822*9880d681SAndroid Build Coastguard Worker
1823*9880d681SAndroid Build Coastguard Worker // We will split before Uses[SplitBefore] and after Uses[SplitAfter].
1824*9880d681SAndroid Build Coastguard Worker unsigned SplitBefore = 0, SplitAfter = 1;
1825*9880d681SAndroid Build Coastguard Worker
1826*9880d681SAndroid Build Coastguard Worker // MaxGap should always be max(GapWeight[SplitBefore..SplitAfter-1]).
1827*9880d681SAndroid Build Coastguard Worker // It is the spill weight that needs to be evicted.
1828*9880d681SAndroid Build Coastguard Worker float MaxGap = GapWeight[0];
1829*9880d681SAndroid Build Coastguard Worker
1830*9880d681SAndroid Build Coastguard Worker for (;;) {
1831*9880d681SAndroid Build Coastguard Worker // Live before/after split?
1832*9880d681SAndroid Build Coastguard Worker const bool LiveBefore = SplitBefore != 0 || BI.LiveIn;
1833*9880d681SAndroid Build Coastguard Worker const bool LiveAfter = SplitAfter != NumGaps || BI.LiveOut;
1834*9880d681SAndroid Build Coastguard Worker
1835*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(PhysReg, TRI) << ' '
1836*9880d681SAndroid Build Coastguard Worker << Uses[SplitBefore] << '-' << Uses[SplitAfter]
1837*9880d681SAndroid Build Coastguard Worker << " i=" << MaxGap);
1838*9880d681SAndroid Build Coastguard Worker
1839*9880d681SAndroid Build Coastguard Worker // Stop before the interval gets so big we wouldn't be making progress.
1840*9880d681SAndroid Build Coastguard Worker if (!LiveBefore && !LiveAfter) {
1841*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " all\n");
1842*9880d681SAndroid Build Coastguard Worker break;
1843*9880d681SAndroid Build Coastguard Worker }
1844*9880d681SAndroid Build Coastguard Worker // Should the interval be extended or shrunk?
1845*9880d681SAndroid Build Coastguard Worker bool Shrink = true;
1846*9880d681SAndroid Build Coastguard Worker
1847*9880d681SAndroid Build Coastguard Worker // How many gaps would the new range have?
1848*9880d681SAndroid Build Coastguard Worker unsigned NewGaps = LiveBefore + SplitAfter - SplitBefore + LiveAfter;
1849*9880d681SAndroid Build Coastguard Worker
1850*9880d681SAndroid Build Coastguard Worker // Legally, without causing looping?
1851*9880d681SAndroid Build Coastguard Worker bool Legal = !ProgressRequired || NewGaps < NumGaps;
1852*9880d681SAndroid Build Coastguard Worker
1853*9880d681SAndroid Build Coastguard Worker if (Legal && MaxGap < llvm::huge_valf) {
1854*9880d681SAndroid Build Coastguard Worker // Estimate the new spill weight. Each instruction reads or writes the
1855*9880d681SAndroid Build Coastguard Worker // register. Conservatively assume there are no read-modify-write
1856*9880d681SAndroid Build Coastguard Worker // instructions.
1857*9880d681SAndroid Build Coastguard Worker //
1858*9880d681SAndroid Build Coastguard Worker // Try to guess the size of the new interval.
1859*9880d681SAndroid Build Coastguard Worker const float EstWeight = normalizeSpillWeight(
1860*9880d681SAndroid Build Coastguard Worker blockFreq * (NewGaps + 1),
1861*9880d681SAndroid Build Coastguard Worker Uses[SplitBefore].distance(Uses[SplitAfter]) +
1862*9880d681SAndroid Build Coastguard Worker (LiveBefore + LiveAfter) * SlotIndex::InstrDist,
1863*9880d681SAndroid Build Coastguard Worker 1);
1864*9880d681SAndroid Build Coastguard Worker // Would this split be possible to allocate?
1865*9880d681SAndroid Build Coastguard Worker // Never allocate all gaps, we wouldn't be making progress.
1866*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " w=" << EstWeight);
1867*9880d681SAndroid Build Coastguard Worker if (EstWeight * Hysteresis >= MaxGap) {
1868*9880d681SAndroid Build Coastguard Worker Shrink = false;
1869*9880d681SAndroid Build Coastguard Worker float Diff = EstWeight - MaxGap;
1870*9880d681SAndroid Build Coastguard Worker if (Diff > BestDiff) {
1871*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " (best)");
1872*9880d681SAndroid Build Coastguard Worker BestDiff = Hysteresis * Diff;
1873*9880d681SAndroid Build Coastguard Worker BestBefore = SplitBefore;
1874*9880d681SAndroid Build Coastguard Worker BestAfter = SplitAfter;
1875*9880d681SAndroid Build Coastguard Worker }
1876*9880d681SAndroid Build Coastguard Worker }
1877*9880d681SAndroid Build Coastguard Worker }
1878*9880d681SAndroid Build Coastguard Worker
1879*9880d681SAndroid Build Coastguard Worker // Try to shrink.
1880*9880d681SAndroid Build Coastguard Worker if (Shrink) {
1881*9880d681SAndroid Build Coastguard Worker if (++SplitBefore < SplitAfter) {
1882*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " shrink\n");
1883*9880d681SAndroid Build Coastguard Worker // Recompute the max when necessary.
1884*9880d681SAndroid Build Coastguard Worker if (GapWeight[SplitBefore - 1] >= MaxGap) {
1885*9880d681SAndroid Build Coastguard Worker MaxGap = GapWeight[SplitBefore];
1886*9880d681SAndroid Build Coastguard Worker for (unsigned i = SplitBefore + 1; i != SplitAfter; ++i)
1887*9880d681SAndroid Build Coastguard Worker MaxGap = std::max(MaxGap, GapWeight[i]);
1888*9880d681SAndroid Build Coastguard Worker }
1889*9880d681SAndroid Build Coastguard Worker continue;
1890*9880d681SAndroid Build Coastguard Worker }
1891*9880d681SAndroid Build Coastguard Worker MaxGap = 0;
1892*9880d681SAndroid Build Coastguard Worker }
1893*9880d681SAndroid Build Coastguard Worker
1894*9880d681SAndroid Build Coastguard Worker // Try to extend the interval.
1895*9880d681SAndroid Build Coastguard Worker if (SplitAfter >= NumGaps) {
1896*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " end\n");
1897*9880d681SAndroid Build Coastguard Worker break;
1898*9880d681SAndroid Build Coastguard Worker }
1899*9880d681SAndroid Build Coastguard Worker
1900*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << " extend\n");
1901*9880d681SAndroid Build Coastguard Worker MaxGap = std::max(MaxGap, GapWeight[SplitAfter++]);
1902*9880d681SAndroid Build Coastguard Worker }
1903*9880d681SAndroid Build Coastguard Worker }
1904*9880d681SAndroid Build Coastguard Worker
1905*9880d681SAndroid Build Coastguard Worker // Didn't find any candidates?
1906*9880d681SAndroid Build Coastguard Worker if (BestBefore == NumGaps)
1907*9880d681SAndroid Build Coastguard Worker return 0;
1908*9880d681SAndroid Build Coastguard Worker
1909*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Best local split range: " << Uses[BestBefore]
1910*9880d681SAndroid Build Coastguard Worker << '-' << Uses[BestAfter] << ", " << BestDiff
1911*9880d681SAndroid Build Coastguard Worker << ", " << (BestAfter - BestBefore + 1) << " instrs\n");
1912*9880d681SAndroid Build Coastguard Worker
1913*9880d681SAndroid Build Coastguard Worker LiveRangeEdit LREdit(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
1914*9880d681SAndroid Build Coastguard Worker SE->reset(LREdit);
1915*9880d681SAndroid Build Coastguard Worker
1916*9880d681SAndroid Build Coastguard Worker SE->openIntv();
1917*9880d681SAndroid Build Coastguard Worker SlotIndex SegStart = SE->enterIntvBefore(Uses[BestBefore]);
1918*9880d681SAndroid Build Coastguard Worker SlotIndex SegStop = SE->leaveIntvAfter(Uses[BestAfter]);
1919*9880d681SAndroid Build Coastguard Worker SE->useIntv(SegStart, SegStop);
1920*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 8> IntvMap;
1921*9880d681SAndroid Build Coastguard Worker SE->finish(&IntvMap);
1922*9880d681SAndroid Build Coastguard Worker DebugVars->splitRegister(VirtReg.reg, LREdit.regs(), *LIS);
1923*9880d681SAndroid Build Coastguard Worker
1924*9880d681SAndroid Build Coastguard Worker // If the new range has the same number of instructions as before, mark it as
1925*9880d681SAndroid Build Coastguard Worker // RS_Split2 so the next split will be forced to make progress. Otherwise,
1926*9880d681SAndroid Build Coastguard Worker // leave the new intervals as RS_New so they can compete.
1927*9880d681SAndroid Build Coastguard Worker bool LiveBefore = BestBefore != 0 || BI.LiveIn;
1928*9880d681SAndroid Build Coastguard Worker bool LiveAfter = BestAfter != NumGaps || BI.LiveOut;
1929*9880d681SAndroid Build Coastguard Worker unsigned NewGaps = LiveBefore + BestAfter - BestBefore + LiveAfter;
1930*9880d681SAndroid Build Coastguard Worker if (NewGaps >= NumGaps) {
1931*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Tagging non-progress ranges: ");
1932*9880d681SAndroid Build Coastguard Worker assert(!ProgressRequired && "Didn't make progress when it was required.");
1933*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = IntvMap.size(); i != e; ++i)
1934*9880d681SAndroid Build Coastguard Worker if (IntvMap[i] == 1) {
1935*9880d681SAndroid Build Coastguard Worker setStage(LIS->getInterval(LREdit.get(i)), RS_Split2);
1936*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(LREdit.get(i)));
1937*9880d681SAndroid Build Coastguard Worker }
1938*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << '\n');
1939*9880d681SAndroid Build Coastguard Worker }
1940*9880d681SAndroid Build Coastguard Worker ++NumLocalSplits;
1941*9880d681SAndroid Build Coastguard Worker
1942*9880d681SAndroid Build Coastguard Worker return 0;
1943*9880d681SAndroid Build Coastguard Worker }
1944*9880d681SAndroid Build Coastguard Worker
1945*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1946*9880d681SAndroid Build Coastguard Worker // Live Range Splitting
1947*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1948*9880d681SAndroid Build Coastguard Worker
1949*9880d681SAndroid Build Coastguard Worker /// trySplit - Try to split VirtReg or one of its interferences, making it
1950*9880d681SAndroid Build Coastguard Worker /// assignable.
1951*9880d681SAndroid Build Coastguard Worker /// @return Physreg when VirtReg may be assigned and/or new NewVRegs.
trySplit(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs)1952*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::trySplit(LiveInterval &VirtReg, AllocationOrder &Order,
1953*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned>&NewVRegs) {
1954*9880d681SAndroid Build Coastguard Worker // Ranges must be Split2 or less.
1955*9880d681SAndroid Build Coastguard Worker if (getStage(VirtReg) >= RS_Spill)
1956*9880d681SAndroid Build Coastguard Worker return 0;
1957*9880d681SAndroid Build Coastguard Worker
1958*9880d681SAndroid Build Coastguard Worker // Local intervals are handled separately.
1959*9880d681SAndroid Build Coastguard Worker if (LIS->intervalIsInOneMBB(VirtReg)) {
1960*9880d681SAndroid Build Coastguard Worker NamedRegionTimer T("Local Splitting", TimerGroupName, TimePassesIsEnabled);
1961*9880d681SAndroid Build Coastguard Worker SA->analyze(&VirtReg);
1962*9880d681SAndroid Build Coastguard Worker unsigned PhysReg = tryLocalSplit(VirtReg, Order, NewVRegs);
1963*9880d681SAndroid Build Coastguard Worker if (PhysReg || !NewVRegs.empty())
1964*9880d681SAndroid Build Coastguard Worker return PhysReg;
1965*9880d681SAndroid Build Coastguard Worker return tryInstructionSplit(VirtReg, Order, NewVRegs);
1966*9880d681SAndroid Build Coastguard Worker }
1967*9880d681SAndroid Build Coastguard Worker
1968*9880d681SAndroid Build Coastguard Worker NamedRegionTimer T("Global Splitting", TimerGroupName, TimePassesIsEnabled);
1969*9880d681SAndroid Build Coastguard Worker
1970*9880d681SAndroid Build Coastguard Worker SA->analyze(&VirtReg);
1971*9880d681SAndroid Build Coastguard Worker
1972*9880d681SAndroid Build Coastguard Worker // FIXME: SplitAnalysis may repair broken live ranges coming from the
1973*9880d681SAndroid Build Coastguard Worker // coalescer. That may cause the range to become allocatable which means that
1974*9880d681SAndroid Build Coastguard Worker // tryRegionSplit won't be making progress. This check should be replaced with
1975*9880d681SAndroid Build Coastguard Worker // an assertion when the coalescer is fixed.
1976*9880d681SAndroid Build Coastguard Worker if (SA->didRepairRange()) {
1977*9880d681SAndroid Build Coastguard Worker // VirtReg has changed, so all cached queries are invalid.
1978*9880d681SAndroid Build Coastguard Worker Matrix->invalidateVirtRegs();
1979*9880d681SAndroid Build Coastguard Worker if (unsigned PhysReg = tryAssign(VirtReg, Order, NewVRegs))
1980*9880d681SAndroid Build Coastguard Worker return PhysReg;
1981*9880d681SAndroid Build Coastguard Worker }
1982*9880d681SAndroid Build Coastguard Worker
1983*9880d681SAndroid Build Coastguard Worker // First try to split around a region spanning multiple blocks. RS_Split2
1984*9880d681SAndroid Build Coastguard Worker // ranges already made dubious progress with region splitting, so they go
1985*9880d681SAndroid Build Coastguard Worker // straight to single block splitting.
1986*9880d681SAndroid Build Coastguard Worker if (getStage(VirtReg) < RS_Split2) {
1987*9880d681SAndroid Build Coastguard Worker unsigned PhysReg = tryRegionSplit(VirtReg, Order, NewVRegs);
1988*9880d681SAndroid Build Coastguard Worker if (PhysReg || !NewVRegs.empty())
1989*9880d681SAndroid Build Coastguard Worker return PhysReg;
1990*9880d681SAndroid Build Coastguard Worker }
1991*9880d681SAndroid Build Coastguard Worker
1992*9880d681SAndroid Build Coastguard Worker // Then isolate blocks.
1993*9880d681SAndroid Build Coastguard Worker return tryBlockSplit(VirtReg, Order, NewVRegs);
1994*9880d681SAndroid Build Coastguard Worker }
1995*9880d681SAndroid Build Coastguard Worker
1996*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1997*9880d681SAndroid Build Coastguard Worker // Last Chance Recoloring
1998*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1999*9880d681SAndroid Build Coastguard Worker
2000*9880d681SAndroid Build Coastguard Worker /// mayRecolorAllInterferences - Check if the virtual registers that
2001*9880d681SAndroid Build Coastguard Worker /// interfere with \p VirtReg on \p PhysReg (or one of its aliases) may be
2002*9880d681SAndroid Build Coastguard Worker /// recolored to free \p PhysReg.
2003*9880d681SAndroid Build Coastguard Worker /// When true is returned, \p RecoloringCandidates has been augmented with all
2004*9880d681SAndroid Build Coastguard Worker /// the live intervals that need to be recolored in order to free \p PhysReg
2005*9880d681SAndroid Build Coastguard Worker /// for \p VirtReg.
2006*9880d681SAndroid Build Coastguard Worker /// \p FixedRegisters contains all the virtual registers that cannot be
2007*9880d681SAndroid Build Coastguard Worker /// recolored.
2008*9880d681SAndroid Build Coastguard Worker bool
mayRecolorAllInterferences(unsigned PhysReg,LiveInterval & VirtReg,SmallLISet & RecoloringCandidates,const SmallVirtRegSet & FixedRegisters)2009*9880d681SAndroid Build Coastguard Worker RAGreedy::mayRecolorAllInterferences(unsigned PhysReg, LiveInterval &VirtReg,
2010*9880d681SAndroid Build Coastguard Worker SmallLISet &RecoloringCandidates,
2011*9880d681SAndroid Build Coastguard Worker const SmallVirtRegSet &FixedRegisters) {
2012*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *CurRC = MRI->getRegClass(VirtReg.reg);
2013*9880d681SAndroid Build Coastguard Worker
2014*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator Units(PhysReg, TRI); Units.isValid(); ++Units) {
2015*9880d681SAndroid Build Coastguard Worker LiveIntervalUnion::Query &Q = Matrix->query(VirtReg, *Units);
2016*9880d681SAndroid Build Coastguard Worker // If there is LastChanceRecoloringMaxInterference or more interferences,
2017*9880d681SAndroid Build Coastguard Worker // chances are one would not be recolorable.
2018*9880d681SAndroid Build Coastguard Worker if (Q.collectInterferingVRegs(LastChanceRecoloringMaxInterference) >=
2019*9880d681SAndroid Build Coastguard Worker LastChanceRecoloringMaxInterference && !ExhaustiveSearch) {
2020*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Early abort: too many interferences.\n");
2021*9880d681SAndroid Build Coastguard Worker CutOffInfo |= CO_Interf;
2022*9880d681SAndroid Build Coastguard Worker return false;
2023*9880d681SAndroid Build Coastguard Worker }
2024*9880d681SAndroid Build Coastguard Worker for (unsigned i = Q.interferingVRegs().size(); i; --i) {
2025*9880d681SAndroid Build Coastguard Worker LiveInterval *Intf = Q.interferingVRegs()[i - 1];
2026*9880d681SAndroid Build Coastguard Worker // If Intf is done and sit on the same register class as VirtReg,
2027*9880d681SAndroid Build Coastguard Worker // it would not be recolorable as it is in the same state as VirtReg.
2028*9880d681SAndroid Build Coastguard Worker if ((getStage(*Intf) == RS_Done &&
2029*9880d681SAndroid Build Coastguard Worker MRI->getRegClass(Intf->reg) == CurRC) ||
2030*9880d681SAndroid Build Coastguard Worker FixedRegisters.count(Intf->reg)) {
2031*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Early abort: the inteference is not recolorable.\n");
2032*9880d681SAndroid Build Coastguard Worker return false;
2033*9880d681SAndroid Build Coastguard Worker }
2034*9880d681SAndroid Build Coastguard Worker RecoloringCandidates.insert(Intf);
2035*9880d681SAndroid Build Coastguard Worker }
2036*9880d681SAndroid Build Coastguard Worker }
2037*9880d681SAndroid Build Coastguard Worker return true;
2038*9880d681SAndroid Build Coastguard Worker }
2039*9880d681SAndroid Build Coastguard Worker
2040*9880d681SAndroid Build Coastguard Worker /// tryLastChanceRecoloring - Try to assign a color to \p VirtReg by recoloring
2041*9880d681SAndroid Build Coastguard Worker /// its interferences.
2042*9880d681SAndroid Build Coastguard Worker /// Last chance recoloring chooses a color for \p VirtReg and recolors every
2043*9880d681SAndroid Build Coastguard Worker /// virtual register that was using it. The recoloring process may recursively
2044*9880d681SAndroid Build Coastguard Worker /// use the last chance recoloring. Therefore, when a virtual register has been
2045*9880d681SAndroid Build Coastguard Worker /// assigned a color by this mechanism, it is marked as Fixed, i.e., it cannot
2046*9880d681SAndroid Build Coastguard Worker /// be last-chance-recolored again during this recoloring "session".
2047*9880d681SAndroid Build Coastguard Worker /// E.g.,
2048*9880d681SAndroid Build Coastguard Worker /// Let
2049*9880d681SAndroid Build Coastguard Worker /// vA can use {R1, R2 }
2050*9880d681SAndroid Build Coastguard Worker /// vB can use { R2, R3}
2051*9880d681SAndroid Build Coastguard Worker /// vC can use {R1 }
2052*9880d681SAndroid Build Coastguard Worker /// Where vA, vB, and vC cannot be split anymore (they are reloads for
2053*9880d681SAndroid Build Coastguard Worker /// instance) and they all interfere.
2054*9880d681SAndroid Build Coastguard Worker ///
2055*9880d681SAndroid Build Coastguard Worker /// vA is assigned R1
2056*9880d681SAndroid Build Coastguard Worker /// vB is assigned R2
2057*9880d681SAndroid Build Coastguard Worker /// vC tries to evict vA but vA is already done.
2058*9880d681SAndroid Build Coastguard Worker /// Regular register allocation fails.
2059*9880d681SAndroid Build Coastguard Worker ///
2060*9880d681SAndroid Build Coastguard Worker /// Last chance recoloring kicks in:
2061*9880d681SAndroid Build Coastguard Worker /// vC does as if vA was evicted => vC uses R1.
2062*9880d681SAndroid Build Coastguard Worker /// vC is marked as fixed.
2063*9880d681SAndroid Build Coastguard Worker /// vA needs to find a color.
2064*9880d681SAndroid Build Coastguard Worker /// None are available.
2065*9880d681SAndroid Build Coastguard Worker /// vA cannot evict vC: vC is a fixed virtual register now.
2066*9880d681SAndroid Build Coastguard Worker /// vA does as if vB was evicted => vA uses R2.
2067*9880d681SAndroid Build Coastguard Worker /// vB needs to find a color.
2068*9880d681SAndroid Build Coastguard Worker /// R3 is available.
2069*9880d681SAndroid Build Coastguard Worker /// Recoloring => vC = R1, vA = R2, vB = R3
2070*9880d681SAndroid Build Coastguard Worker ///
2071*9880d681SAndroid Build Coastguard Worker /// \p Order defines the preferred allocation order for \p VirtReg.
2072*9880d681SAndroid Build Coastguard Worker /// \p NewRegs will contain any new virtual register that have been created
2073*9880d681SAndroid Build Coastguard Worker /// (split, spill) during the process and that must be assigned.
2074*9880d681SAndroid Build Coastguard Worker /// \p FixedRegisters contains all the virtual registers that cannot be
2075*9880d681SAndroid Build Coastguard Worker /// recolored.
2076*9880d681SAndroid Build Coastguard Worker /// \p Depth gives the current depth of the last chance recoloring.
2077*9880d681SAndroid Build Coastguard Worker /// \return a physical register that can be used for VirtReg or ~0u if none
2078*9880d681SAndroid Build Coastguard Worker /// exists.
tryLastChanceRecoloring(LiveInterval & VirtReg,AllocationOrder & Order,SmallVectorImpl<unsigned> & NewVRegs,SmallVirtRegSet & FixedRegisters,unsigned Depth)2079*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryLastChanceRecoloring(LiveInterval &VirtReg,
2080*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
2081*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs,
2082*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &FixedRegisters,
2083*9880d681SAndroid Build Coastguard Worker unsigned Depth) {
2084*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Try last chance recoloring for " << VirtReg << '\n');
2085*9880d681SAndroid Build Coastguard Worker // Ranges must be Done.
2086*9880d681SAndroid Build Coastguard Worker assert((getStage(VirtReg) >= RS_Done || !VirtReg.isSpillable()) &&
2087*9880d681SAndroid Build Coastguard Worker "Last chance recoloring should really be last chance");
2088*9880d681SAndroid Build Coastguard Worker // Set the max depth to LastChanceRecoloringMaxDepth.
2089*9880d681SAndroid Build Coastguard Worker // We may want to reconsider that if we end up with a too large search space
2090*9880d681SAndroid Build Coastguard Worker // for target with hundreds of registers.
2091*9880d681SAndroid Build Coastguard Worker // Indeed, in that case we may want to cut the search space earlier.
2092*9880d681SAndroid Build Coastguard Worker if (Depth >= LastChanceRecoloringMaxDepth && !ExhaustiveSearch) {
2093*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Abort because max depth has been reached.\n");
2094*9880d681SAndroid Build Coastguard Worker CutOffInfo |= CO_Depth;
2095*9880d681SAndroid Build Coastguard Worker return ~0u;
2096*9880d681SAndroid Build Coastguard Worker }
2097*9880d681SAndroid Build Coastguard Worker
2098*9880d681SAndroid Build Coastguard Worker // Set of Live intervals that will need to be recolored.
2099*9880d681SAndroid Build Coastguard Worker SmallLISet RecoloringCandidates;
2100*9880d681SAndroid Build Coastguard Worker // Record the original mapping virtual register to physical register in case
2101*9880d681SAndroid Build Coastguard Worker // the recoloring fails.
2102*9880d681SAndroid Build Coastguard Worker DenseMap<unsigned, unsigned> VirtRegToPhysReg;
2103*9880d681SAndroid Build Coastguard Worker // Mark VirtReg as fixed, i.e., it will not be recolored pass this point in
2104*9880d681SAndroid Build Coastguard Worker // this recoloring "session".
2105*9880d681SAndroid Build Coastguard Worker FixedRegisters.insert(VirtReg.reg);
2106*9880d681SAndroid Build Coastguard Worker
2107*9880d681SAndroid Build Coastguard Worker Order.rewind();
2108*9880d681SAndroid Build Coastguard Worker while (unsigned PhysReg = Order.next()) {
2109*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Try to assign: " << VirtReg << " to "
2110*9880d681SAndroid Build Coastguard Worker << PrintReg(PhysReg, TRI) << '\n');
2111*9880d681SAndroid Build Coastguard Worker RecoloringCandidates.clear();
2112*9880d681SAndroid Build Coastguard Worker VirtRegToPhysReg.clear();
2113*9880d681SAndroid Build Coastguard Worker
2114*9880d681SAndroid Build Coastguard Worker // It is only possible to recolor virtual register interference.
2115*9880d681SAndroid Build Coastguard Worker if (Matrix->checkInterference(VirtReg, PhysReg) >
2116*9880d681SAndroid Build Coastguard Worker LiveRegMatrix::IK_VirtReg) {
2117*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Some inteferences are not with virtual registers.\n");
2118*9880d681SAndroid Build Coastguard Worker
2119*9880d681SAndroid Build Coastguard Worker continue;
2120*9880d681SAndroid Build Coastguard Worker }
2121*9880d681SAndroid Build Coastguard Worker
2122*9880d681SAndroid Build Coastguard Worker // Early give up on this PhysReg if it is obvious we cannot recolor all
2123*9880d681SAndroid Build Coastguard Worker // the interferences.
2124*9880d681SAndroid Build Coastguard Worker if (!mayRecolorAllInterferences(PhysReg, VirtReg, RecoloringCandidates,
2125*9880d681SAndroid Build Coastguard Worker FixedRegisters)) {
2126*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Some inteferences cannot be recolored.\n");
2127*9880d681SAndroid Build Coastguard Worker continue;
2128*9880d681SAndroid Build Coastguard Worker }
2129*9880d681SAndroid Build Coastguard Worker
2130*9880d681SAndroid Build Coastguard Worker // RecoloringCandidates contains all the virtual registers that interfer
2131*9880d681SAndroid Build Coastguard Worker // with VirtReg on PhysReg (or one of its aliases).
2132*9880d681SAndroid Build Coastguard Worker // Enqueue them for recoloring and perform the actual recoloring.
2133*9880d681SAndroid Build Coastguard Worker PQueue RecoloringQueue;
2134*9880d681SAndroid Build Coastguard Worker for (SmallLISet::iterator It = RecoloringCandidates.begin(),
2135*9880d681SAndroid Build Coastguard Worker EndIt = RecoloringCandidates.end();
2136*9880d681SAndroid Build Coastguard Worker It != EndIt; ++It) {
2137*9880d681SAndroid Build Coastguard Worker unsigned ItVirtReg = (*It)->reg;
2138*9880d681SAndroid Build Coastguard Worker enqueue(RecoloringQueue, *It);
2139*9880d681SAndroid Build Coastguard Worker assert(VRM->hasPhys(ItVirtReg) &&
2140*9880d681SAndroid Build Coastguard Worker "Interferences are supposed to be with allocated vairables");
2141*9880d681SAndroid Build Coastguard Worker
2142*9880d681SAndroid Build Coastguard Worker // Record the current allocation.
2143*9880d681SAndroid Build Coastguard Worker VirtRegToPhysReg[ItVirtReg] = VRM->getPhys(ItVirtReg);
2144*9880d681SAndroid Build Coastguard Worker // unset the related struct.
2145*9880d681SAndroid Build Coastguard Worker Matrix->unassign(**It);
2146*9880d681SAndroid Build Coastguard Worker }
2147*9880d681SAndroid Build Coastguard Worker
2148*9880d681SAndroid Build Coastguard Worker // Do as if VirtReg was assigned to PhysReg so that the underlying
2149*9880d681SAndroid Build Coastguard Worker // recoloring has the right information about the interferes and
2150*9880d681SAndroid Build Coastguard Worker // available colors.
2151*9880d681SAndroid Build Coastguard Worker Matrix->assign(VirtReg, PhysReg);
2152*9880d681SAndroid Build Coastguard Worker
2153*9880d681SAndroid Build Coastguard Worker // Save the current recoloring state.
2154*9880d681SAndroid Build Coastguard Worker // If we cannot recolor all the interferences, we will have to start again
2155*9880d681SAndroid Build Coastguard Worker // at this point for the next physical register.
2156*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet SaveFixedRegisters(FixedRegisters);
2157*9880d681SAndroid Build Coastguard Worker if (tryRecoloringCandidates(RecoloringQueue, NewVRegs, FixedRegisters,
2158*9880d681SAndroid Build Coastguard Worker Depth)) {
2159*9880d681SAndroid Build Coastguard Worker // Do not mess up with the global assignment process.
2160*9880d681SAndroid Build Coastguard Worker // I.e., VirtReg must be unassigned.
2161*9880d681SAndroid Build Coastguard Worker Matrix->unassign(VirtReg);
2162*9880d681SAndroid Build Coastguard Worker return PhysReg;
2163*9880d681SAndroid Build Coastguard Worker }
2164*9880d681SAndroid Build Coastguard Worker
2165*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Fail to assign: " << VirtReg << " to "
2166*9880d681SAndroid Build Coastguard Worker << PrintReg(PhysReg, TRI) << '\n');
2167*9880d681SAndroid Build Coastguard Worker
2168*9880d681SAndroid Build Coastguard Worker // The recoloring attempt failed, undo the changes.
2169*9880d681SAndroid Build Coastguard Worker FixedRegisters = SaveFixedRegisters;
2170*9880d681SAndroid Build Coastguard Worker Matrix->unassign(VirtReg);
2171*9880d681SAndroid Build Coastguard Worker
2172*9880d681SAndroid Build Coastguard Worker for (SmallLISet::iterator It = RecoloringCandidates.begin(),
2173*9880d681SAndroid Build Coastguard Worker EndIt = RecoloringCandidates.end();
2174*9880d681SAndroid Build Coastguard Worker It != EndIt; ++It) {
2175*9880d681SAndroid Build Coastguard Worker unsigned ItVirtReg = (*It)->reg;
2176*9880d681SAndroid Build Coastguard Worker if (VRM->hasPhys(ItVirtReg))
2177*9880d681SAndroid Build Coastguard Worker Matrix->unassign(**It);
2178*9880d681SAndroid Build Coastguard Worker unsigned ItPhysReg = VirtRegToPhysReg[ItVirtReg];
2179*9880d681SAndroid Build Coastguard Worker Matrix->assign(**It, ItPhysReg);
2180*9880d681SAndroid Build Coastguard Worker }
2181*9880d681SAndroid Build Coastguard Worker }
2182*9880d681SAndroid Build Coastguard Worker
2183*9880d681SAndroid Build Coastguard Worker // Last chance recoloring did not worked either, give up.
2184*9880d681SAndroid Build Coastguard Worker return ~0u;
2185*9880d681SAndroid Build Coastguard Worker }
2186*9880d681SAndroid Build Coastguard Worker
2187*9880d681SAndroid Build Coastguard Worker /// tryRecoloringCandidates - Try to assign a new color to every register
2188*9880d681SAndroid Build Coastguard Worker /// in \RecoloringQueue.
2189*9880d681SAndroid Build Coastguard Worker /// \p NewRegs will contain any new virtual register created during the
2190*9880d681SAndroid Build Coastguard Worker /// recoloring process.
2191*9880d681SAndroid Build Coastguard Worker /// \p FixedRegisters[in/out] contains all the registers that have been
2192*9880d681SAndroid Build Coastguard Worker /// recolored.
2193*9880d681SAndroid Build Coastguard Worker /// \return true if all virtual registers in RecoloringQueue were successfully
2194*9880d681SAndroid Build Coastguard Worker /// recolored, false otherwise.
tryRecoloringCandidates(PQueue & RecoloringQueue,SmallVectorImpl<unsigned> & NewVRegs,SmallVirtRegSet & FixedRegisters,unsigned Depth)2195*9880d681SAndroid Build Coastguard Worker bool RAGreedy::tryRecoloringCandidates(PQueue &RecoloringQueue,
2196*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs,
2197*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &FixedRegisters,
2198*9880d681SAndroid Build Coastguard Worker unsigned Depth) {
2199*9880d681SAndroid Build Coastguard Worker while (!RecoloringQueue.empty()) {
2200*9880d681SAndroid Build Coastguard Worker LiveInterval *LI = dequeue(RecoloringQueue);
2201*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Try to recolor: " << *LI << '\n');
2202*9880d681SAndroid Build Coastguard Worker unsigned PhysReg;
2203*9880d681SAndroid Build Coastguard Worker PhysReg = selectOrSplitImpl(*LI, NewVRegs, FixedRegisters, Depth + 1);
2204*9880d681SAndroid Build Coastguard Worker if (PhysReg == ~0u || !PhysReg)
2205*9880d681SAndroid Build Coastguard Worker return false;
2206*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Recoloring of " << *LI
2207*9880d681SAndroid Build Coastguard Worker << " succeeded with: " << PrintReg(PhysReg, TRI) << '\n');
2208*9880d681SAndroid Build Coastguard Worker Matrix->assign(*LI, PhysReg);
2209*9880d681SAndroid Build Coastguard Worker FixedRegisters.insert(LI->reg);
2210*9880d681SAndroid Build Coastguard Worker }
2211*9880d681SAndroid Build Coastguard Worker return true;
2212*9880d681SAndroid Build Coastguard Worker }
2213*9880d681SAndroid Build Coastguard Worker
2214*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2215*9880d681SAndroid Build Coastguard Worker // Main Entry Point
2216*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2217*9880d681SAndroid Build Coastguard Worker
selectOrSplit(LiveInterval & VirtReg,SmallVectorImpl<unsigned> & NewVRegs)2218*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
2219*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
2220*9880d681SAndroid Build Coastguard Worker CutOffInfo = CO_None;
2221*9880d681SAndroid Build Coastguard Worker LLVMContext &Ctx = MF->getFunction()->getContext();
2222*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet FixedRegisters;
2223*9880d681SAndroid Build Coastguard Worker unsigned Reg = selectOrSplitImpl(VirtReg, NewVRegs, FixedRegisters);
2224*9880d681SAndroid Build Coastguard Worker if (Reg == ~0U && (CutOffInfo != CO_None)) {
2225*9880d681SAndroid Build Coastguard Worker uint8_t CutOffEncountered = CutOffInfo & (CO_Depth | CO_Interf);
2226*9880d681SAndroid Build Coastguard Worker if (CutOffEncountered == CO_Depth)
2227*9880d681SAndroid Build Coastguard Worker Ctx.emitError("register allocation failed: maximum depth for recoloring "
2228*9880d681SAndroid Build Coastguard Worker "reached. Use -fexhaustive-register-search to skip "
2229*9880d681SAndroid Build Coastguard Worker "cutoffs");
2230*9880d681SAndroid Build Coastguard Worker else if (CutOffEncountered == CO_Interf)
2231*9880d681SAndroid Build Coastguard Worker Ctx.emitError("register allocation failed: maximum interference for "
2232*9880d681SAndroid Build Coastguard Worker "recoloring reached. Use -fexhaustive-register-search "
2233*9880d681SAndroid Build Coastguard Worker "to skip cutoffs");
2234*9880d681SAndroid Build Coastguard Worker else if (CutOffEncountered == (CO_Depth | CO_Interf))
2235*9880d681SAndroid Build Coastguard Worker Ctx.emitError("register allocation failed: maximum interference and "
2236*9880d681SAndroid Build Coastguard Worker "depth for recoloring reached. Use "
2237*9880d681SAndroid Build Coastguard Worker "-fexhaustive-register-search to skip cutoffs");
2238*9880d681SAndroid Build Coastguard Worker }
2239*9880d681SAndroid Build Coastguard Worker return Reg;
2240*9880d681SAndroid Build Coastguard Worker }
2241*9880d681SAndroid Build Coastguard Worker
2242*9880d681SAndroid Build Coastguard Worker /// Using a CSR for the first time has a cost because it causes push|pop
2243*9880d681SAndroid Build Coastguard Worker /// to be added to prologue|epilogue. Splitting a cold section of the live
2244*9880d681SAndroid Build Coastguard Worker /// range can have lower cost than using the CSR for the first time;
2245*9880d681SAndroid Build Coastguard Worker /// Spilling a live range in the cold path can have lower cost than using
2246*9880d681SAndroid Build Coastguard Worker /// the CSR for the first time. Returns the physical register if we decide
2247*9880d681SAndroid Build Coastguard Worker /// to use the CSR; otherwise return 0.
tryAssignCSRFirstTime(LiveInterval & VirtReg,AllocationOrder & Order,unsigned PhysReg,unsigned & CostPerUseLimit,SmallVectorImpl<unsigned> & NewVRegs)2248*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::tryAssignCSRFirstTime(LiveInterval &VirtReg,
2249*9880d681SAndroid Build Coastguard Worker AllocationOrder &Order,
2250*9880d681SAndroid Build Coastguard Worker unsigned PhysReg,
2251*9880d681SAndroid Build Coastguard Worker unsigned &CostPerUseLimit,
2252*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs) {
2253*9880d681SAndroid Build Coastguard Worker if (getStage(VirtReg) == RS_Spill && VirtReg.isSpillable()) {
2254*9880d681SAndroid Build Coastguard Worker // We choose spill over using the CSR for the first time if the spill cost
2255*9880d681SAndroid Build Coastguard Worker // is lower than CSRCost.
2256*9880d681SAndroid Build Coastguard Worker SA->analyze(&VirtReg);
2257*9880d681SAndroid Build Coastguard Worker if (calcSpillCost() >= CSRCost)
2258*9880d681SAndroid Build Coastguard Worker return PhysReg;
2259*9880d681SAndroid Build Coastguard Worker
2260*9880d681SAndroid Build Coastguard Worker // We are going to spill, set CostPerUseLimit to 1 to make sure that
2261*9880d681SAndroid Build Coastguard Worker // we will not use a callee-saved register in tryEvict.
2262*9880d681SAndroid Build Coastguard Worker CostPerUseLimit = 1;
2263*9880d681SAndroid Build Coastguard Worker return 0;
2264*9880d681SAndroid Build Coastguard Worker }
2265*9880d681SAndroid Build Coastguard Worker if (getStage(VirtReg) < RS_Split) {
2266*9880d681SAndroid Build Coastguard Worker // We choose pre-splitting over using the CSR for the first time if
2267*9880d681SAndroid Build Coastguard Worker // the cost of splitting is lower than CSRCost.
2268*9880d681SAndroid Build Coastguard Worker SA->analyze(&VirtReg);
2269*9880d681SAndroid Build Coastguard Worker unsigned NumCands = 0;
2270*9880d681SAndroid Build Coastguard Worker BlockFrequency BestCost = CSRCost; // Don't modify CSRCost.
2271*9880d681SAndroid Build Coastguard Worker unsigned BestCand = calculateRegionSplitCost(VirtReg, Order, BestCost,
2272*9880d681SAndroid Build Coastguard Worker NumCands, true /*IgnoreCSR*/);
2273*9880d681SAndroid Build Coastguard Worker if (BestCand == NoCand)
2274*9880d681SAndroid Build Coastguard Worker // Use the CSR if we can't find a region split below CSRCost.
2275*9880d681SAndroid Build Coastguard Worker return PhysReg;
2276*9880d681SAndroid Build Coastguard Worker
2277*9880d681SAndroid Build Coastguard Worker // Perform the actual pre-splitting.
2278*9880d681SAndroid Build Coastguard Worker doRegionSplit(VirtReg, BestCand, false/*HasCompact*/, NewVRegs);
2279*9880d681SAndroid Build Coastguard Worker return 0;
2280*9880d681SAndroid Build Coastguard Worker }
2281*9880d681SAndroid Build Coastguard Worker return PhysReg;
2282*9880d681SAndroid Build Coastguard Worker }
2283*9880d681SAndroid Build Coastguard Worker
aboutToRemoveInterval(LiveInterval & LI)2284*9880d681SAndroid Build Coastguard Worker void RAGreedy::aboutToRemoveInterval(LiveInterval &LI) {
2285*9880d681SAndroid Build Coastguard Worker // Do not keep invalid information around.
2286*9880d681SAndroid Build Coastguard Worker SetOfBrokenHints.remove(&LI);
2287*9880d681SAndroid Build Coastguard Worker }
2288*9880d681SAndroid Build Coastguard Worker
initializeCSRCost()2289*9880d681SAndroid Build Coastguard Worker void RAGreedy::initializeCSRCost() {
2290*9880d681SAndroid Build Coastguard Worker // We use the larger one out of the command-line option and the value report
2291*9880d681SAndroid Build Coastguard Worker // by TRI.
2292*9880d681SAndroid Build Coastguard Worker CSRCost = BlockFrequency(
2293*9880d681SAndroid Build Coastguard Worker std::max((unsigned)CSRFirstTimeCost, TRI->getCSRFirstUseCost()));
2294*9880d681SAndroid Build Coastguard Worker if (!CSRCost.getFrequency())
2295*9880d681SAndroid Build Coastguard Worker return;
2296*9880d681SAndroid Build Coastguard Worker
2297*9880d681SAndroid Build Coastguard Worker // Raw cost is relative to Entry == 2^14; scale it appropriately.
2298*9880d681SAndroid Build Coastguard Worker uint64_t ActualEntry = MBFI->getEntryFreq();
2299*9880d681SAndroid Build Coastguard Worker if (!ActualEntry) {
2300*9880d681SAndroid Build Coastguard Worker CSRCost = 0;
2301*9880d681SAndroid Build Coastguard Worker return;
2302*9880d681SAndroid Build Coastguard Worker }
2303*9880d681SAndroid Build Coastguard Worker uint64_t FixedEntry = 1 << 14;
2304*9880d681SAndroid Build Coastguard Worker if (ActualEntry < FixedEntry)
2305*9880d681SAndroid Build Coastguard Worker CSRCost *= BranchProbability(ActualEntry, FixedEntry);
2306*9880d681SAndroid Build Coastguard Worker else if (ActualEntry <= UINT32_MAX)
2307*9880d681SAndroid Build Coastguard Worker // Invert the fraction and divide.
2308*9880d681SAndroid Build Coastguard Worker CSRCost /= BranchProbability(FixedEntry, ActualEntry);
2309*9880d681SAndroid Build Coastguard Worker else
2310*9880d681SAndroid Build Coastguard Worker // Can't use BranchProbability in general, since it takes 32-bit numbers.
2311*9880d681SAndroid Build Coastguard Worker CSRCost = CSRCost.getFrequency() * (ActualEntry / FixedEntry);
2312*9880d681SAndroid Build Coastguard Worker }
2313*9880d681SAndroid Build Coastguard Worker
2314*9880d681SAndroid Build Coastguard Worker /// \brief Collect the hint info for \p Reg.
2315*9880d681SAndroid Build Coastguard Worker /// The results are stored into \p Out.
2316*9880d681SAndroid Build Coastguard Worker /// \p Out is not cleared before being populated.
collectHintInfo(unsigned Reg,HintsInfo & Out)2317*9880d681SAndroid Build Coastguard Worker void RAGreedy::collectHintInfo(unsigned Reg, HintsInfo &Out) {
2318*9880d681SAndroid Build Coastguard Worker for (const MachineInstr &Instr : MRI->reg_nodbg_instructions(Reg)) {
2319*9880d681SAndroid Build Coastguard Worker if (!Instr.isFullCopy())
2320*9880d681SAndroid Build Coastguard Worker continue;
2321*9880d681SAndroid Build Coastguard Worker // Look for the other end of the copy.
2322*9880d681SAndroid Build Coastguard Worker unsigned OtherReg = Instr.getOperand(0).getReg();
2323*9880d681SAndroid Build Coastguard Worker if (OtherReg == Reg) {
2324*9880d681SAndroid Build Coastguard Worker OtherReg = Instr.getOperand(1).getReg();
2325*9880d681SAndroid Build Coastguard Worker if (OtherReg == Reg)
2326*9880d681SAndroid Build Coastguard Worker continue;
2327*9880d681SAndroid Build Coastguard Worker }
2328*9880d681SAndroid Build Coastguard Worker // Get the current assignment.
2329*9880d681SAndroid Build Coastguard Worker unsigned OtherPhysReg = TargetRegisterInfo::isPhysicalRegister(OtherReg)
2330*9880d681SAndroid Build Coastguard Worker ? OtherReg
2331*9880d681SAndroid Build Coastguard Worker : VRM->getPhys(OtherReg);
2332*9880d681SAndroid Build Coastguard Worker // Push the collected information.
2333*9880d681SAndroid Build Coastguard Worker Out.push_back(HintInfo(MBFI->getBlockFreq(Instr.getParent()), OtherReg,
2334*9880d681SAndroid Build Coastguard Worker OtherPhysReg));
2335*9880d681SAndroid Build Coastguard Worker }
2336*9880d681SAndroid Build Coastguard Worker }
2337*9880d681SAndroid Build Coastguard Worker
2338*9880d681SAndroid Build Coastguard Worker /// \brief Using the given \p List, compute the cost of the broken hints if
2339*9880d681SAndroid Build Coastguard Worker /// \p PhysReg was used.
2340*9880d681SAndroid Build Coastguard Worker /// \return The cost of \p List for \p PhysReg.
getBrokenHintFreq(const HintsInfo & List,unsigned PhysReg)2341*9880d681SAndroid Build Coastguard Worker BlockFrequency RAGreedy::getBrokenHintFreq(const HintsInfo &List,
2342*9880d681SAndroid Build Coastguard Worker unsigned PhysReg) {
2343*9880d681SAndroid Build Coastguard Worker BlockFrequency Cost = 0;
2344*9880d681SAndroid Build Coastguard Worker for (const HintInfo &Info : List) {
2345*9880d681SAndroid Build Coastguard Worker if (Info.PhysReg != PhysReg)
2346*9880d681SAndroid Build Coastguard Worker Cost += Info.Freq;
2347*9880d681SAndroid Build Coastguard Worker }
2348*9880d681SAndroid Build Coastguard Worker return Cost;
2349*9880d681SAndroid Build Coastguard Worker }
2350*9880d681SAndroid Build Coastguard Worker
2351*9880d681SAndroid Build Coastguard Worker /// \brief Using the register assigned to \p VirtReg, try to recolor
2352*9880d681SAndroid Build Coastguard Worker /// all the live ranges that are copy-related with \p VirtReg.
2353*9880d681SAndroid Build Coastguard Worker /// The recoloring is then propagated to all the live-ranges that have
2354*9880d681SAndroid Build Coastguard Worker /// been recolored and so on, until no more copies can be coalesced or
2355*9880d681SAndroid Build Coastguard Worker /// it is not profitable.
2356*9880d681SAndroid Build Coastguard Worker /// For a given live range, profitability is determined by the sum of the
2357*9880d681SAndroid Build Coastguard Worker /// frequencies of the non-identity copies it would introduce with the old
2358*9880d681SAndroid Build Coastguard Worker /// and new register.
tryHintRecoloring(LiveInterval & VirtReg)2359*9880d681SAndroid Build Coastguard Worker void RAGreedy::tryHintRecoloring(LiveInterval &VirtReg) {
2360*9880d681SAndroid Build Coastguard Worker // We have a broken hint, check if it is possible to fix it by
2361*9880d681SAndroid Build Coastguard Worker // reusing PhysReg for the copy-related live-ranges. Indeed, we evicted
2362*9880d681SAndroid Build Coastguard Worker // some register and PhysReg may be available for the other live-ranges.
2363*9880d681SAndroid Build Coastguard Worker SmallSet<unsigned, 4> Visited;
2364*9880d681SAndroid Build Coastguard Worker SmallVector<unsigned, 2> RecoloringCandidates;
2365*9880d681SAndroid Build Coastguard Worker HintsInfo Info;
2366*9880d681SAndroid Build Coastguard Worker unsigned Reg = VirtReg.reg;
2367*9880d681SAndroid Build Coastguard Worker unsigned PhysReg = VRM->getPhys(Reg);
2368*9880d681SAndroid Build Coastguard Worker // Start the recoloring algorithm from the input live-interval, then
2369*9880d681SAndroid Build Coastguard Worker // it will propagate to the ones that are copy-related with it.
2370*9880d681SAndroid Build Coastguard Worker Visited.insert(Reg);
2371*9880d681SAndroid Build Coastguard Worker RecoloringCandidates.push_back(Reg);
2372*9880d681SAndroid Build Coastguard Worker
2373*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Trying to reconcile hints for: " << PrintReg(Reg, TRI) << '('
2374*9880d681SAndroid Build Coastguard Worker << PrintReg(PhysReg, TRI) << ")\n");
2375*9880d681SAndroid Build Coastguard Worker
2376*9880d681SAndroid Build Coastguard Worker do {
2377*9880d681SAndroid Build Coastguard Worker Reg = RecoloringCandidates.pop_back_val();
2378*9880d681SAndroid Build Coastguard Worker
2379*9880d681SAndroid Build Coastguard Worker // We cannot recolor physcal register.
2380*9880d681SAndroid Build Coastguard Worker if (TargetRegisterInfo::isPhysicalRegister(Reg))
2381*9880d681SAndroid Build Coastguard Worker continue;
2382*9880d681SAndroid Build Coastguard Worker
2383*9880d681SAndroid Build Coastguard Worker assert(VRM->hasPhys(Reg) && "We have unallocated variable!!");
2384*9880d681SAndroid Build Coastguard Worker
2385*9880d681SAndroid Build Coastguard Worker // Get the live interval mapped with this virtual register to be able
2386*9880d681SAndroid Build Coastguard Worker // to check for the interference with the new color.
2387*9880d681SAndroid Build Coastguard Worker LiveInterval &LI = LIS->getInterval(Reg);
2388*9880d681SAndroid Build Coastguard Worker unsigned CurrPhys = VRM->getPhys(Reg);
2389*9880d681SAndroid Build Coastguard Worker // Check that the new color matches the register class constraints and
2390*9880d681SAndroid Build Coastguard Worker // that it is free for this live range.
2391*9880d681SAndroid Build Coastguard Worker if (CurrPhys != PhysReg && (!MRI->getRegClass(Reg)->contains(PhysReg) ||
2392*9880d681SAndroid Build Coastguard Worker Matrix->checkInterference(LI, PhysReg)))
2393*9880d681SAndroid Build Coastguard Worker continue;
2394*9880d681SAndroid Build Coastguard Worker
2395*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << PrintReg(Reg, TRI) << '(' << PrintReg(CurrPhys, TRI)
2396*9880d681SAndroid Build Coastguard Worker << ") is recolorable.\n");
2397*9880d681SAndroid Build Coastguard Worker
2398*9880d681SAndroid Build Coastguard Worker // Gather the hint info.
2399*9880d681SAndroid Build Coastguard Worker Info.clear();
2400*9880d681SAndroid Build Coastguard Worker collectHintInfo(Reg, Info);
2401*9880d681SAndroid Build Coastguard Worker // Check if recoloring the live-range will increase the cost of the
2402*9880d681SAndroid Build Coastguard Worker // non-identity copies.
2403*9880d681SAndroid Build Coastguard Worker if (CurrPhys != PhysReg) {
2404*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Checking profitability:\n");
2405*9880d681SAndroid Build Coastguard Worker BlockFrequency OldCopiesCost = getBrokenHintFreq(Info, CurrPhys);
2406*9880d681SAndroid Build Coastguard Worker BlockFrequency NewCopiesCost = getBrokenHintFreq(Info, PhysReg);
2407*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Old Cost: " << OldCopiesCost.getFrequency()
2408*9880d681SAndroid Build Coastguard Worker << "\nNew Cost: " << NewCopiesCost.getFrequency() << '\n');
2409*9880d681SAndroid Build Coastguard Worker if (OldCopiesCost < NewCopiesCost) {
2410*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "=> Not profitable.\n");
2411*9880d681SAndroid Build Coastguard Worker continue;
2412*9880d681SAndroid Build Coastguard Worker }
2413*9880d681SAndroid Build Coastguard Worker // At this point, the cost is either cheaper or equal. If it is
2414*9880d681SAndroid Build Coastguard Worker // equal, we consider this is profitable because it may expose
2415*9880d681SAndroid Build Coastguard Worker // more recoloring opportunities.
2416*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "=> Profitable.\n");
2417*9880d681SAndroid Build Coastguard Worker // Recolor the live-range.
2418*9880d681SAndroid Build Coastguard Worker Matrix->unassign(LI);
2419*9880d681SAndroid Build Coastguard Worker Matrix->assign(LI, PhysReg);
2420*9880d681SAndroid Build Coastguard Worker }
2421*9880d681SAndroid Build Coastguard Worker // Push all copy-related live-ranges to keep reconciling the broken
2422*9880d681SAndroid Build Coastguard Worker // hints.
2423*9880d681SAndroid Build Coastguard Worker for (const HintInfo &HI : Info) {
2424*9880d681SAndroid Build Coastguard Worker if (Visited.insert(HI.Reg).second)
2425*9880d681SAndroid Build Coastguard Worker RecoloringCandidates.push_back(HI.Reg);
2426*9880d681SAndroid Build Coastguard Worker }
2427*9880d681SAndroid Build Coastguard Worker } while (!RecoloringCandidates.empty());
2428*9880d681SAndroid Build Coastguard Worker }
2429*9880d681SAndroid Build Coastguard Worker
2430*9880d681SAndroid Build Coastguard Worker /// \brief Try to recolor broken hints.
2431*9880d681SAndroid Build Coastguard Worker /// Broken hints may be repaired by recoloring when an evicted variable
2432*9880d681SAndroid Build Coastguard Worker /// freed up a register for a larger live-range.
2433*9880d681SAndroid Build Coastguard Worker /// Consider the following example:
2434*9880d681SAndroid Build Coastguard Worker /// BB1:
2435*9880d681SAndroid Build Coastguard Worker /// a =
2436*9880d681SAndroid Build Coastguard Worker /// b =
2437*9880d681SAndroid Build Coastguard Worker /// BB2:
2438*9880d681SAndroid Build Coastguard Worker /// ...
2439*9880d681SAndroid Build Coastguard Worker /// = b
2440*9880d681SAndroid Build Coastguard Worker /// = a
2441*9880d681SAndroid Build Coastguard Worker /// Let us assume b gets split:
2442*9880d681SAndroid Build Coastguard Worker /// BB1:
2443*9880d681SAndroid Build Coastguard Worker /// a =
2444*9880d681SAndroid Build Coastguard Worker /// b =
2445*9880d681SAndroid Build Coastguard Worker /// BB2:
2446*9880d681SAndroid Build Coastguard Worker /// c = b
2447*9880d681SAndroid Build Coastguard Worker /// ...
2448*9880d681SAndroid Build Coastguard Worker /// d = c
2449*9880d681SAndroid Build Coastguard Worker /// = d
2450*9880d681SAndroid Build Coastguard Worker /// = a
2451*9880d681SAndroid Build Coastguard Worker /// Because of how the allocation work, b, c, and d may be assigned different
2452*9880d681SAndroid Build Coastguard Worker /// colors. Now, if a gets evicted later:
2453*9880d681SAndroid Build Coastguard Worker /// BB1:
2454*9880d681SAndroid Build Coastguard Worker /// a =
2455*9880d681SAndroid Build Coastguard Worker /// st a, SpillSlot
2456*9880d681SAndroid Build Coastguard Worker /// b =
2457*9880d681SAndroid Build Coastguard Worker /// BB2:
2458*9880d681SAndroid Build Coastguard Worker /// c = b
2459*9880d681SAndroid Build Coastguard Worker /// ...
2460*9880d681SAndroid Build Coastguard Worker /// d = c
2461*9880d681SAndroid Build Coastguard Worker /// = d
2462*9880d681SAndroid Build Coastguard Worker /// e = ld SpillSlot
2463*9880d681SAndroid Build Coastguard Worker /// = e
2464*9880d681SAndroid Build Coastguard Worker /// This is likely that we can assign the same register for b, c, and d,
2465*9880d681SAndroid Build Coastguard Worker /// getting rid of 2 copies.
tryHintsRecoloring()2466*9880d681SAndroid Build Coastguard Worker void RAGreedy::tryHintsRecoloring() {
2467*9880d681SAndroid Build Coastguard Worker for (LiveInterval *LI : SetOfBrokenHints) {
2468*9880d681SAndroid Build Coastguard Worker assert(TargetRegisterInfo::isVirtualRegister(LI->reg) &&
2469*9880d681SAndroid Build Coastguard Worker "Recoloring is possible only for virtual registers");
2470*9880d681SAndroid Build Coastguard Worker // Some dead defs may be around (e.g., because of debug uses).
2471*9880d681SAndroid Build Coastguard Worker // Ignore those.
2472*9880d681SAndroid Build Coastguard Worker if (!VRM->hasPhys(LI->reg))
2473*9880d681SAndroid Build Coastguard Worker continue;
2474*9880d681SAndroid Build Coastguard Worker tryHintRecoloring(*LI);
2475*9880d681SAndroid Build Coastguard Worker }
2476*9880d681SAndroid Build Coastguard Worker }
2477*9880d681SAndroid Build Coastguard Worker
selectOrSplitImpl(LiveInterval & VirtReg,SmallVectorImpl<unsigned> & NewVRegs,SmallVirtRegSet & FixedRegisters,unsigned Depth)2478*9880d681SAndroid Build Coastguard Worker unsigned RAGreedy::selectOrSplitImpl(LiveInterval &VirtReg,
2479*9880d681SAndroid Build Coastguard Worker SmallVectorImpl<unsigned> &NewVRegs,
2480*9880d681SAndroid Build Coastguard Worker SmallVirtRegSet &FixedRegisters,
2481*9880d681SAndroid Build Coastguard Worker unsigned Depth) {
2482*9880d681SAndroid Build Coastguard Worker unsigned CostPerUseLimit = ~0u;
2483*9880d681SAndroid Build Coastguard Worker // First try assigning a free register.
2484*9880d681SAndroid Build Coastguard Worker AllocationOrder Order(VirtReg.reg, *VRM, RegClassInfo, Matrix);
2485*9880d681SAndroid Build Coastguard Worker if (unsigned PhysReg = tryAssign(VirtReg, Order, NewVRegs)) {
2486*9880d681SAndroid Build Coastguard Worker // When NewVRegs is not empty, we may have made decisions such as evicting
2487*9880d681SAndroid Build Coastguard Worker // a virtual register, go with the earlier decisions and use the physical
2488*9880d681SAndroid Build Coastguard Worker // register.
2489*9880d681SAndroid Build Coastguard Worker if (CSRCost.getFrequency() && isUnusedCalleeSavedReg(PhysReg) &&
2490*9880d681SAndroid Build Coastguard Worker NewVRegs.empty()) {
2491*9880d681SAndroid Build Coastguard Worker unsigned CSRReg = tryAssignCSRFirstTime(VirtReg, Order, PhysReg,
2492*9880d681SAndroid Build Coastguard Worker CostPerUseLimit, NewVRegs);
2493*9880d681SAndroid Build Coastguard Worker if (CSRReg || !NewVRegs.empty())
2494*9880d681SAndroid Build Coastguard Worker // Return now if we decide to use a CSR or create new vregs due to
2495*9880d681SAndroid Build Coastguard Worker // pre-splitting.
2496*9880d681SAndroid Build Coastguard Worker return CSRReg;
2497*9880d681SAndroid Build Coastguard Worker } else
2498*9880d681SAndroid Build Coastguard Worker return PhysReg;
2499*9880d681SAndroid Build Coastguard Worker }
2500*9880d681SAndroid Build Coastguard Worker
2501*9880d681SAndroid Build Coastguard Worker LiveRangeStage Stage = getStage(VirtReg);
2502*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << StageName[Stage]
2503*9880d681SAndroid Build Coastguard Worker << " Cascade " << ExtraRegInfo[VirtReg.reg].Cascade << '\n');
2504*9880d681SAndroid Build Coastguard Worker
2505*9880d681SAndroid Build Coastguard Worker // Try to evict a less worthy live range, but only for ranges from the primary
2506*9880d681SAndroid Build Coastguard Worker // queue. The RS_Split ranges already failed to do this, and they should not
2507*9880d681SAndroid Build Coastguard Worker // get a second chance until they have been split.
2508*9880d681SAndroid Build Coastguard Worker if (Stage != RS_Split)
2509*9880d681SAndroid Build Coastguard Worker if (unsigned PhysReg =
2510*9880d681SAndroid Build Coastguard Worker tryEvict(VirtReg, Order, NewVRegs, CostPerUseLimit)) {
2511*9880d681SAndroid Build Coastguard Worker unsigned Hint = MRI->getSimpleHint(VirtReg.reg);
2512*9880d681SAndroid Build Coastguard Worker // If VirtReg has a hint and that hint is broken record this
2513*9880d681SAndroid Build Coastguard Worker // virtual register as a recoloring candidate for broken hint.
2514*9880d681SAndroid Build Coastguard Worker // Indeed, since we evicted a variable in its neighborhood it is
2515*9880d681SAndroid Build Coastguard Worker // likely we can at least partially recolor some of the
2516*9880d681SAndroid Build Coastguard Worker // copy-related live-ranges.
2517*9880d681SAndroid Build Coastguard Worker if (Hint && Hint != PhysReg)
2518*9880d681SAndroid Build Coastguard Worker SetOfBrokenHints.insert(&VirtReg);
2519*9880d681SAndroid Build Coastguard Worker return PhysReg;
2520*9880d681SAndroid Build Coastguard Worker }
2521*9880d681SAndroid Build Coastguard Worker
2522*9880d681SAndroid Build Coastguard Worker assert(NewVRegs.empty() && "Cannot append to existing NewVRegs");
2523*9880d681SAndroid Build Coastguard Worker
2524*9880d681SAndroid Build Coastguard Worker // The first time we see a live range, don't try to split or spill.
2525*9880d681SAndroid Build Coastguard Worker // Wait until the second time, when all smaller ranges have been allocated.
2526*9880d681SAndroid Build Coastguard Worker // This gives a better picture of the interference to split around.
2527*9880d681SAndroid Build Coastguard Worker if (Stage < RS_Split) {
2528*9880d681SAndroid Build Coastguard Worker setStage(VirtReg, RS_Split);
2529*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "wait for second round\n");
2530*9880d681SAndroid Build Coastguard Worker NewVRegs.push_back(VirtReg.reg);
2531*9880d681SAndroid Build Coastguard Worker return 0;
2532*9880d681SAndroid Build Coastguard Worker }
2533*9880d681SAndroid Build Coastguard Worker
2534*9880d681SAndroid Build Coastguard Worker // If we couldn't allocate a register from spilling, there is probably some
2535*9880d681SAndroid Build Coastguard Worker // invalid inline assembly. The base class wil report it.
2536*9880d681SAndroid Build Coastguard Worker if (Stage >= RS_Done || !VirtReg.isSpillable())
2537*9880d681SAndroid Build Coastguard Worker return tryLastChanceRecoloring(VirtReg, Order, NewVRegs, FixedRegisters,
2538*9880d681SAndroid Build Coastguard Worker Depth);
2539*9880d681SAndroid Build Coastguard Worker
2540*9880d681SAndroid Build Coastguard Worker // Try splitting VirtReg or interferences.
2541*9880d681SAndroid Build Coastguard Worker unsigned PhysReg = trySplit(VirtReg, Order, NewVRegs);
2542*9880d681SAndroid Build Coastguard Worker if (PhysReg || !NewVRegs.empty())
2543*9880d681SAndroid Build Coastguard Worker return PhysReg;
2544*9880d681SAndroid Build Coastguard Worker
2545*9880d681SAndroid Build Coastguard Worker // Finally spill VirtReg itself.
2546*9880d681SAndroid Build Coastguard Worker if (EnableDeferredSpilling && getStage(VirtReg) < RS_Memory) {
2547*9880d681SAndroid Build Coastguard Worker // TODO: This is experimental and in particular, we do not model
2548*9880d681SAndroid Build Coastguard Worker // the live range splitting done by spilling correctly.
2549*9880d681SAndroid Build Coastguard Worker // We would need a deep integration with the spiller to do the
2550*9880d681SAndroid Build Coastguard Worker // right thing here. Anyway, that is still good for early testing.
2551*9880d681SAndroid Build Coastguard Worker setStage(VirtReg, RS_Memory);
2552*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Do as if this register is in memory\n");
2553*9880d681SAndroid Build Coastguard Worker NewVRegs.push_back(VirtReg.reg);
2554*9880d681SAndroid Build Coastguard Worker } else {
2555*9880d681SAndroid Build Coastguard Worker NamedRegionTimer T("Spiller", TimerGroupName, TimePassesIsEnabled);
2556*9880d681SAndroid Build Coastguard Worker LiveRangeEdit LRE(&VirtReg, NewVRegs, *MF, *LIS, VRM, this, &DeadRemats);
2557*9880d681SAndroid Build Coastguard Worker spiller().spill(LRE);
2558*9880d681SAndroid Build Coastguard Worker setStage(NewVRegs.begin(), NewVRegs.end(), RS_Done);
2559*9880d681SAndroid Build Coastguard Worker
2560*9880d681SAndroid Build Coastguard Worker if (VerifyEnabled)
2561*9880d681SAndroid Build Coastguard Worker MF->verify(this, "After spilling");
2562*9880d681SAndroid Build Coastguard Worker }
2563*9880d681SAndroid Build Coastguard Worker
2564*9880d681SAndroid Build Coastguard Worker // The live virtual register requesting allocation was spilled, so tell
2565*9880d681SAndroid Build Coastguard Worker // the caller not to allocate anything during this round.
2566*9880d681SAndroid Build Coastguard Worker return 0;
2567*9880d681SAndroid Build Coastguard Worker }
2568*9880d681SAndroid Build Coastguard Worker
runOnMachineFunction(MachineFunction & mf)2569*9880d681SAndroid Build Coastguard Worker bool RAGreedy::runOnMachineFunction(MachineFunction &mf) {
2570*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "********** GREEDY REGISTER ALLOCATION **********\n"
2571*9880d681SAndroid Build Coastguard Worker << "********** Function: " << mf.getName() << '\n');
2572*9880d681SAndroid Build Coastguard Worker
2573*9880d681SAndroid Build Coastguard Worker MF = &mf;
2574*9880d681SAndroid Build Coastguard Worker TRI = MF->getSubtarget().getRegisterInfo();
2575*9880d681SAndroid Build Coastguard Worker TII = MF->getSubtarget().getInstrInfo();
2576*9880d681SAndroid Build Coastguard Worker RCI.runOnMachineFunction(mf);
2577*9880d681SAndroid Build Coastguard Worker
2578*9880d681SAndroid Build Coastguard Worker EnableLocalReassign = EnableLocalReassignment ||
2579*9880d681SAndroid Build Coastguard Worker MF->getSubtarget().enableRALocalReassignment(
2580*9880d681SAndroid Build Coastguard Worker MF->getTarget().getOptLevel());
2581*9880d681SAndroid Build Coastguard Worker
2582*9880d681SAndroid Build Coastguard Worker if (VerifyEnabled)
2583*9880d681SAndroid Build Coastguard Worker MF->verify(this, "Before greedy register allocator");
2584*9880d681SAndroid Build Coastguard Worker
2585*9880d681SAndroid Build Coastguard Worker RegAllocBase::init(getAnalysis<VirtRegMap>(),
2586*9880d681SAndroid Build Coastguard Worker getAnalysis<LiveIntervals>(),
2587*9880d681SAndroid Build Coastguard Worker getAnalysis<LiveRegMatrix>());
2588*9880d681SAndroid Build Coastguard Worker Indexes = &getAnalysis<SlotIndexes>();
2589*9880d681SAndroid Build Coastguard Worker MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
2590*9880d681SAndroid Build Coastguard Worker DomTree = &getAnalysis<MachineDominatorTree>();
2591*9880d681SAndroid Build Coastguard Worker SpillerInstance.reset(createInlineSpiller(*this, *MF, *VRM));
2592*9880d681SAndroid Build Coastguard Worker Loops = &getAnalysis<MachineLoopInfo>();
2593*9880d681SAndroid Build Coastguard Worker Bundles = &getAnalysis<EdgeBundles>();
2594*9880d681SAndroid Build Coastguard Worker SpillPlacer = &getAnalysis<SpillPlacement>();
2595*9880d681SAndroid Build Coastguard Worker DebugVars = &getAnalysis<LiveDebugVariables>();
2596*9880d681SAndroid Build Coastguard Worker AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
2597*9880d681SAndroid Build Coastguard Worker
2598*9880d681SAndroid Build Coastguard Worker initializeCSRCost();
2599*9880d681SAndroid Build Coastguard Worker
2600*9880d681SAndroid Build Coastguard Worker calculateSpillWeightsAndHints(*LIS, mf, VRM, *Loops, *MBFI);
2601*9880d681SAndroid Build Coastguard Worker
2602*9880d681SAndroid Build Coastguard Worker DEBUG(LIS->dump());
2603*9880d681SAndroid Build Coastguard Worker
2604*9880d681SAndroid Build Coastguard Worker SA.reset(new SplitAnalysis(*VRM, *LIS, *Loops));
2605*9880d681SAndroid Build Coastguard Worker SE.reset(new SplitEditor(*SA, *AA, *LIS, *VRM, *DomTree, *MBFI));
2606*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.clear();
2607*9880d681SAndroid Build Coastguard Worker ExtraRegInfo.resize(MRI->getNumVirtRegs());
2608*9880d681SAndroid Build Coastguard Worker NextCascade = 1;
2609*9880d681SAndroid Build Coastguard Worker IntfCache.init(MF, Matrix->getLiveUnions(), Indexes, LIS, TRI);
2610*9880d681SAndroid Build Coastguard Worker GlobalCand.resize(32); // This will grow as needed.
2611*9880d681SAndroid Build Coastguard Worker SetOfBrokenHints.clear();
2612*9880d681SAndroid Build Coastguard Worker
2613*9880d681SAndroid Build Coastguard Worker allocatePhysRegs();
2614*9880d681SAndroid Build Coastguard Worker tryHintsRecoloring();
2615*9880d681SAndroid Build Coastguard Worker postOptimization();
2616*9880d681SAndroid Build Coastguard Worker
2617*9880d681SAndroid Build Coastguard Worker releaseMemory();
2618*9880d681SAndroid Build Coastguard Worker return true;
2619*9880d681SAndroid Build Coastguard Worker }
2620