48#define DEBUG_TYPE "tailduplication"
51STATISTIC(NumTailDups,
"Number of tail duplicated blocks");
53 "Number of instructions added due to tail duplication");
55 "Number of instructions removed due to tail duplication");
56STATISTIC(NumDeadBlocks,
"Number of dead blocks removed");
66 "tail-dup-indirect-size",
67 cl::desc(
"Maximum instructions to consider tail duplicating blocks that "
68 "end with indirect branches."),
cl::init(20),
73 cl::desc(
"Maximum predecessors (maximum successors at the "
74 "same time) to consider tail duplicating blocks."),
79 cl::desc(
"Maximum successors (maximum predecessors at the "
80 "same time) to consider tail duplicating blocks."),
85 cl::desc(
"Verify sanity of PHI instructions during taildup"),
95 bool LayoutModeIn,
unsigned TailDupSizeIn) {
99 MRI = &MF->getRegInfo();
103 TailDupSize = TailDupSizeIn;
105 assert(MBPI !=
nullptr &&
"Machine Branch Probability Info required");
107 LayoutMode = LayoutModeIn;
108 this->PreRegAlloc = PreRegAlloc;
116 while (
MI !=
MBB.end()) {
121 for (
unsigned i = 1, e =
MI->getNumOperands(); i != e; i += 2) {
123 if (PHIBB == PredBB) {
131 dbgs() <<
" missing input from predecessor "
137 for (
unsigned i = 1, e =
MI->getNumOperands(); i != e; i += 2) {
139 if (CheckExtra && !Preds.count(PHIBB)) {
142 dbgs() <<
" extra input from predecessor "
178 if (!tailDuplicate(IsSimple,
MBB, ForcedLayoutPred,
179 TDBBs,
Copies, CandidatePtr))
190 bool isDead =
MBB->pred_empty() && !
MBB->hasAddressTaken();
192 updateSuccessorsPHIs(
MBB,
isDead, TDBBs, Succs);
196 NumTailDupRemoved +=
MBB->size();
197 removeDeadBlock(
MBB, RemovalCallback);
202 if (!SSAUpdateVRs.empty()) {
203 for (
Register VReg : SSAUpdateVRs) {
213 auto LI = SSAUpdateVals.find(VReg);
214 for (std::pair<MachineBasicBlock *, Register> &J : LI->second) {
229 if (
UseMI->isDebugValue()) {
233 if (
UseMI->getParent() == DefBB && !
UseMI->isPHI())
237 for (
auto *UseMO : DebugUses) {
244 SSAUpdateVRs.clear();
245 SSAUpdateVals.clear();
253 Register Dst = Copy->getOperand(0).getReg();
254 Register Src = Copy->getOperand(1).getReg();
255 if (MRI->hasOneNonDBGUse(Src) &&
256 MRI->constrainRegClass(Src, MRI->getRegClass(Dst))) {
258 MRI->replaceRegWith(Dst, Src);
259 Copy->eraseFromParent();
264 NumAddedPHIs += NewPHIs.
size();
267 *DuplicatedPreds = std::move(TDBBs);
276 bool MadeChange =
false;
305 if (
UseMI.isDebugValue())
307 if (
UseMI.getParent() != BB)
314 for (
unsigned i = 1, e =
MI->getNumOperands(); i != e; i += 2)
315 if (
MI->getOperand(i + 1).getMBB() == SrcBB)
325 for (
const auto &
MI : BB) {
328 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
330 UsedByPhi->
insert(SrcReg);
338 auto LI = SSAUpdateVals.find(OrigReg);
339 if (LI != SSAUpdateVals.end())
340 LI->second.push_back(std::make_pair(BB, NewReg));
342 AvailableValsTy Vals;
343 Vals.push_back(std::make_pair(BB, NewReg));
344 SSAUpdateVals.
insert(std::make_pair(OrigReg, Vals));
345 SSAUpdateVRs.push_back(OrigReg);
351void TailDuplicator::processPHI(
358 assert(SrcOpIdx &&
"Unable to find matching PHI source?");
359 Register SrcReg =
MI->getOperand(SrcOpIdx).getReg();
360 unsigned SrcSubReg =
MI->getOperand(SrcOpIdx).getSubReg();
366 Register NewDef = MRI->createVirtualRegister(RC);
372 MI->getOperand(SrcOpIdx).setReg(NewDef);
373 MI->getOperand(SrcOpIdx).setSubReg(0);
377 addSSAUpdateEntry(DefReg, NewDef, PredBB);
379 MI->removePHIIncomingValueFor(*PredBB);
382 MI->eraseFromParent();
383 else if (
MI->getNumOperands() == 1)
384 MI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
389void TailDuplicator::duplicateInstruction(
394 if (
MI->isCFIInstruction()) {
396 TII->
get(TargetOpcode::CFI_INSTRUCTION))
401 MachineInstr &NewMI = TII->duplicate(*PredBB, PredBB->
end(), *
MI);
413 Register NewReg = MRI->createVirtualRegister(RC);
417 addSSAUpdateEntry(
Reg, NewReg, PredBB);
421 if (VI == LocalVRMap.
end())
426 auto *OrigRC = MRI->getRegClass(
Reg);
427 auto *MappedRC = MRI->getRegClass(
VI->second.Reg);
429 if (
VI->second.SubReg != 0) {
431 TRI->getMatchingSuperRegClass(MappedRC, OrigRC,
VI->second.SubReg);
436 MRI->setRegClass(
VI->second.Reg, ConstrRC);
447 : MRI->constrainRegClass(
VI->second.Reg, OrigRC);
457 TRI->composeSubRegIndices(
VI->second.SubReg, MO.
getSubReg()));
462 Register NewReg = MRI->createVirtualRegister(OrigRC);
465 .
addReg(
VI->second.Reg, {},
VI->second.SubReg);
466 LocalVRMap.
erase(VI);
483void TailDuplicator::updateSuccessorsPHIs(
487 for (MachineBasicBlock *SuccBB : Succs) {
488 for (MachineInstr &
MI : *SuccBB) {
493 for (
unsigned i = 1, e =
MI.getNumOperands(); i != e; i += 2) {
494 MachineOperand &MO =
MI.getOperand(i + 1);
495 if (MO.
getMBB() == FromBB) {
502 MachineOperand &MO0 =
MI.getOperand(Idx);
508 for (
unsigned i =
MI.getNumOperands() - 2; i != Idx; i -= 2) {
509 MachineOperand &MO =
MI.getOperand(i + 1);
510 if (MO.
getMBB() == FromBB) {
511 MI.removeOperand(i + 1);
521 auto LI = SSAUpdateVals.find(
Reg);
522 if (LI != SSAUpdateVals.end()) {
524 for (
const std::pair<MachineBasicBlock *, Register> &J : LI->second) {
525 MachineBasicBlock *SrcBB = J.first;
535 MI.getOperand(Idx).setReg(SrcReg);
536 MI.getOperand(Idx + 1).setMBB(SrcBB);
539 MIB.addReg(SrcReg).addMBB(SrcBB);
544 for (MachineBasicBlock *SrcBB : TDBBs) {
546 MI.getOperand(Idx).setReg(
Reg);
547 MI.getOperand(Idx + 1).setMBB(SrcBB);
550 MIB.addReg(
Reg).addMBB(SrcBB);
555 MI.removeOperand(Idx + 1);
556 MI.removeOperand(Idx);
578 unsigned MaxDuplicateCount;
579 if (TailDupSize == 0)
582 MaxDuplicateCount = TailDupSize;
584 MaxDuplicateCount = 1;
592 if (TII->analyzeBranch(TailBB, PredTBB, PredFBB, PredCond) &&
602 bool HasIndirectbr =
false;
603 bool HasComputedGoto =
false;
604 if (!TailBB.
empty()) {
609 if (HasIndirectbr && PreRegAlloc)
618 if (HasComputedGoto && !PreRegAlloc)
619 MaxDuplicateCount = std::max(MaxDuplicateCount, 10u);
624 unsigned NumPhis = 0;
636 !
MI.isCFIInstruction()))
641 if (
MI.isConvergent())
647 if (PreRegAlloc &&
MI.isReturn())
653 if (PreRegAlloc &&
MI.isCall())
661 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
666 else if (!
MI.isPHI() && !
MI.isMetaInstruction())
671 NumPhis +=
MI.isPHI();
682 return any_of(*MBB, [](MachineInstr &MI) { return MI.isPHI(); });
697 for (
auto &
I : *SB) {
708 if (HasIndirectbr && PreRegAlloc)
717 return canCompletelyDuplicateBB(TailBB);
727 if (
I == TailBB->
end())
729 return I->isUnconditionalBranch();
746 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
747 SmallVector<MachineOperand, 4> PredCond;
748 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
751 if (!PredCond.
empty())
757bool TailDuplicator::duplicateSimpleBB(
764 for (MachineBasicBlock *PredBB : Preds) {
771 MachineBasicBlock *PredTBB =
nullptr, *PredFBB =
nullptr;
772 SmallVector<MachineOperand, 4> PredCond;
773 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
777 LLVM_DEBUG(
dbgs() <<
"\nTail-duplicating into PredBB: " << *PredBB
778 <<
"From simple Succ: " << *TailBB);
780 MachineBasicBlock *NewTarget = *TailBB->
succ_begin();
784 if (PredCond.
empty())
794 if (PredFBB == TailBB)
796 if (PredTBB == TailBB)
800 if (PredTBB == PredFBB) {
806 if (PredFBB == NextBB)
808 if (PredTBB == NextBB && PredFBB ==
nullptr)
812 TII->removeBranch(*PredBB);
822 TII->insertBranch(*PredBB, PredTBB, PredFBB, PredCond,
DL);
837 if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond))
839 if (!PredCond.
empty())
877 return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi);
890 assert(TailBB != PredBB &&
891 "Single-block loop should have been rejected earlier!");
900 bool IsLayoutSuccessor =
false;
901 if (ForcedLayoutPred)
902 IsLayoutSuccessor = (ForcedLayoutPred == PredBB);
904 IsLayoutSuccessor =
true;
905 if (IsLayoutSuccessor)
909 LLVM_DEBUG(
dbgs() <<
"\nTail-duplicating into PredBB: " << *PredBB
910 <<
"From Succ: " << *TailBB);
915 TII->removeBranch(*PredBB);
924 processPHI(&
MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi,
true);
928 duplicateInstruction(&
MI, TailBB, PredBB, LocalVRMap, UsedByPhi);
931 appendCopies(PredBB, CopyInfos,
Copies);
933 NumTailDupAdded += TailBB->
size() - 1;
938 "TailDuplicate called on block with multiple successors!");
939 for (MachineBasicBlock *Succ : TailBB->
successors())
940 PredBB->
addSuccessor(Succ, MBPI->getEdgeProbability(TailBB, Succ));
943 if (ShouldUpdateTerminators)
953 MachineBasicBlock *PrevBB = ForcedLayoutPred;
956 MachineBasicBlock *PriorTBB =
nullptr, *PriorFBB =
nullptr;
957 SmallVector<MachineOperand, 4> PriorCond;
963 !TII->analyzeBranch(*PrevBB, PriorTBB, PriorFBB, PriorCond) &&
965 (!PriorTBB || PriorTBB == TailBB) &&
969 <<
"From MBB: " << *TailBB);
973 bool RemovedBranches = TII->removeBranch(*PrevBB) != 0;
978 DenseMap<Register, RegSubRegPair> LocalVRMap;
982 while (
I != TailBB->
end() &&
I->isPHI()) {
985 MachineInstr *
MI = &*
I++;
986 processPHI(
MI, TailBB, PrevBB, LocalVRMap, CopyInfos, UsedByPhi,
991 while (
I != TailBB->
end()) {
994 MachineInstr *
MI = &*
I++;
995 assert(!
MI->isBundle() &&
"Not expecting bundles before regalloc!");
996 duplicateInstruction(
MI, TailBB, PrevBB, LocalVRMap, UsedByPhi);
997 MI->eraseFromParent();
999 appendCopies(PrevBB, CopyInfos,
Copies);
1001 TII->removeBranch(*PrevBB);
1010 if (ShouldUpdateTerminators)
1016 LLVM_DEBUG(
dbgs() <<
"Abort merging blocks, the predecessor still "
1017 "contains terminator instructions");
1020 return RemovedBranches;
1047 for (MachineBasicBlock *PredBB : Preds) {
1055 DenseMap<Register, RegSubRegPair> LocalVRMap;
1061 processPHI(&
MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi,
false);
1063 appendCopies(PredBB, CopyInfos,
Copies);
1075 const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
1076 for (
auto &CI : CopyInfos) {
1078 .
addReg(CI.second.Reg, {}, CI.second.SubReg);
1085void TailDuplicator::removeDeadBlock(
1093 for (
const MachineInstr &
MI : *
MBB)
1094 if (
MI.shouldUpdateAdditionalCallInfo())
1097 if (RemovalCallback)
1098 (*RemovalCallback)(
MBB);
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static unsigned InstrCount
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
TargetInstrInfo::RegSubRegPair RegSubRegPair
Promote Memory to Register
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
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)
static cl::opt< unsigned > TailDuplicateSize("tail-dup-size", cl::desc("Maximum instructions to consider tail duplicating"), cl::init(2), cl::Hidden)
static cl::opt< unsigned > TailDupLimit("tail-dup-limit", cl::init(~0U), cl::Hidden)
static cl::opt< unsigned > TailDupPredSize("tail-dup-pred-size", cl::desc("Maximum predecessors (maximum successors at the " "same time) to consider tail duplicating blocks."), cl::init(16), cl::Hidden)
static cl::opt< unsigned > TailDupSuccSize("tail-dup-succ-size", cl::desc("Maximum successors (maximum predecessors at the " "same time) to consider tail duplicating blocks."), cl::init(16), cl::Hidden)
static cl::opt< bool > TailDupVerify("tail-dup-verify", cl::desc("Verify sanity of PHI instructions during taildup"), cl::init(false), cl::Hidden)
static void VerifyPHIs(MachineFunction &MF, bool CheckExtra)
static bool bothUsedInPHI(const MachineBasicBlock &A, const SmallPtrSet< MachineBasicBlock *, 8 > &SuccsB)
static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB)
static void getRegsUsedByPHIs(const MachineBasicBlock &BB, DenseSet< Register > *UsedByPhi)
static cl::opt< unsigned > TailDupIndirectBranchSize("tail-dup-indirect-size", cl::desc("Maximum instructions to consider tail duplicating blocks that " "end with indirect branches."), cl::init(20), cl::Hidden)
static bool isDefLiveOut(Register Reg, MachineBasicBlock *BB, const MachineRegisterInfo *MRI)
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Implements a dense probed hash-table based set.
bool hasProfileData() const
Return true if the function is annotated with profile data.
Module * getParent()
Get the module that this global value is contained inside of...
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
LLVM_ABI bool hasEHPadSuccessor() const
LLVM_ABI void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New)
Replace successor OLD with NEW and update probability info.
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor)
Update the terminator instructions in block to account for changes to block layout which may have bee...
LLVM_ABI bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
succ_iterator succ_begin()
bool terminatorIsComputedGotoWithSuccessors() const
Returns true if the original IR terminator is an indirectbr with successor blocks.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
unsigned succ_size() const
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
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 bool mayHaveInlineAsmBr() const
Returns true if this block may have an INLINEASM_BR (overestimate, by checking if any of the successo...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
Representation of each machine instruction.
bool isDebugInstr() const
unsigned getNumOperands() const
Retuns the total number of operands.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
MachineOperand class - Representation of each machine instruction operand.
void setSubReg(unsigned subReg)
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
iterator_range< use_instr_iterator > use_instructions(Register Reg) const
MachineSSAUpdater - This class updates SSA form for a set of virtual registers defined in multiple bl...
LLVM_ABI void Initialize(Register V)
Initialize - Reset this object to get ready for a new set of SSA updates.
LLVM_ABI Register GetValueInMiddleOfBlock(MachineBasicBlock *BB, bool ExistingValueOnly=false)
GetValueInMiddleOfBlock - Construct SSA form, materializing a value that is live in the middle of the...
LLVM_ABI void RewriteUse(MachineOperand &U)
RewriteUse - Rewrite a use of the symbolic value.
LLVM_ABI void AddAvailableValue(MachineBasicBlock *BB, Register V)
AddAvailableValue - Indicate that a rewritten value is available at the end of the specified block wi...
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
void insert_range(Range &&R)
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM_ABI void initMF(MachineFunction &MF, bool PreRegAlloc, const MachineBranchProbabilityInfo *MBPI, MBFIWrapper *MBFI, ProfileSummaryInfo *PSI, bool LayoutMode, unsigned TailDupSize=0)
Prepare to run on a specific machine function.
LLVM_ABI bool tailDuplicateBlocks()
Look for small blocks that are unconditionally branched to and do not fall through.
LLVM_ABI bool tailDuplicateAndUpdate(bool IsSimple, MachineBasicBlock *MBB, MachineBasicBlock *ForcedLayoutPred, SmallVectorImpl< MachineBasicBlock * > *DuplicatedPreds=nullptr, function_ref< void(MachineBasicBlock *)> *RemovalCallback=nullptr, SmallVectorImpl< MachineBasicBlock * > *CandidatePtr=nullptr)
Tail duplicate a single basic block into its predecessors, and then clean up.
static LLVM_ABI bool isSimpleBB(MachineBasicBlock *TailBB)
True if this BB has only one unconditional jump.
LLVM_ABI bool canTailDuplicate(MachineBasicBlock *TailBB, MachineBasicBlock *PredBB)
Returns true if TailBB can successfully be duplicated into PredBB.
LLVM_ABI bool shouldTailDuplicate(bool IsSimple, MachineBasicBlock &TailBB)
Determine if it is profitable to duplicate this block.
const TargetRegisterInfo & getRegisterInfo() const
virtual const TargetInstrInfo * getInstrInfo() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
auto successors(const MachineBasicBlock *BB)
constexpr from_range_t from_range
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
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...
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
MCRegisterClass TargetRegisterClass