xref: /aosp_15_r20/external/llvm/lib/CodeGen/RegAllocGreedy.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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