LLVM 22.0.0git
MachineLICM.cpp
Go to the documentation of this file.
1//===- MachineLICM.cpp - Machine Loop Invariant Code Motion Pass ----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass performs loop invariant code motion on machine instructions. We
10// attempt to remove as much code from the body of a loop as possible.
11//
12// This pass is not intended to be a replacement or a complete alternative
13// for the LLVM-IR-level LICM pass. It is only designed to hoist simple
14// constructs that are not exposed before lowering and instruction selection.
15//
16//===----------------------------------------------------------------------===//
17
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/ADT/STLExtras.h"
23#include "llvm/ADT/Statistic.h"
43#include "llvm/IR/DebugLoc.h"
45#include "llvm/MC/MCInstrDesc.h"
46#include "llvm/MC/MCRegister.h"
47#include "llvm/Pass.h"
50#include "llvm/Support/Debug.h"
52#include <cassert>
53#include <limits>
54#include <vector>
55
56using namespace llvm;
57
58#define DEBUG_TYPE "machinelicm"
59
60static cl::opt<bool>
61AvoidSpeculation("avoid-speculation",
62 cl::desc("MachineLICM should avoid speculation"),
63 cl::init(true), cl::Hidden);
64
65static cl::opt<bool>
66HoistCheapInsts("hoist-cheap-insts",
67 cl::desc("MachineLICM should hoist even cheap instructions"),
68 cl::init(false), cl::Hidden);
69
70static cl::opt<bool>
71HoistConstStores("hoist-const-stores",
72 cl::desc("Hoist invariant stores"),
73 cl::init(true), cl::Hidden);
74
75static cl::opt<bool> HoistConstLoads("hoist-const-loads",
76 cl::desc("Hoist invariant loads"),
77 cl::init(true), cl::Hidden);
78
79// The default threshold of 100 (i.e. if target block is 100 times hotter)
80// is based on empirical data on a single target and is subject to tuning.
82BlockFrequencyRatioThreshold("block-freq-ratio-threshold",
83 cl::desc("Do not hoist instructions if target"
84 "block is N times hotter than the source."),
85 cl::init(100), cl::Hidden);
86
87enum class UseBFI { None, PGO, All };
88
89static cl::opt<UseBFI>
90DisableHoistingToHotterBlocks("disable-hoisting-to-hotter-blocks",
91 cl::desc("Disable hoisting instructions to"
92 " hotter blocks"),
95 "disable the feature"),
97 "enable the feature when using profile data"),
99 "enable the feature with/wo profile data")));
100
101STATISTIC(NumHoisted,
102 "Number of machine instructions hoisted out of loops");
103STATISTIC(NumLowRP,
104 "Number of instructions hoisted in low reg pressure situation");
105STATISTIC(NumHighLatency,
106 "Number of high latency instructions hoisted");
107STATISTIC(NumCSEed,
108 "Number of hoisted machine instructions CSEed");
109STATISTIC(NumPostRAHoisted,
110 "Number of machine instructions hoisted out of loops post regalloc");
111STATISTIC(NumStoreConst,
112 "Number of stores of const phys reg hoisted out of loops");
113STATISTIC(NumNotHoistedDueToHotness,
114 "Number of instructions not hoisted due to block frequency");
115
116namespace {
117 enum HoistResult { NotHoisted = 1, Hoisted = 2, ErasedMI = 4 };
118
119 class MachineLICMImpl {
120 const TargetInstrInfo *TII = nullptr;
121 const TargetLoweringBase *TLI = nullptr;
122 const TargetRegisterInfo *TRI = nullptr;
123 const MachineFrameInfo *MFI = nullptr;
124 MachineRegisterInfo *MRI = nullptr;
125 TargetSchedModel SchedModel;
126 bool PreRegAlloc = false;
127 bool HasProfileData = false;
128 Pass *LegacyPass;
130
131 // Various analyses that we use...
132 AliasAnalysis *AA = nullptr; // Alias analysis info.
133 MachineBlockFrequencyInfo *MBFI = nullptr; // Machine block frequncy info
134 MachineLoopInfo *MLI = nullptr; // Current MachineLoopInfo
135 MachineDomTreeUpdater *MDTU = nullptr; // Wraps current dominator tree
136
137 // State that is updated as we process loops
138 bool Changed = false; // True if a loop is changed.
139 bool FirstInLoop = false; // True if it's the first LICM in the loop.
140
141 // Holds information about whether it is allowed to move load instructions
142 // out of the loop
143 SmallDenseMap<MachineLoop *, bool> AllowedToHoistLoads;
144
145 // Exit blocks of each Loop.
146 DenseMap<MachineLoop *, SmallVector<MachineBasicBlock *, 8>> ExitBlockMap;
147
148 bool isExitBlock(MachineLoop *CurLoop, const MachineBasicBlock *MBB) {
149 auto [It, Inserted] = ExitBlockMap.try_emplace(CurLoop);
150 if (Inserted) {
151 SmallVector<MachineBasicBlock *, 8> ExitBlocks;
152 CurLoop->getExitBlocks(ExitBlocks);
153 It->second = std::move(ExitBlocks);
154 }
155 return is_contained(It->second, MBB);
156 }
157
158 // Track 'estimated' register pressure.
159 SmallDenseSet<Register> RegSeen;
160 SmallVector<unsigned, 8> RegPressure;
161
162 // Register pressure "limit" per register pressure set. If the pressure
163 // is higher than the limit, then it's considered high.
164 SmallVector<unsigned, 8> RegLimit;
165
166 // Register pressure on path leading from loop preheader to current BB.
168
169 // For each opcode per preheader, keep a list of potential CSE instructions.
170 DenseMap<MachineBasicBlock *,
171 DenseMap<unsigned, std::vector<MachineInstr *>>>
172 CSEMap;
173
174 enum {
175 SpeculateFalse = 0,
176 SpeculateTrue = 1,
177 SpeculateUnknown = 2
178 };
179
180 // If a MBB does not dominate loop exiting blocks then it may not safe
181 // to hoist loads from this block.
182 // Tri-state: 0 - false, 1 - true, 2 - unknown
183 unsigned SpeculationState = SpeculateUnknown;
184
185 public:
186 MachineLICMImpl(bool PreRegAlloc, Pass *LegacyPass,
188 : PreRegAlloc(PreRegAlloc), LegacyPass(LegacyPass), MFAM(MFAM) {
189 assert((LegacyPass || MFAM) && "LegacyPass or MFAM must be provided");
190 assert(!(LegacyPass && MFAM) &&
191 "LegacyPass and MFAM cannot be provided at the same time");
192 }
193
194 bool run(MachineFunction &MF);
195
196 void releaseMemory() {
197 RegSeen.clear();
198 RegPressure.clear();
199 RegLimit.clear();
200 BackTrace.clear();
201 CSEMap.clear();
202 ExitBlockMap.clear();
203 }
204
205 private:
206 /// Keep track of information about hoisting candidates.
207 struct CandidateInfo {
208 MachineInstr *MI;
209 Register Def;
210 int FI;
211
212 CandidateInfo(MachineInstr *mi, Register def, int fi)
213 : MI(mi), Def(def), FI(fi) {}
214 };
215
216 void HoistRegionPostRA(MachineLoop *CurLoop);
217
218 void HoistPostRA(MachineInstr *MI, Register Def, MachineLoop *CurLoop);
219
220 void ProcessMI(MachineInstr *MI, BitVector &RUDefs, BitVector &RUClobbers,
221 SmallDenseSet<int> &StoredFIs,
222 SmallVectorImpl<CandidateInfo> &Candidates,
223 MachineLoop *CurLoop);
224
225 void AddToLiveIns(MCRegister Reg, MachineLoop *CurLoop);
226
227 bool IsLICMCandidate(MachineInstr &I, MachineLoop *CurLoop);
228
229 bool IsLoopInvariantInst(MachineInstr &I, MachineLoop *CurLoop);
230
231 bool HasLoopPHIUse(const MachineInstr *MI, MachineLoop *CurLoop);
232
233 bool HasHighOperandLatency(MachineInstr &MI, unsigned DefIdx, Register Reg,
234 MachineLoop *CurLoop) const;
235
236 bool IsCheapInstruction(MachineInstr &MI) const;
237
238 bool CanCauseHighRegPressure(const SmallDenseMap<unsigned, int> &Cost,
239 bool Cheap);
240
241 void UpdateBackTraceRegPressure(const MachineInstr *MI);
242
243 bool IsProfitableToHoist(MachineInstr &MI, MachineLoop *CurLoop);
244
245 bool IsGuaranteedToExecute(MachineBasicBlock *BB, MachineLoop *CurLoop);
246
247 void EnterScope(MachineBasicBlock *MBB);
248
249 void ExitScope(MachineBasicBlock *MBB);
250
251 void ExitScopeIfDone(
252 MachineDomTreeNode *Node,
253 DenseMap<MachineDomTreeNode *, unsigned> &OpenChildren,
254 const DenseMap<MachineDomTreeNode *, MachineDomTreeNode *> &ParentMap);
255
256 void HoistOutOfLoop(MachineDomTreeNode *HeaderN, MachineLoop *CurLoop);
257
258 void InitRegPressure(MachineBasicBlock *BB);
259
260 SmallDenseMap<unsigned, int> calcRegisterCost(const MachineInstr *MI,
261 bool ConsiderSeen,
262 bool ConsiderUnseenAsDef);
263
264 void UpdateRegPressure(const MachineInstr *MI,
265 bool ConsiderUnseenAsDef = false);
266
267 MachineInstr *ExtractHoistableLoad(MachineInstr *MI, MachineLoop *CurLoop);
268
269 MachineInstr *LookForDuplicate(const MachineInstr *MI,
270 std::vector<MachineInstr *> &PrevMIs);
271
272 bool
273 EliminateCSE(MachineInstr *MI,
274 DenseMap<unsigned, std::vector<MachineInstr *>>::iterator &CI);
275
276 bool MayCSE(MachineInstr *MI);
277
278 unsigned Hoist(MachineInstr *MI, MachineBasicBlock *Preheader,
279 MachineLoop *CurLoop);
280
281 void InitCSEMap(MachineBasicBlock *BB);
282
283 void InitializeLoadsHoistableLoops();
284
285 bool isTgtHotterThanSrc(MachineBasicBlock *SrcBlock,
286 MachineBasicBlock *TgtBlock);
287 MachineBasicBlock *getOrCreatePreheader(MachineLoop *CurLoop);
288 };
289
290 class MachineLICMBase : public MachineFunctionPass {
291 bool PreRegAlloc;
292
293 public:
294 MachineLICMBase(char &ID, bool PreRegAlloc)
295 : MachineFunctionPass(ID), PreRegAlloc(PreRegAlloc) {}
296
297 bool runOnMachineFunction(MachineFunction &MF) override;
298
299 void getAnalysisUsage(AnalysisUsage &AU) const override {
300 AU.addRequired<MachineLoopInfoWrapperPass>();
302 AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
303 AU.addRequired<MachineDominatorTreeWrapperPass>();
304 AU.addRequired<AAResultsWrapperPass>();
305 AU.addPreserved<MachineLoopInfoWrapperPass>();
307 }
308 };
309
310 class MachineLICM : public MachineLICMBase {
311 public:
312 static char ID;
313 MachineLICM() : MachineLICMBase(ID, false) {
315 }
316 };
317
318 class EarlyMachineLICM : public MachineLICMBase {
319 public:
320 static char ID;
321 EarlyMachineLICM() : MachineLICMBase(ID, true) {
323 }
324 };
325
326} // end anonymous namespace
327
328char MachineLICM::ID;
329char EarlyMachineLICM::ID;
330
331char &llvm::MachineLICMID = MachineLICM::ID;
332char &llvm::EarlyMachineLICMID = EarlyMachineLICM::ID;
333
335 "Machine Loop Invariant Code Motion", false, false)
341 "Machine Loop Invariant Code Motion", false, false)
342
343INITIALIZE_PASS_BEGIN(EarlyMachineLICM, "early-machinelicm",
344 "Early Machine Loop Invariant Code Motion", false, false)
349INITIALIZE_PASS_END(EarlyMachineLICM, "early-machinelicm",
350 "Early Machine Loop Invariant Code Motion", false, false)
351
352bool MachineLICMBase::runOnMachineFunction(MachineFunction &MF) {
353 if (skipFunction(MF.getFunction()))
354 return false;
355
356 MachineLICMImpl Impl(PreRegAlloc, this, nullptr);
357 return Impl.run(MF);
358}
359
360#define GET_RESULT(RESULT, GETTER, INFIX) \
361 ((LegacyPass) \
362 ? &LegacyPass->getAnalysis<RESULT##INFIX##WrapperPass>().GETTER() \
363 : &MFAM->getResult<RESULT##Analysis>(MF))
364
365bool MachineLICMImpl::run(MachineFunction &MF) {
366 AA = MFAM != nullptr
368 .getManager()
369 .getResult<AAManager>(MF.getFunction())
370 : &LegacyPass->getAnalysis<AAResultsWrapperPass>().getAAResults();
372 MachineDomTreeUpdater::UpdateStrategy::Lazy);
373 MDTU = &DTU;
374 MLI = GET_RESULT(MachineLoop, getLI, Info);
376 ? GET_RESULT(MachineBlockFrequency, getMBFI, Info)
377 : nullptr;
378
379 Changed = FirstInLoop = false;
380 const TargetSubtargetInfo &ST = MF.getSubtarget();
381 TII = ST.getInstrInfo();
382 TLI = ST.getTargetLowering();
383 TRI = ST.getRegisterInfo();
384 MFI = &MF.getFrameInfo();
385 MRI = &MF.getRegInfo();
386 SchedModel.init(&ST);
387
388 HasProfileData = MF.getFunction().hasProfileData();
389
390 if (PreRegAlloc)
391 LLVM_DEBUG(dbgs() << "******** Pre-regalloc Machine LICM: ");
392 else
393 LLVM_DEBUG(dbgs() << "******** Post-regalloc Machine LICM: ");
394 LLVM_DEBUG(dbgs() << MF.getName() << " ********\n");
395
396 if (PreRegAlloc) {
397 // Estimate register pressure during pre-regalloc pass.
398 unsigned NumRPS = TRI->getNumRegPressureSets();
399 RegPressure.resize(NumRPS);
400 llvm::fill(RegPressure, 0);
401 RegLimit.resize(NumRPS);
402 for (unsigned i = 0, e = NumRPS; i != e; ++i)
403 RegLimit[i] = TRI->getRegPressureSetLimit(MF, i);
404 }
405
406 if (HoistConstLoads)
407 InitializeLoadsHoistableLoops();
408
409 SmallVector<MachineLoop *, 8> Worklist(MLI->begin(), MLI->end());
410 while (!Worklist.empty()) {
411 MachineLoop *CurLoop = Worklist.pop_back_val();
412
413 if (!PreRegAlloc) {
414 HoistRegionPostRA(CurLoop);
415 } else {
416 // CSEMap is initialized for loop header when the first instruction is
417 // being hoisted.
418 MachineDomTreeNode *N = MDTU->getDomTree().getNode(CurLoop->getHeader());
419 FirstInLoop = true;
420 HoistOutOfLoop(N, CurLoop);
421 CSEMap.clear();
422 }
423 }
424 releaseMemory();
425 return Changed;
426}
427
428/// Return true if instruction stores to the specified frame.
429static bool InstructionStoresToFI(const MachineInstr *MI, int FI) {
430 // Check mayStore before memory operands so that e.g. DBG_VALUEs will return
431 // true since they have no memory operands.
432 if (!MI->mayStore())
433 return false;
434 // If we lost memory operands, conservatively assume that the instruction
435 // writes to all slots.
436 if (MI->memoperands_empty())
437 return true;
438 for (const MachineMemOperand *MemOp : MI->memoperands()) {
439 if (!MemOp->isStore() || !MemOp->getPseudoValue())
440 continue;
442 dyn_cast<FixedStackPseudoSourceValue>(MemOp->getPseudoValue())) {
443 if (Value->getFrameIndex() == FI)
444 return true;
445 }
446 }
447 return false;
448}
449
451 BitVector &RUs,
452 const uint32_t *Mask) {
453 // FIXME: This intentionally works in reverse due to some issues with the
454 // Register Units infrastructure.
455 //
456 // This is used to apply callee-saved-register masks to the clobbered regunits
457 // mask.
458 //
459 // The right way to approach this is to start with a BitVector full of ones,
460 // then reset all the bits of the regunits of each register that is set in the
461 // mask (registers preserved), then OR the resulting bits with the Clobbers
462 // mask. This correctly prioritizes the saved registers, so if a RU is shared
463 // between a register that is preserved, and one that is NOT preserved, that
464 // RU will not be set in the output vector (the clobbers).
465 //
466 // What we have to do for now is the opposite: we have to assume that the
467 // regunits of all registers that are NOT preserved are clobbered, even if
468 // those regunits are preserved by another register. So if a RU is shared
469 // like described previously, that RU will be set.
470 //
471 // This is to work around an issue which appears in AArch64, but isn't
472 // exclusive to that target: AArch64's Qn registers (128 bits) have Dn
473 // register (lower 64 bits). A few Dn registers are preserved by some calling
474 // conventions, but Qn and Dn share exactly the same reg units.
475 //
476 // If we do this the right way, Qn will be marked as NOT clobbered even though
477 // its upper 64 bits are NOT preserved. The conservative approach handles this
478 // correctly at the cost of some missed optimizations on other targets.
479 //
480 // This is caused by how RegUnits are handled within TableGen. Ideally, Qn
481 // should have an extra RegUnit to model the "unknown" bits not covered by the
482 // subregs.
483 BitVector RUsFromRegsNotInMask(TRI.getNumRegUnits());
484 const unsigned NumRegs = TRI.getNumRegs();
485 const unsigned MaskWords = (NumRegs + 31) / 32;
486 for (unsigned K = 0; K < MaskWords; ++K) {
487 const uint32_t Word = Mask[K];
488 for (unsigned Bit = 0; Bit < 32; ++Bit) {
489 const unsigned PhysReg = (K * 32) + Bit;
490 if (PhysReg == NumRegs)
491 break;
492
493 if (PhysReg && !((Word >> Bit) & 1)) {
494 for (MCRegUnit Unit : TRI.regunits(PhysReg))
495 RUsFromRegsNotInMask.set(static_cast<unsigned>(Unit));
496 }
497 }
498 }
499
500 RUs |= RUsFromRegsNotInMask;
501}
502
503/// Examine the instruction for potential LICM candidate. Also
504/// gather register def and frame object update information.
505void MachineLICMImpl::ProcessMI(MachineInstr *MI, BitVector &RUDefs,
506 BitVector &RUClobbers,
507 SmallDenseSet<int> &StoredFIs,
508 SmallVectorImpl<CandidateInfo> &Candidates,
509 MachineLoop *CurLoop) {
510 bool RuledOut = false;
511 bool HasNonInvariantUse = false;
513 for (const MachineOperand &MO : MI->operands()) {
514 if (MO.isFI()) {
515 // Remember if the instruction stores to the frame index.
516 int FI = MO.getIndex();
517 if (!StoredFIs.count(FI) &&
518 MFI->isSpillSlotObjectIndex(FI) &&
520 StoredFIs.insert(FI);
521 HasNonInvariantUse = true;
522 continue;
523 }
524
525 // We can't hoist an instruction defining a physreg that is clobbered in
526 // the loop.
527 if (MO.isRegMask()) {
528 applyBitsNotInRegMaskToRegUnitsMask(*TRI, RUClobbers, MO.getRegMask());
529 continue;
530 }
531
532 if (!MO.isReg())
533 continue;
534 Register Reg = MO.getReg();
535 if (!Reg)
536 continue;
537 assert(Reg.isPhysical() && "Not expecting virtual register!");
538
539 if (!MO.isDef()) {
540 if (!HasNonInvariantUse) {
541 for (MCRegUnit Unit : TRI->regunits(Reg)) {
542 // If it's using a non-loop-invariant register, then it's obviously
543 // not safe to hoist.
544 if (RUDefs.test(static_cast<unsigned>(Unit)) ||
545 RUClobbers.test(static_cast<unsigned>(Unit))) {
546 HasNonInvariantUse = true;
547 break;
548 }
549 }
550 }
551 continue;
552 }
553
554 // FIXME: For now, avoid instructions with multiple defs, unless it's dead.
555 if (!MO.isDead()) {
556 if (Def)
557 RuledOut = true;
558 else
559 Def = Reg;
560 }
561
562 // If we have already seen another instruction that defines the same
563 // register, then this is not safe. Two defs is indicated by setting a
564 // PhysRegClobbers bit.
565 for (MCRegUnit Unit : TRI->regunits(Reg)) {
566 if (RUDefs.test(static_cast<unsigned>(Unit))) {
567 RUClobbers.set(static_cast<unsigned>(Unit));
568 RuledOut = true;
569 } else if (RUClobbers.test(static_cast<unsigned>(Unit))) {
570 // MI defined register is seen defined by another instruction in
571 // the loop, it cannot be a LICM candidate.
572 RuledOut = true;
573 }
574
575 RUDefs.set(static_cast<unsigned>(Unit));
576 }
577 }
578
579 // Only consider reloads for now and remats which do not have register
580 // operands. FIXME: Consider unfold load folding instructions.
581 if (Def && !RuledOut) {
582 int FI = std::numeric_limits<int>::min();
583 if ((!HasNonInvariantUse && IsLICMCandidate(*MI, CurLoop)) ||
585 Candidates.push_back(CandidateInfo(MI, Def, FI));
586 }
587}
588
589/// Walk the specified region of the CFG and hoist loop invariants out to the
590/// preheader.
591void MachineLICMImpl::HoistRegionPostRA(MachineLoop *CurLoop) {
592 MachineBasicBlock *Preheader = getOrCreatePreheader(CurLoop);
593 if (!Preheader)
594 return;
595
596 unsigned NumRegUnits = TRI->getNumRegUnits();
597 BitVector RUDefs(NumRegUnits); // RUs defined once in the loop.
598 BitVector RUClobbers(NumRegUnits); // RUs defined more than once.
599
601 SmallDenseSet<int> StoredFIs;
602
603 // Walk the entire region, count number of defs for each register, and
604 // collect potential LICM candidates.
605 for (MachineBasicBlock *BB : CurLoop->getBlocks()) {
606 // If the header of the loop containing this basic block is a landing pad,
607 // then don't try to hoist instructions out of this loop.
608 const MachineLoop *ML = MLI->getLoopFor(BB);
609 if (ML && ML->getHeader()->isEHPad()) continue;
610
611 // Conservatively treat live-in's as an external def.
612 // FIXME: That means a reload that're reused in successor block(s) will not
613 // be LICM'ed.
614 for (const auto &LI : BB->liveins()) {
615 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg))
616 RUDefs.set(static_cast<unsigned>(Unit));
617 }
618
619 // Funclet entry blocks will clobber all registers
620 if (const uint32_t *Mask = BB->getBeginClobberMask(TRI))
621 applyBitsNotInRegMaskToRegUnitsMask(*TRI, RUClobbers, Mask);
622
623 // EH landing pads clobber exception pointer/selector registers.
624 if (BB->isEHPad()) {
625 const MachineFunction &MF = *BB->getParent();
626 const Constant *PersonalityFn = MF.getFunction().getPersonalityFn();
627 const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
628 if (MCRegister Reg = TLI.getExceptionPointerRegister(PersonalityFn))
629 for (MCRegUnit Unit : TRI->regunits(Reg))
630 RUClobbers.set(static_cast<unsigned>(Unit));
631 if (MCRegister Reg = TLI.getExceptionSelectorRegister(PersonalityFn))
632 for (MCRegUnit Unit : TRI->regunits(Reg))
633 RUClobbers.set(static_cast<unsigned>(Unit));
634 }
635
636 SpeculationState = SpeculateUnknown;
637 for (MachineInstr &MI : *BB)
638 ProcessMI(&MI, RUDefs, RUClobbers, StoredFIs, Candidates, CurLoop);
639 }
640
641 // Gather the registers read / clobbered by the terminator.
642 BitVector TermRUs(NumRegUnits);
644 if (TI != Preheader->end()) {
645 for (const MachineOperand &MO : TI->operands()) {
646 if (!MO.isReg())
647 continue;
648 Register Reg = MO.getReg();
649 if (!Reg)
650 continue;
651 for (MCRegUnit Unit : TRI->regunits(Reg))
652 TermRUs.set(static_cast<unsigned>(Unit));
653 }
654 }
655
656 // Now evaluate whether the potential candidates qualify.
657 // 1. Check if the candidate defined register is defined by another
658 // instruction in the loop.
659 // 2. If the candidate is a load from stack slot (always true for now),
660 // check if the slot is stored anywhere in the loop.
661 // 3. Make sure candidate def should not clobber
662 // registers read by the terminator. Similarly its def should not be
663 // clobbered by the terminator.
664 for (CandidateInfo &Candidate : Candidates) {
665 if (Candidate.FI != std::numeric_limits<int>::min() &&
666 StoredFIs.count(Candidate.FI))
667 continue;
668
669 Register Def = Candidate.Def;
670 bool Safe = true;
671 for (MCRegUnit Unit : TRI->regunits(Def)) {
672 if (RUClobbers.test(static_cast<unsigned>(Unit)) ||
673 TermRUs.test(static_cast<unsigned>(Unit))) {
674 Safe = false;
675 break;
676 }
677 }
678
679 if (!Safe)
680 continue;
681
682 MachineInstr *MI = Candidate.MI;
683 for (const MachineOperand &MO : MI->all_uses()) {
684 if (!MO.getReg())
685 continue;
686 for (MCRegUnit Unit : TRI->regunits(MO.getReg())) {
687 if (RUDefs.test(static_cast<unsigned>(Unit)) ||
688 RUClobbers.test(static_cast<unsigned>(Unit))) {
689 // If it's using a non-loop-invariant register, then it's obviously
690 // not safe to hoist.
691 Safe = false;
692 break;
693 }
694 }
695
696 if (!Safe)
697 break;
698 }
699
700 if (Safe)
701 HoistPostRA(MI, Candidate.Def, CurLoop);
702 }
703}
704
705/// Add register 'Reg' to the livein sets of BBs in the current loop, and make
706/// sure it is not killed by any instructions in the loop.
707void MachineLICMImpl::AddToLiveIns(MCRegister Reg, MachineLoop *CurLoop) {
708 for (MachineBasicBlock *BB : CurLoop->getBlocks()) {
709 if (!BB->isLiveIn(Reg))
710 BB->addLiveIn(Reg);
711 for (MachineInstr &MI : *BB) {
712 for (MachineOperand &MO : MI.all_uses()) {
713 if (!MO.getReg())
714 continue;
715 if (TRI->regsOverlap(Reg, MO.getReg()))
716 MO.setIsKill(false);
717 }
718 }
719 }
720}
721
722/// When an instruction is found to only use loop invariant operands that is
723/// safe to hoist, this instruction is called to do the dirty work.
724void MachineLICMImpl::HoistPostRA(MachineInstr *MI, Register Def,
725 MachineLoop *CurLoop) {
726 MachineBasicBlock *Preheader = CurLoop->getLoopPreheader();
727
728 // Now move the instructions to the predecessor, inserting it before any
729 // terminator instructions.
730 LLVM_DEBUG(dbgs() << "Hoisting to " << printMBBReference(*Preheader)
731 << " from " << printMBBReference(*MI->getParent()) << ": "
732 << *MI);
733
734 // Splice the instruction to the preheader.
735 MachineBasicBlock *MBB = MI->getParent();
736 Preheader->splice(Preheader->getFirstTerminator(), MBB, MI);
737
738 // Since we are moving the instruction out of its basic block, we do not
739 // retain its debug location. Doing so would degrade the debugging
740 // experience and adversely affect the accuracy of profiling information.
741 assert(!MI->isDebugInstr() && "Should not hoist debug inst");
742 MI->setDebugLoc(DebugLoc());
743
744 // Add register to livein list to all the BBs in the current loop since a
745 // loop invariant must be kept live throughout the whole loop. This is
746 // important to ensure later passes do not scavenge the def register.
747 AddToLiveIns(Def, CurLoop);
748
749 ++NumPostRAHoisted;
750 Changed = true;
751}
752
753/// Check if this mbb is guaranteed to execute. If not then a load from this mbb
754/// may not be safe to hoist.
755bool MachineLICMImpl::IsGuaranteedToExecute(MachineBasicBlock *BB,
756 MachineLoop *CurLoop) {
757 if (SpeculationState != SpeculateUnknown)
758 return SpeculationState == SpeculateFalse;
759
760 if (BB != CurLoop->getHeader()) {
761 // Check loop exiting blocks.
762 SmallVector<MachineBasicBlock*, 8> CurrentLoopExitingBlocks;
763 CurLoop->getExitingBlocks(CurrentLoopExitingBlocks);
764 for (MachineBasicBlock *CurrentLoopExitingBlock : CurrentLoopExitingBlocks)
765 if (!MDTU->getDomTree().dominates(BB, CurrentLoopExitingBlock)) {
766 SpeculationState = SpeculateTrue;
767 return false;
768 }
769 }
770
771 SpeculationState = SpeculateFalse;
772 return true;
773}
774
775void MachineLICMImpl::EnterScope(MachineBasicBlock *MBB) {
776 LLVM_DEBUG(dbgs() << "Entering " << printMBBReference(*MBB) << '\n');
777
778 // Remember livein register pressure.
779 BackTrace.push_back(RegPressure);
780}
781
782void MachineLICMImpl::ExitScope(MachineBasicBlock *MBB) {
783 LLVM_DEBUG(dbgs() << "Exiting " << printMBBReference(*MBB) << '\n');
784 BackTrace.pop_back();
785}
786
787/// Destroy scope for the MBB that corresponds to the given dominator tree node
788/// if its a leaf or all of its children are done. Walk up the dominator tree to
789/// destroy ancestors which are now done.
790void MachineLICMImpl::ExitScopeIfDone(
791 MachineDomTreeNode *Node,
792 DenseMap<MachineDomTreeNode *, unsigned> &OpenChildren,
793 const DenseMap<MachineDomTreeNode *, MachineDomTreeNode *> &ParentMap) {
794 if (OpenChildren[Node])
795 return;
796
797 for(;;) {
798 ExitScope(Node->getBlock());
799 // Now traverse upwards to pop ancestors whose offsprings are all done.
800 MachineDomTreeNode *Parent = ParentMap.lookup(Node);
801 if (!Parent || --OpenChildren[Parent] != 0)
802 break;
803 Node = Parent;
804 }
805}
806
807/// Walk the specified loop in the CFG (defined by all blocks dominated by the
808/// specified header block, and that are in the current loop) in depth first
809/// order w.r.t the DominatorTree. This allows us to visit definitions before
810/// uses, allowing us to hoist a loop body in one pass without iteration.
811void MachineLICMImpl::HoistOutOfLoop(MachineDomTreeNode *HeaderN,
812 MachineLoop *CurLoop) {
813 MachineBasicBlock *Preheader = getOrCreatePreheader(CurLoop);
814 if (!Preheader)
815 return;
816
819 DenseMap<MachineDomTreeNode*, MachineDomTreeNode*> ParentMap;
820 DenseMap<MachineDomTreeNode*, unsigned> OpenChildren;
821
822 // Perform a DFS walk to determine the order of visit.
823 WorkList.push_back(HeaderN);
824 while (!WorkList.empty()) {
826 assert(Node && "Null dominator tree node?");
827 MachineBasicBlock *BB = Node->getBlock();
828
829 // If the header of the loop containing this basic block is a landing pad,
830 // then don't try to hoist instructions out of this loop.
831 const MachineLoop *ML = MLI->getLoopFor(BB);
832 if (ML && ML->getHeader()->isEHPad())
833 continue;
834
835 // If this subregion is not in the top level loop at all, exit.
836 if (!CurLoop->contains(BB))
837 continue;
838
839 Scopes.push_back(Node);
840 unsigned NumChildren = Node->getNumChildren();
841
842 // Don't hoist things out of a large switch statement. This often causes
843 // code to be hoisted that wasn't going to be executed, and increases
844 // register pressure in a situation where it's likely to matter.
845 if (BB->succ_size() >= 25)
846 NumChildren = 0;
847
848 OpenChildren[Node] = NumChildren;
849 if (NumChildren) {
850 // Add children in reverse order as then the next popped worklist node is
851 // the first child of this node. This means we ultimately traverse the
852 // DOM tree in exactly the same order as if we'd recursed.
853 for (MachineDomTreeNode *Child : reverse(Node->children())) {
854 ParentMap[Child] = Node;
855 WorkList.push_back(Child);
856 }
857 }
858 }
859
860 if (Scopes.size() == 0)
861 return;
862
863 // Compute registers which are livein into the loop headers.
864 RegSeen.clear();
865 BackTrace.clear();
866 InitRegPressure(Preheader);
867
868 // Now perform LICM.
869 for (MachineDomTreeNode *Node : Scopes) {
870 MachineBasicBlock *MBB = Node->getBlock();
871
872 EnterScope(MBB);
873
874 // Process the block
875 SpeculationState = SpeculateUnknown;
876 for (MachineInstr &MI : llvm::make_early_inc_range(*MBB)) {
877 unsigned HoistRes = HoistResult::NotHoisted;
878 HoistRes = Hoist(&MI, Preheader, CurLoop);
879 if (HoistRes & HoistResult::NotHoisted) {
880 // We have failed to hoist MI to outermost loop's preheader. If MI is in
881 // a subloop, try to hoist it to subloop's preheader.
882 SmallVector<MachineLoop *> InnerLoopWorkList;
883 for (MachineLoop *L = MLI->getLoopFor(MI.getParent()); L != CurLoop;
884 L = L->getParentLoop())
885 InnerLoopWorkList.push_back(L);
886
887 while (!InnerLoopWorkList.empty()) {
888 MachineLoop *InnerLoop = InnerLoopWorkList.pop_back_val();
889 MachineBasicBlock *InnerLoopPreheader = InnerLoop->getLoopPreheader();
890 if (InnerLoopPreheader) {
891 HoistRes = Hoist(&MI, InnerLoopPreheader, InnerLoop);
892 if (HoistRes & HoistResult::Hoisted)
893 break;
894 }
895 }
896 }
897
898 if (HoistRes & HoistResult::ErasedMI)
899 continue;
900
901 UpdateRegPressure(&MI);
902 }
903
904 // If it's a leaf node, it's done. Traverse upwards to pop ancestors.
905 ExitScopeIfDone(Node, OpenChildren, ParentMap);
906 }
907}
908
910 return MO.isKill() || MRI->hasOneNonDBGUse(MO.getReg());
911}
912
913/// Find all virtual register references that are liveout of the preheader to
914/// initialize the starting "register pressure". Note this does not count live
915/// through (livein but not used) registers.
916void MachineLICMImpl::InitRegPressure(MachineBasicBlock *BB) {
917 llvm::fill(RegPressure, 0);
918
919 // If the preheader has only a single predecessor and it ends with a
920 // fallthrough or an unconditional branch, then scan its predecessor for live
921 // defs as well. This happens whenever the preheader is created by splitting
922 // the critical edge from the loop predecessor to the loop header.
923 if (BB->pred_size() == 1) {
924 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
926 if (!TII->analyzeBranch(*BB, TBB, FBB, Cond, false) && Cond.empty())
927 InitRegPressure(*BB->pred_begin());
928 }
929
930 for (const MachineInstr &MI : *BB)
931 UpdateRegPressure(&MI, /*ConsiderUnseenAsDef=*/true);
932}
933
934/// Update estimate of register pressure after the specified instruction.
935void MachineLICMImpl::UpdateRegPressure(const MachineInstr *MI,
936 bool ConsiderUnseenAsDef) {
937 auto Cost = calcRegisterCost(MI, /*ConsiderSeen=*/true, ConsiderUnseenAsDef);
938 for (const auto &[Class, Weight] : Cost) {
939 if (static_cast<int>(RegPressure[Class]) < -Weight)
940 RegPressure[Class] = 0;
941 else
942 RegPressure[Class] += Weight;
943 }
944}
945
946/// Calculate the additional register pressure that the registers used in MI
947/// cause.
948///
949/// If 'ConsiderSeen' is true, updates 'RegSeen' and uses the information to
950/// figure out which usages are live-ins.
951/// FIXME: Figure out a way to consider 'RegSeen' from all code paths.
952SmallDenseMap<unsigned, int>
953MachineLICMImpl::calcRegisterCost(const MachineInstr *MI, bool ConsiderSeen,
954 bool ConsiderUnseenAsDef) {
955 SmallDenseMap<unsigned, int> Cost;
956 if (MI->isImplicitDef())
957 return Cost;
958 for (unsigned i = 0, e = MI->getDesc().getNumOperands(); i != e; ++i) {
959 const MachineOperand &MO = MI->getOperand(i);
960 if (!MO.isReg() || MO.isImplicit())
961 continue;
962 Register Reg = MO.getReg();
963 if (!Reg.isVirtual())
964 continue;
965
966 // FIXME: It seems bad to use RegSeen only for some of these calculations.
967 bool isNew = ConsiderSeen ? RegSeen.insert(Reg).second : false;
968 const TargetRegisterClass *RC = MRI->getRegClass(Reg);
969
970 RegClassWeight W = TRI->getRegClassWeight(RC);
971 int RCCost = 0;
972 if (MO.isDef())
973 RCCost = W.RegWeight;
974 else {
975 bool isKill = isOperandKill(MO, MRI);
976 if (isNew && !isKill && ConsiderUnseenAsDef)
977 // Haven't seen this, it must be a livein.
978 RCCost = W.RegWeight;
979 else if (!isNew && isKill)
980 RCCost = -W.RegWeight;
981 }
982 if (RCCost == 0)
983 continue;
984 const int *PS = TRI->getRegClassPressureSets(RC);
985 for (; *PS != -1; ++PS)
986 Cost[*PS] += RCCost;
987 }
988 return Cost;
989}
990
991/// Return true if this machine instruction loads from global offset table or
992/// constant pool.
994 assert(MI.mayLoad() && "Expected MI that loads!");
995
996 // If we lost memory operands, conservatively assume that the instruction
997 // reads from everything..
998 if (MI.memoperands_empty())
999 return true;
1000
1001 for (MachineMemOperand *MemOp : MI.memoperands())
1002 if (const PseudoSourceValue *PSV = MemOp->getPseudoValue())
1003 if (PSV->isGOT() || PSV->isConstantPool())
1004 return true;
1005
1006 return false;
1007}
1008
1009// This function iterates through all the operands of the input store MI and
1010// checks that each register operand statisfies isCallerPreservedPhysReg.
1011// This means, the value being stored and the address where it is being stored
1012// is constant throughout the body of the function (not including prologue and
1013// epilogue). When called with an MI that isn't a store, it returns false.
1014// A future improvement can be to check if the store registers are constant
1015// throughout the loop rather than throughout the funtion.
1017 const TargetRegisterInfo *TRI,
1018 const MachineRegisterInfo *MRI) {
1019
1020 bool FoundCallerPresReg = false;
1021 if (!MI.mayStore() || MI.hasUnmodeledSideEffects() ||
1022 (MI.getNumOperands() == 0))
1023 return false;
1024
1025 // Check that all register operands are caller-preserved physical registers.
1026 for (const MachineOperand &MO : MI.operands()) {
1027 if (MO.isReg()) {
1028 Register Reg = MO.getReg();
1029 // If operand is a virtual register, check if it comes from a copy of a
1030 // physical register.
1031 if (Reg.isVirtual())
1032 Reg = TRI->lookThruCopyLike(MO.getReg(), MRI);
1033 if (Reg.isVirtual())
1034 return false;
1035 if (!TRI->isCallerPreservedPhysReg(Reg.asMCReg(), *MI.getMF()))
1036 return false;
1037 else
1038 FoundCallerPresReg = true;
1039 } else if (!MO.isImm()) {
1040 return false;
1041 }
1042 }
1043 return FoundCallerPresReg;
1044}
1045
1046// Return true if the input MI is a copy instruction that feeds an invariant
1047// store instruction. This means that the src of the copy has to satisfy
1048// isCallerPreservedPhysReg and atleast one of it's users should satisfy
1049// isInvariantStore.
1051 const MachineRegisterInfo *MRI,
1052 const TargetRegisterInfo *TRI) {
1053
1054 // FIXME: If targets would like to look through instructions that aren't
1055 // pure copies, this can be updated to a query.
1056 if (!MI.isCopy())
1057 return false;
1058
1059 const MachineFunction *MF = MI.getMF();
1060 // Check that we are copying a constant physical register.
1061 Register CopySrcReg = MI.getOperand(1).getReg();
1062 if (CopySrcReg.isVirtual())
1063 return false;
1064
1065 if (!TRI->isCallerPreservedPhysReg(CopySrcReg.asMCReg(), *MF))
1066 return false;
1067
1068 Register CopyDstReg = MI.getOperand(0).getReg();
1069 // Check if any of the uses of the copy are invariant stores.
1070 assert(CopyDstReg.isVirtual() && "copy dst is not a virtual reg");
1071
1072 for (MachineInstr &UseMI : MRI->use_instructions(CopyDstReg)) {
1073 if (UseMI.mayStore() && isInvariantStore(UseMI, TRI, MRI))
1074 return true;
1075 }
1076 return false;
1077}
1078
1079/// Returns true if the instruction may be a suitable candidate for LICM.
1080/// e.g. If the instruction is a call, then it's obviously not safe to hoist it.
1081bool MachineLICMImpl::IsLICMCandidate(MachineInstr &I, MachineLoop *CurLoop) {
1082 // Check if it's safe to move the instruction.
1083 bool DontMoveAcrossStore = !HoistConstLoads || !AllowedToHoistLoads[CurLoop];
1084 if ((!I.isSafeToMove(DontMoveAcrossStore)) &&
1086 LLVM_DEBUG(dbgs() << "LICM: Instruction not safe to move.\n");
1087 return false;
1088 }
1089
1090 // If it is a load then check if it is guaranteed to execute by making sure
1091 // that it dominates all exiting blocks. If it doesn't, then there is a path
1092 // out of the loop which does not execute this load, so we can't hoist it.
1093 // Loads from constant memory are safe to speculate, for example indexed load
1094 // from a jump table.
1095 // Stores and side effects are already checked by isSafeToMove.
1096 if (I.mayLoad() && !mayLoadFromGOTOrConstantPool(I) &&
1097 !IsGuaranteedToExecute(I.getParent(), CurLoop)) {
1098 LLVM_DEBUG(dbgs() << "LICM: Load not guaranteed to execute.\n");
1099 return false;
1100 }
1101
1102 // Convergent attribute has been used on operations that involve inter-thread
1103 // communication which results are implicitly affected by the enclosing
1104 // control flows. It is not safe to hoist or sink such operations across
1105 // control flow.
1106 if (I.isConvergent())
1107 return false;
1108
1109 if (!TII->shouldHoist(I, CurLoop))
1110 return false;
1111
1112 return true;
1113}
1114
1115/// Returns true if the instruction is loop invariant.
1116bool MachineLICMImpl::IsLoopInvariantInst(MachineInstr &I,
1117 MachineLoop *CurLoop) {
1118 if (!IsLICMCandidate(I, CurLoop)) {
1119 LLVM_DEBUG(dbgs() << "LICM: Instruction not a LICM candidate\n");
1120 return false;
1121 }
1122 return CurLoop->isLoopInvariant(I);
1123}
1124
1125/// Return true if the specified instruction is used by a phi node and hoisting
1126/// it could cause a copy to be inserted.
1127bool MachineLICMImpl::HasLoopPHIUse(const MachineInstr *MI,
1128 MachineLoop *CurLoop) {
1130 do {
1131 MI = Work.pop_back_val();
1132 for (const MachineOperand &MO : MI->all_defs()) {
1133 Register Reg = MO.getReg();
1134 if (!Reg.isVirtual())
1135 continue;
1136 for (MachineInstr &UseMI : MRI->use_instructions(Reg)) {
1137 // A PHI may cause a copy to be inserted.
1138 if (UseMI.isPHI()) {
1139 // A PHI inside the loop causes a copy because the live range of Reg is
1140 // extended across the PHI.
1141 if (CurLoop->contains(&UseMI))
1142 return true;
1143 // A PHI in an exit block can cause a copy to be inserted if the PHI
1144 // has multiple predecessors in the loop with different values.
1145 // For now, approximate by rejecting all exit blocks.
1146 if (isExitBlock(CurLoop, UseMI.getParent()))
1147 return true;
1148 continue;
1149 }
1150 // Look past copies as well.
1151 if (UseMI.isCopy() && CurLoop->contains(&UseMI))
1152 Work.push_back(&UseMI);
1153 }
1154 }
1155 } while (!Work.empty());
1156 return false;
1157}
1158
1159/// Compute operand latency between a def of 'Reg' and an use in the current
1160/// loop, return true if the target considered it high.
1161bool MachineLICMImpl::HasHighOperandLatency(MachineInstr &MI, unsigned DefIdx,
1162 Register Reg,
1163 MachineLoop *CurLoop) const {
1164 if (MRI->use_nodbg_empty(Reg))
1165 return false;
1166
1167 for (MachineInstr &UseMI : MRI->use_nodbg_instructions(Reg)) {
1168 if (UseMI.isCopyLike())
1169 continue;
1170 if (!CurLoop->contains(UseMI.getParent()))
1171 continue;
1172 for (unsigned i = 0, e = UseMI.getNumOperands(); i != e; ++i) {
1173 const MachineOperand &MO = UseMI.getOperand(i);
1174 if (!MO.isReg() || !MO.isUse())
1175 continue;
1176 Register MOReg = MO.getReg();
1177 if (MOReg != Reg)
1178 continue;
1179
1180 if (TII->hasHighOperandLatency(SchedModel, MRI, MI, DefIdx, UseMI, i))
1181 return true;
1182 }
1183
1184 // Only look at the first in loop use.
1185 break;
1186 }
1187
1188 return false;
1189}
1190
1191/// Return true if the instruction is marked "cheap" or the operand latency
1192/// between its def and a use is one or less.
1193bool MachineLICMImpl::IsCheapInstruction(MachineInstr &MI) const {
1194 if (TII->isAsCheapAsAMove(MI) || MI.isSubregToReg())
1195 return true;
1196
1197 bool isCheap = false;
1198 unsigned NumDefs = MI.getDesc().getNumDefs();
1199 for (unsigned i = 0, e = MI.getNumOperands(); NumDefs && i != e; ++i) {
1200 MachineOperand &DefMO = MI.getOperand(i);
1201 if (!DefMO.isReg() || !DefMO.isDef())
1202 continue;
1203 --NumDefs;
1204 Register Reg = DefMO.getReg();
1205 if (Reg.isPhysical())
1206 continue;
1207
1208 if (!TII->hasLowDefLatency(SchedModel, MI, i))
1209 return false;
1210 isCheap = true;
1211 }
1212
1213 return isCheap;
1214}
1215
1216/// Visit BBs from header to current BB, check if hoisting an instruction of the
1217/// given cost matrix can cause high register pressure.
1218bool MachineLICMImpl::CanCauseHighRegPressure(
1219 const SmallDenseMap<unsigned, int> &Cost, bool CheapInstr) {
1220 for (const auto &[Class, Weight] : Cost) {
1221 if (Weight <= 0)
1222 continue;
1223
1224 int Limit = RegLimit[Class];
1225
1226 // Don't hoist cheap instructions if they would increase register pressure,
1227 // even if we're under the limit.
1228 if (CheapInstr && !HoistCheapInsts)
1229 return true;
1230
1231 for (const auto &RP : BackTrace)
1232 if (static_cast<int>(RP[Class]) + Weight >= Limit)
1233 return true;
1234 }
1235
1236 return false;
1237}
1238
1239/// Traverse the back trace from header to the current block and update their
1240/// register pressures to reflect the effect of hoisting MI from the current
1241/// block to the preheader.
1242void MachineLICMImpl::UpdateBackTraceRegPressure(const MachineInstr *MI) {
1243 // First compute the 'cost' of the instruction, i.e. its contribution
1244 // to register pressure.
1245 auto Cost = calcRegisterCost(MI, /*ConsiderSeen=*/false,
1246 /*ConsiderUnseenAsDef=*/false);
1247
1248 // Update register pressure of blocks from loop header to current block.
1249 for (auto &RP : BackTrace)
1250 for (const auto &[Class, Weight] : Cost)
1251 RP[Class] += Weight;
1252}
1253
1254/// Return true if it is potentially profitable to hoist the given loop
1255/// invariant.
1256bool MachineLICMImpl::IsProfitableToHoist(MachineInstr &MI,
1257 MachineLoop *CurLoop) {
1258 if (MI.isImplicitDef())
1259 return true;
1260
1261 // Besides removing computation from the loop, hoisting an instruction has
1262 // these effects:
1263 //
1264 // - The value defined by the instruction becomes live across the entire
1265 // loop. This increases register pressure in the loop.
1266 //
1267 // - If the value is used by a PHI in the loop, a copy will be required for
1268 // lowering the PHI after extending the live range.
1269 //
1270 // - When hoisting the last use of a value in the loop, that value no longer
1271 // needs to be live in the loop. This lowers register pressure in the loop.
1272
1274 return true;
1275
1276 bool CheapInstr = IsCheapInstruction(MI);
1277 bool CreatesCopy = HasLoopPHIUse(&MI, CurLoop);
1278
1279 // Don't hoist a cheap instruction if it would create a copy in the loop.
1280 if (CheapInstr && CreatesCopy) {
1281 LLVM_DEBUG(dbgs() << "Won't hoist cheap instr with loop PHI use: " << MI);
1282 return false;
1283 }
1284
1285 // Trivially rematerializable instructions should always be hoisted
1286 // providing the register allocator can just pull them down again when needed.
1287 if (TII->isTriviallyReMaterializable(MI))
1288 return true;
1289
1290 // FIXME: If there are long latency loop-invariant instructions inside the
1291 // loop at this point, why didn't the optimizer's LICM hoist them?
1292 for (unsigned i = 0, e = MI.getDesc().getNumOperands(); i != e; ++i) {
1293 const MachineOperand &MO = MI.getOperand(i);
1294 if (!MO.isReg() || MO.isImplicit())
1295 continue;
1296 Register Reg = MO.getReg();
1297 if (!Reg.isVirtual())
1298 continue;
1299 if (MO.isDef() && HasHighOperandLatency(MI, i, Reg, CurLoop)) {
1300 LLVM_DEBUG(dbgs() << "Hoist High Latency: " << MI);
1301 ++NumHighLatency;
1302 return true;
1303 }
1304 }
1305
1306 // Estimate register pressure to determine whether to LICM the instruction.
1307 // In low register pressure situation, we can be more aggressive about
1308 // hoisting. Also, favors hoisting long latency instructions even in
1309 // moderately high pressure situation.
1310 // Cheap instructions will only be hoisted if they don't increase register
1311 // pressure at all.
1312 auto Cost = calcRegisterCost(&MI, /*ConsiderSeen=*/false,
1313 /*ConsiderUnseenAsDef=*/false);
1314
1315 // Visit BBs from header to current BB, if hoisting this doesn't cause
1316 // high register pressure, then it's safe to proceed.
1317 if (!CanCauseHighRegPressure(Cost, CheapInstr)) {
1318 LLVM_DEBUG(dbgs() << "Hoist non-reg-pressure: " << MI);
1319 ++NumLowRP;
1320 return true;
1321 }
1322
1323 // Don't risk increasing register pressure if it would create copies.
1324 if (CreatesCopy) {
1325 LLVM_DEBUG(dbgs() << "Won't hoist instr with loop PHI use: " << MI);
1326 return false;
1327 }
1328
1329 // Do not "speculate" in high register pressure situation. If an
1330 // instruction is not guaranteed to be executed in the loop, it's best to be
1331 // conservative.
1332 if (AvoidSpeculation &&
1333 (!IsGuaranteedToExecute(MI.getParent(), CurLoop) && !MayCSE(&MI))) {
1334 LLVM_DEBUG(dbgs() << "Won't speculate: " << MI);
1335 return false;
1336 }
1337
1338 // If we have a COPY with other uses in the loop, hoist to allow the users to
1339 // also be hoisted.
1340 // TODO: Handle all isCopyLike?
1341 if (MI.isCopy() || MI.isRegSequence()) {
1342 Register DefReg = MI.getOperand(0).getReg();
1343 if (DefReg.isVirtual() &&
1344 all_of(MI.uses(),
1345 [this](const MachineOperand &UseOp) {
1346 return !UseOp.isReg() || UseOp.getReg().isVirtual() ||
1347 MRI->isConstantPhysReg(UseOp.getReg());
1348 }) &&
1349 IsLoopInvariantInst(MI, CurLoop) &&
1350 any_of(MRI->use_nodbg_instructions(DefReg),
1351 [&CurLoop, this, DefReg,
1352 Cost = std::move(Cost)](MachineInstr &UseMI) {
1353 if (!CurLoop->contains(&UseMI))
1354 return false;
1355
1356 // COPY is a cheap instruction, but if moving it won't cause
1357 // high RP we're fine to hoist it even if the user can't be
1358 // hoisted later Otherwise we want to check the user if it's
1359 // hoistable
1360 if (CanCauseHighRegPressure(Cost, false) &&
1361 !CurLoop->isLoopInvariant(UseMI, DefReg))
1362 return false;
1363
1364 return true;
1365 }))
1366 return true;
1367 }
1368
1369 // High register pressure situation, only hoist if the instruction is going
1370 // to be remat'ed.
1371 if (!TII->isTriviallyReMaterializable(MI) &&
1372 !MI.isDereferenceableInvariantLoad()) {
1373 LLVM_DEBUG(dbgs() << "Can't remat / high reg-pressure: " << MI);
1374 return false;
1375 }
1376
1377 return true;
1378}
1379
1380/// Unfold a load from the given machineinstr if the load itself could be
1381/// hoisted. Return the unfolded and hoistable load, or null if the load
1382/// couldn't be unfolded or if it wouldn't be hoistable.
1383MachineInstr *MachineLICMImpl::ExtractHoistableLoad(MachineInstr *MI,
1384 MachineLoop *CurLoop) {
1385 // Don't unfold simple loads.
1386 if (MI->canFoldAsLoad())
1387 return nullptr;
1388
1389 // If not, we may be able to unfold a load and hoist that.
1390 // First test whether the instruction is loading from an amenable
1391 // memory location.
1392 if (!MI->isDereferenceableInvariantLoad())
1393 return nullptr;
1394
1395 // Next determine the register class for a temporary register.
1396 unsigned LoadRegIndex;
1397 unsigned NewOpc =
1398 TII->getOpcodeAfterMemoryUnfold(MI->getOpcode(),
1399 /*UnfoldLoad=*/true,
1400 /*UnfoldStore=*/false,
1401 &LoadRegIndex);
1402 if (NewOpc == 0) return nullptr;
1403 const MCInstrDesc &MID = TII->get(NewOpc);
1404 MachineFunction &MF = *MI->getMF();
1405 const TargetRegisterClass *RC = TII->getRegClass(MID, LoadRegIndex);
1406 // Ok, we're unfolding. Create a temporary register and do the unfold.
1407 Register Reg = MRI->createVirtualRegister(RC);
1408
1409 SmallVector<MachineInstr *, 2> NewMIs;
1410 bool Success = TII->unfoldMemoryOperand(MF, *MI, Reg,
1411 /*UnfoldLoad=*/true,
1412 /*UnfoldStore=*/false, NewMIs);
1413 (void)Success;
1414 assert(Success &&
1415 "unfoldMemoryOperand failed when getOpcodeAfterMemoryUnfold "
1416 "succeeded!");
1417 assert(NewMIs.size() == 2 &&
1418 "Unfolded a load into multiple instructions!");
1419 MachineBasicBlock *MBB = MI->getParent();
1421 MBB->insert(Pos, NewMIs[0]);
1422 MBB->insert(Pos, NewMIs[1]);
1423 // If unfolding produced a load that wasn't loop-invariant or profitable to
1424 // hoist, discard the new instructions and bail.
1425 if (!IsLoopInvariantInst(*NewMIs[0], CurLoop) ||
1426 !IsProfitableToHoist(*NewMIs[0], CurLoop)) {
1427 NewMIs[0]->eraseFromParent();
1428 NewMIs[1]->eraseFromParent();
1429 return nullptr;
1430 }
1431
1432 // Update register pressure for the unfolded instruction.
1433 UpdateRegPressure(NewMIs[1]);
1434
1435 // Otherwise we successfully unfolded a load that we can hoist.
1436
1437 // Update the call info.
1438 if (MI->shouldUpdateAdditionalCallInfo())
1440
1441 MI->eraseFromParent();
1442 return NewMIs[0];
1443}
1444
1445/// Initialize the CSE map with instructions that are in the current loop
1446/// preheader that may become duplicates of instructions that are hoisted
1447/// out of the loop.
1448void MachineLICMImpl::InitCSEMap(MachineBasicBlock *BB) {
1449 for (MachineInstr &MI : *BB)
1450 CSEMap[BB][MI.getOpcode()].push_back(&MI);
1451}
1452
1453/// Initialize AllowedToHoistLoads with information about whether invariant
1454/// loads can be moved outside a given loop
1455void MachineLICMImpl::InitializeLoadsHoistableLoops() {
1456 SmallVector<MachineLoop *, 8> Worklist(MLI->begin(), MLI->end());
1457 SmallVector<MachineLoop *, 8> LoopsInPreOrder;
1458
1459 // Mark all loops as hoistable initially and prepare a list of loops in
1460 // pre-order DFS.
1461 while (!Worklist.empty()) {
1462 auto *L = Worklist.pop_back_val();
1463 AllowedToHoistLoads[L] = true;
1464 LoopsInPreOrder.push_back(L);
1465 llvm::append_range(Worklist, L->getSubLoops());
1466 }
1467
1468 // Going from the innermost to outermost loops, check if a loop has
1469 // instructions preventing invariant load hoisting. If such instruction is
1470 // found, mark this loop and its parent as non-hoistable and continue
1471 // investigating the next loop.
1472 // Visiting in a reversed pre-ordered DFS manner
1473 // allows us to not process all the instructions of the outer loop if the
1474 // inner loop is proved to be non-load-hoistable.
1475 for (auto *Loop : reverse(LoopsInPreOrder)) {
1476 for (auto *MBB : Loop->blocks()) {
1477 // If this loop has already been marked as non-hoistable, skip it.
1478 if (!AllowedToHoistLoads[Loop])
1479 continue;
1480 for (auto &MI : *MBB) {
1481 if (!MI.isLoadFoldBarrier() && !MI.mayStore() && !MI.isCall() &&
1482 !(MI.mayLoad() && MI.hasOrderedMemoryRef()))
1483 continue;
1484 for (MachineLoop *L = Loop; L != nullptr; L = L->getParentLoop())
1485 AllowedToHoistLoads[L] = false;
1486 break;
1487 }
1488 }
1489 }
1490}
1491
1492/// Find an instruction amount PrevMIs that is a duplicate of MI.
1493/// Return this instruction if it's found.
1494MachineInstr *
1495MachineLICMImpl::LookForDuplicate(const MachineInstr *MI,
1496 std::vector<MachineInstr *> &PrevMIs) {
1497 for (MachineInstr *PrevMI : PrevMIs)
1498 if (TII->produceSameValue(*MI, *PrevMI, (PreRegAlloc ? MRI : nullptr)))
1499 return PrevMI;
1500
1501 return nullptr;
1502}
1503
1504/// Given a LICM'ed instruction, look for an instruction on the preheader that
1505/// computes the same value. If it's found, do a RAU on with the definition of
1506/// the existing instruction rather than hoisting the instruction to the
1507/// preheader.
1508bool MachineLICMImpl::EliminateCSE(
1509 MachineInstr *MI,
1510 DenseMap<unsigned, std::vector<MachineInstr *>>::iterator &CI) {
1511 // Do not CSE implicit_def so ProcessImplicitDefs can properly propagate
1512 // the undef property onto uses.
1513 if (MI->isImplicitDef())
1514 return false;
1515
1516 // Do not CSE normal loads because between them could be store instructions
1517 // that change the loaded value
1518 if (MI->mayLoad() && !MI->isDereferenceableInvariantLoad())
1519 return false;
1520
1521 if (MachineInstr *Dup = LookForDuplicate(MI, CI->second)) {
1522 LLVM_DEBUG(dbgs() << "CSEing " << *MI << " with " << *Dup);
1523
1524 // Replace virtual registers defined by MI by their counterparts defined
1525 // by Dup.
1526 SmallVector<unsigned, 2> Defs;
1527 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
1528 const MachineOperand &MO = MI->getOperand(i);
1529
1530 // Physical registers may not differ here.
1531 assert((!MO.isReg() || MO.getReg() == 0 || !MO.getReg().isPhysical() ||
1532 MO.getReg() == Dup->getOperand(i).getReg()) &&
1533 "Instructions with different phys regs are not identical!");
1534
1535 if (MO.isReg() && MO.isDef() && !MO.getReg().isPhysical())
1536 Defs.push_back(i);
1537 }
1538
1540 for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
1541 unsigned Idx = Defs[i];
1542 Register Reg = MI->getOperand(Idx).getReg();
1543 Register DupReg = Dup->getOperand(Idx).getReg();
1544 OrigRCs.push_back(MRI->getRegClass(DupReg));
1545
1546 if (!MRI->constrainRegClass(DupReg, MRI->getRegClass(Reg))) {
1547 // Restore old RCs if more than one defs.
1548 for (unsigned j = 0; j != i; ++j)
1549 MRI->setRegClass(Dup->getOperand(Defs[j]).getReg(), OrigRCs[j]);
1550 return false;
1551 }
1552 }
1553
1554 for (unsigned Idx : Defs) {
1555 Register Reg = MI->getOperand(Idx).getReg();
1556 Register DupReg = Dup->getOperand(Idx).getReg();
1557 MRI->replaceRegWith(Reg, DupReg);
1558 MRI->clearKillFlags(DupReg);
1559 // Clear Dup dead flag if any, we reuse it for Reg.
1560 if (!MRI->use_nodbg_empty(DupReg))
1561 Dup->getOperand(Idx).setIsDead(false);
1562 }
1563
1564 MI->eraseFromParent();
1565 ++NumCSEed;
1566 return true;
1567 }
1568 return false;
1569}
1570
1571/// Return true if the given instruction will be CSE'd if it's hoisted out of
1572/// the loop.
1573bool MachineLICMImpl::MayCSE(MachineInstr *MI) {
1574 if (MI->mayLoad() && !MI->isDereferenceableInvariantLoad())
1575 return false;
1576
1577 unsigned Opcode = MI->getOpcode();
1578 for (auto &Map : CSEMap) {
1579 // Check this CSEMap's preheader dominates MI's basic block.
1580 if (MDTU->getDomTree().dominates(Map.first, MI->getParent())) {
1581 DenseMap<unsigned, std::vector<MachineInstr *>>::iterator CI =
1582 Map.second.find(Opcode);
1583 // Do not CSE implicit_def so ProcessImplicitDefs can properly propagate
1584 // the undef property onto uses.
1585 if (CI == Map.second.end() || MI->isImplicitDef())
1586 continue;
1587 if (LookForDuplicate(MI, CI->second) != nullptr)
1588 return true;
1589 }
1590 }
1591
1592 return false;
1593}
1594
1595/// When an instruction is found to use only loop invariant operands
1596/// that are safe to hoist, this instruction is called to do the dirty work.
1597/// It returns true if the instruction is hoisted.
1598unsigned MachineLICMImpl::Hoist(MachineInstr *MI, MachineBasicBlock *Preheader,
1599 MachineLoop *CurLoop) {
1600 MachineBasicBlock *SrcBlock = MI->getParent();
1601
1602 // Disable the instruction hoisting due to block hotness
1604 (DisableHoistingToHotterBlocks == UseBFI::PGO && HasProfileData)) &&
1605 isTgtHotterThanSrc(SrcBlock, Preheader)) {
1606 ++NumNotHoistedDueToHotness;
1607 return HoistResult::NotHoisted;
1608 }
1609 // First check whether we should hoist this instruction.
1610 bool HasExtractHoistableLoad = false;
1611 if (!IsLoopInvariantInst(*MI, CurLoop) ||
1612 !IsProfitableToHoist(*MI, CurLoop)) {
1613 // If not, try unfolding a hoistable load.
1614 MI = ExtractHoistableLoad(MI, CurLoop);
1615 if (!MI)
1616 return HoistResult::NotHoisted;
1617 HasExtractHoistableLoad = true;
1618 }
1619
1620 // If we have hoisted an instruction that may store, it can only be a constant
1621 // store.
1622 if (MI->mayStore())
1623 NumStoreConst++;
1624
1625 // Now move the instructions to the predecessor, inserting it before any
1626 // terminator instructions.
1627 LLVM_DEBUG({
1628 dbgs() << "Hoisting " << *MI;
1629 if (MI->getParent()->getBasicBlock())
1630 dbgs() << " from " << printMBBReference(*MI->getParent());
1631 if (Preheader->getBasicBlock())
1632 dbgs() << " to " << printMBBReference(*Preheader);
1633 dbgs() << "\n";
1634 });
1635
1636 // If this is the first instruction being hoisted to the preheader,
1637 // initialize the CSE map with potential common expressions.
1638 if (FirstInLoop) {
1639 InitCSEMap(Preheader);
1640 FirstInLoop = false;
1641 }
1642
1643 // Look for opportunity to CSE the hoisted instruction.
1644 unsigned Opcode = MI->getOpcode();
1645 bool HasCSEDone = false;
1646 for (auto &Map : CSEMap) {
1647 // Check this CSEMap's preheader dominates MI's basic block.
1648 if (MDTU->getDomTree().dominates(Map.first, MI->getParent())) {
1649 DenseMap<unsigned, std::vector<MachineInstr *>>::iterator CI =
1650 Map.second.find(Opcode);
1651 if (CI != Map.second.end()) {
1652 if (EliminateCSE(MI, CI)) {
1653 HasCSEDone = true;
1654 break;
1655 }
1656 }
1657 }
1658 }
1659
1660 if (!HasCSEDone) {
1661 // Otherwise, splice the instruction to the preheader.
1662 Preheader->splice(Preheader->getFirstTerminator(),MI->getParent(),MI);
1663
1664 // Since we are moving the instruction out of its basic block, we do not
1665 // retain its debug location. Doing so would degrade the debugging
1666 // experience and adversely affect the accuracy of profiling information.
1667 assert(!MI->isDebugInstr() && "Should not hoist debug inst");
1668 MI->setDebugLoc(DebugLoc());
1669
1670 // Update register pressure for BBs from header to this block.
1671 UpdateBackTraceRegPressure(MI);
1672
1673 // Clear the kill flags of any register this instruction defines,
1674 // since they may need to be live throughout the entire loop
1675 // rather than just live for part of it.
1676 for (MachineOperand &MO : MI->all_defs())
1677 if (!MO.isDead())
1678 MRI->clearKillFlags(MO.getReg());
1679
1680 CSEMap[Preheader][Opcode].push_back(MI);
1681 }
1682
1683 ++NumHoisted;
1684 Changed = true;
1685
1686 if (HasCSEDone || HasExtractHoistableLoad)
1687 return HoistResult::Hoisted | HoistResult::ErasedMI;
1688 return HoistResult::Hoisted;
1689}
1690
1691/// Get the preheader for the current loop, splitting a critical edge if needed.
1692MachineBasicBlock *MachineLICMImpl::getOrCreatePreheader(MachineLoop *CurLoop) {
1693 // Determine the block to which to hoist instructions. If we can't find a
1694 // suitable loop predecessor, we can't do any hoisting.
1695 if (MachineBasicBlock *Preheader = CurLoop->getLoopPreheader())
1696 return Preheader;
1697
1698 // Try forming a preheader by splitting the critical edge between the single
1699 // predecessor and the loop header.
1700 if (MachineBasicBlock *Pred = CurLoop->getLoopPredecessor()) {
1701 MachineBasicBlock *NewPreheader = Pred->SplitCriticalEdge(
1702 CurLoop->getHeader(), LegacyPass, MFAM, nullptr, MDTU);
1703 if (NewPreheader)
1704 Changed = true;
1705 return NewPreheader;
1706 }
1707
1708 return nullptr;
1709}
1710
1711/// Is the target basic block at least "BlockFrequencyRatioThreshold"
1712/// times hotter than the source basic block.
1713bool MachineLICMImpl::isTgtHotterThanSrc(MachineBasicBlock *SrcBlock,
1714 MachineBasicBlock *TgtBlock) {
1715 // Parse source and target basic block frequency from MBFI
1716 uint64_t SrcBF = MBFI->getBlockFreq(SrcBlock).getFrequency();
1717 uint64_t DstBF = MBFI->getBlockFreq(TgtBlock).getFrequency();
1718
1719 // Disable the hoisting if source block frequency is zero
1720 if (!SrcBF)
1721 return true;
1722
1723 double Ratio = (double)DstBF / SrcBF;
1724
1725 // Compare the block frequency ratio with the threshold
1726 return Ratio > BlockFrequencyRatioThreshold;
1727}
1728
1729template <typename DerivedT, bool PreRegAlloc>
1732 bool Changed = MachineLICMImpl(PreRegAlloc, nullptr, &MFAM).run(MF);
1733 if (!Changed)
1734 return PreservedAnalyses::all();
1736 PA.preserve<MachineLoopAnalysis>();
1737 return PA;
1738}
1739
unsigned const MachineRegisterInfo * MRI
#define Success
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
basic Basic Alias true
This file implements the BitVector class.
Analysis containing CSE Info
Definition CSEInfo.cpp:27
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file defines the DenseMap class.
#define DEBUG_TYPE
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
static bool isExitBlock(BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &ExitBlocks)
Return true if the specified block is in the list.
Definition LCSSA.cpp:68
#define I(x, y, z)
Definition MD5.cpp:57
print mir2vec MIR2Vec Vocabulary Printer Pass
Definition MIR2Vec.cpp:593
#define GET_RESULT(RESULT, GETTER, INFIX)
static cl::opt< bool > HoistConstStores("hoist-const-stores", cl::desc("Hoist invariant stores"), cl::init(true), cl::Hidden)
static cl::opt< UseBFI > DisableHoistingToHotterBlocks("disable-hoisting-to-hotter-blocks", cl::desc("Disable hoisting instructions to" " hotter blocks"), cl::init(UseBFI::PGO), cl::Hidden, cl::values(clEnumValN(UseBFI::None, "none", "disable the feature"), clEnumValN(UseBFI::PGO, "pgo", "enable the feature when using profile data"), clEnumValN(UseBFI::All, "all", "enable the feature with/wo profile data")))
static bool mayLoadFromGOTOrConstantPool(MachineInstr &MI)
Return true if this machine instruction loads from global offset table or constant pool.
static bool isOperandKill(const MachineOperand &MO, MachineRegisterInfo *MRI)
static cl::opt< bool > HoistConstLoads("hoist-const-loads", cl::desc("Hoist invariant loads"), cl::init(true), cl::Hidden)
UseBFI
Machine Loop Invariant Code false
static cl::opt< bool > AvoidSpeculation("avoid-speculation", cl::desc("MachineLICM should avoid speculation"), cl::init(true), cl::Hidden)
static bool InstructionStoresToFI(const MachineInstr *MI, int FI)
Return true if instruction stores to the specified frame.
static bool isCopyFeedingInvariantStore(const MachineInstr &MI, const MachineRegisterInfo *MRI, const TargetRegisterInfo *TRI)
static void applyBitsNotInRegMaskToRegUnitsMask(const TargetRegisterInfo &TRI, BitVector &RUs, const uint32_t *Mask)
static cl::opt< bool > HoistCheapInsts("hoist-cheap-insts", cl::desc("MachineLICM should hoist even cheap instructions"), cl::init(false), cl::Hidden)
static bool isInvariantStore(const MachineInstr &MI, const TargetRegisterInfo *TRI, const MachineRegisterInfo *MRI)
static cl::opt< unsigned > BlockFrequencyRatioThreshold("block-freq-ratio-threshold", cl::desc("Do not hoist instructions if target" "block is N times hotter than the source."), cl::init(100), cl::Hidden)
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
This file describes how to lower LLVM code to machine code.
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
bool test(unsigned Idx) const
Definition BitVector.h:480
BitVector & set()
Definition BitVector.h:370
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:205
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
A specialized PseudoSourceValue for holding FixedStack values, which must include a frame index.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
bool hasProfileData(bool IncludeSynthetic=false) const
Return true if the function is annotated with profile data.
Definition Function.h:334
DomTreeT & getDomTree()
Flush DomTree updates and return DomTree.
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
TargetInstrInfo overrides.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
bool isAsCheapAsAMove(const MachineInstr &MI) const override
bool contains(const LoopT *L) const
Return true if the specified loop is contained within in this loop.
void getExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all of the successor blocks of this loop.
void getExitingBlocks(SmallVectorImpl< BlockT * > &ExitingBlocks) const
Return all blocks inside the loop that have successors outside of the loop.
BlockT * getHeader() const
BlockT * getLoopPredecessor() const
If the given loop's header has exactly one unique predecessor outside the loop, return it.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
iterator end() const
iterator begin() const
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
bool dominates(const MachineInstr *A, const MachineInstr *B) const
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
Representation of each machine instruction.
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
Analysis pass that exposes the MachineLoopInfo for a machine function.
LLVM_ABI bool isLoopInvariant(MachineInstr &I, const Register ExcludeReg=0) const
Returns true if the instruction is loop invariant.
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Special value supplied for machine level alias analysis.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
Definition Register.h:107
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM_ABI void init(const TargetSubtargetInfo *TSInfo, bool EnableSModel=true, bool EnableSItins=true)
Initialize the machine model for instruction scheduling.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetLowering * getTargetLowering() const
LLVM Value Representation.
Definition Value.h:75
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:180
Changed
Abstract Attribute helper functions.
Definition Attributor.h:165
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI char & EarlyMachineLICMID
This pass performs loop invariant code motion on machine instructions.
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1745
LLVM_ABI void initializeMachineLICMPass(PassRegistry &)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1725
InstructionCost Cost
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI void initializeEarlyMachineLICMPass(PassRegistry &)
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2136
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1732
auto reverse(ContainerTy &&C)
Definition STLExtras.h:406
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1897
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
LLVM_ABI char & MachineLICMID
This pass performs loop invariant code motion on machine instructions.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
#define N