12 #ifndef LLVM_CODEGEN_REGALLOCGREEDY_H_
13 #define LLVM_CODEGEN_REGALLOCGREEDY_H_
44 class AllocationOrder;
47 class LiveDebugVariables;
50 class MachineBasicBlock;
51 class MachineBlockFrequencyInfo;
52 class MachineDominatorTree;
54 class MachineLoopInfo;
55 class MachineOptimizationRemarkEmitter;
56 class MachineOptimizationRemarkMissed;
59 class TargetInstrInfo;
81 unsigned NextCascade = 1;
90 return getStage(VirtReg.
reg());
99 setStage(VirtReg.
reg(), Stage);
106 return getStage(
Reg);
117 unsigned Cascade = getCascade(
Reg);
119 Cascade = NextCascade++;
120 setCascade(
Reg, Cascade);
126 unsigned Cascade = getCascade(
Reg);
128 Cascade = NextCascade;
132 template <
typename Iterator>
134 for (; Begin != End; ++Begin) {
154 using PQueue = std::priority_queue<std::pair<unsigned, unsigned>>;
159 using RecoloringStack =
180 std::unique_ptr<Spiller> SpillerInstance;
182 std::unique_ptr<VirtRegAuxInfo> VRAI;
184 std::unique_ptr<RegAllocEvictionAdvisor> EvictAdvisor;
203 static const char *
const StageName[];
208 class EvictionTrack {
212 std::pair<Register , MCRegister >;
218 EvicteeInfo Evictees;
222 void clear() { Evictees.clear(); }
229 void clearEvicteeInfo(Register Evictee) { Evictees.erase(Evictee); }
236 void addEviction(MCRegister PhysReg, Register Evictor, Register Evictee) {
237 Evictees[Evictee].first = Evictor;
238 Evictees[Evictee].second = PhysReg;
245 EvictorInfo getEvictor(Register Evictee) {
246 if (Evictees.count(Evictee)) {
247 return Evictees[Evictee];
250 return EvictorInfo(0, 0);
255 EvictionTrack LastEvicted;
258 std::unique_ptr<SplitAnalysis> SA;
259 std::unique_ptr<SplitEditor> SE;
262 InterferenceCache IntfCache;
265 SmallVector<SpillPlacement::BlockConstraint, 8> SplitConstraints;
268 struct GlobalSplitCandidate {
276 InterferenceCache::Cursor Intf;
279 BitVector LiveBundles;
280 SmallVector<unsigned, 8> ActiveBlocks;
282 void reset(InterferenceCache &Cache, MCRegister
Reg) {
285 Intf.setPhysReg(Cache,
Reg);
287 ActiveBlocks.clear();
291 unsigned getBundles(SmallVectorImpl<unsigned> &
B,
unsigned C) {
293 for (
unsigned I : LiveBundles.set_bits())
305 SmallVector<GlobalSplitCandidate, 32> GlobalCand;
307 enum :
unsigned {
NoCand = ~0u };
311 SmallVector<unsigned, 32> BundleCand;
314 BlockFrequency CSRCost;
317 SmallSetVector<const LiveInterval *, 8> SetOfBrokenHints;
321 ArrayRef<uint8_t> RegCosts;
325 bool RegClassPriorityTrumpsGlobalness;
335 void releaseMemory()
override;
341 void aboutToRemoveInterval(
const LiveInterval &)
override;
363 bool LRE_CanEraseVirtReg(
Register)
override;
364 void LRE_WillShrinkVirtReg(
Register)
override;
372 bool growRegion(GlobalSplitCandidate &Cand);
373 bool splitCanCauseEvictionChain(
Register Evictee, GlobalSplitCandidate &Cand,
378 bool calcCompactRegion(GlobalSplitCandidate &);
381 bool canEvictInterferenceInRange(
const LiveInterval &VirtReg,
387 float *BestEvictWeight)
const;
390 bool mayRecolorAllInterferences(
MCRegister PhysReg,
403 unsigned calculateRegionSplitCost(
const LiveInterval &VirtReg,
406 unsigned &NumCands,
bool IgnoreCSR);
408 unsigned doRegionSplit(
const LiveInterval &VirtReg,
unsigned BestCand,
414 uint8_t &CostPerUseLimit,
416 void initializeCSRCost();
432 void tryHintsRecoloring();
445 : Freq(Freq),
Reg(
Reg), PhysReg(PhysReg) {}
447 using HintsInfo = SmallVector<HintInfo, 4>;
449 BlockFrequency getBrokenHintFreq(
const HintsInfo &, MCRegister);
450 void collectHintInfo(Register, HintsInfo &);
453 struct RAGreedyStats {
454 unsigned Reloads = 0;
455 unsigned FoldedReloads = 0;
456 unsigned ZeroCostFoldedReloads = 0;
458 unsigned FoldedSpills = 0;
460 float ReloadsCost = 0.0f;
461 float FoldedReloadsCost = 0.0f;
462 float SpillsCost = 0.0f;
463 float FoldedSpillsCost = 0.0f;
464 float CopiesCost = 0.0f;
467 return !(Reloads || FoldedReloads || Spills || FoldedSpills ||
468 ZeroCostFoldedReloads ||
Copies);
471 void add(RAGreedyStats other) {
472 Reloads += other.Reloads;
473 FoldedReloads += other.FoldedReloads;
474 ZeroCostFoldedReloads += other.ZeroCostFoldedReloads;
475 Spills += other.Spills;
476 FoldedSpills += other.FoldedSpills;
478 ReloadsCost += other.ReloadsCost;
479 FoldedReloadsCost += other.FoldedReloadsCost;
480 SpillsCost += other.SpillsCost;
481 FoldedSpillsCost += other.FoldedSpillsCost;
482 CopiesCost += other.CopiesCost;
485 void report(MachineOptimizationRemarkMissed &R);
489 RAGreedyStats computeStats(MachineBasicBlock &
MBB);
492 RAGreedyStats reportStats(MachineLoop *L);
498 #endif // #ifndef LLVM_CODEGEN_REGALLOCGREEDY_H_