88#define DEBUG_TYPE "tailcallelim"
90STATISTIC(NumEliminated,
"Number of tail calls removed");
91STATISTIC(NumRetDuped,
"Number of return duplicated");
92STATISTIC(NumAccumAdded,
"Number of accumulators introduced");
94 "Number of tail calls/recursion eliminations prevented due to cold "
95 "calling convention or attribute");
99 cl::desc(
"Force disabling recomputing of function entry count, on "
100 "successful tail recursion elimination."));
104 cl::desc(
"Disable tail call elimination and optimization for cold calls or "
105 "in cold functions"));
117 if (CB && (CB->
hasFnAttr(Attribute::Cold) ||
121 if (Caller && (Caller->hasFnAttribute(Attribute::Cold) ||
144 return !AI || AI->isStaticAlloca();
149struct AllocaDerivedValueTracker {
153 void walk(
Value *Root) {
155 SmallPtrSet<Use *, 32> Visited;
157 auto AddUsesToWorklist = [&](
Value *
V) {
158 for (
auto &U :
V->uses()) {
159 if (!Visited.
insert(&U).second)
165 AddUsesToWorklist(Root);
167 while (!Worklist.
empty()) {
171 switch (
I->getOpcode()) {
172 case Instruction::Call:
173 case Instruction::Invoke: {
179 if (CB.isArgOperand(U) && CB.isByValArgument(CB.getArgOperandNo(U)))
182 CB.isDataOperand(U) && CB.doesNotCapture(CB.getDataOperandNo(U));
183 callUsesLocalStack(CB, IsNocapture);
191 case Instruction::Load: {
196 case Instruction::Store: {
197 if (
U->getOperandNo() == 0)
198 EscapePoints.insert(
I);
201 case Instruction::BitCast:
202 case Instruction::GetElementPtr:
203 case Instruction::PHI:
204 case Instruction::Select:
205 case Instruction::AddrSpaceCast:
208 EscapePoints.insert(
I);
212 AddUsesToWorklist(
I);
216 void callUsesLocalStack(CallBase &CB,
bool IsNocapture) {
218 AllocaUsers.insert(&CB);
226 EscapePoints.insert(&CB);
229 SmallPtrSet<Instruction *, 32> AllocaUsers;
230 SmallPtrSet<Instruction *, 32> EscapePoints;
236 if (
F.callsFunctionThatReturnsTwice())
240 AllocaDerivedValueTracker Tracker;
242 if (Arg.hasByValAttr())
278 VisitType Escaped = UNESCAPED;
280 for (
auto &
I : *BB) {
281 if (Tracker.EscapePoints.count(&
I))
294 if (
II->getIntrinsicID() == Intrinsic::stackrestore)
305 ++NumTREPreventedCold;
315 bool SafeToTail =
true;
316 for (
auto &Arg : CI->
args()) {
320 if (!
A->hasByValAttr())
329 <<
"marked as tail call candidate (readnone)";
337 if (!IsNoTail && Escaped == UNESCAPED && !Tracker.AllocaUsers.count(CI))
342 auto &State = Visited[SuccBB];
343 if (State < Escaped) {
345 if (State == ESCAPED)
352 if (!WorklistEscaped.
empty()) {
357 while (!WorklistUnescaped.
empty()) {
359 if (Visited[NextBB] == UNESCAPED) {
368 for (
CallInst *CI : DeferredTails) {
369 if (Visited[CI->getParent()] != ESCAPED) {
372 LLVM_DEBUG(
dbgs() <<
"Marked as tail call candidate: " << *CI <<
"\n");
387 if (
II->getIntrinsicID() == Intrinsic::lifetime_end)
392 if (
I->mayHaveSideEffects())
405 L->getAlign(),
DL, L))
419 if (!
I->isAssociative() || !
I->isCommutative())
422 assert(
I->getNumOperands() >= 2 &&
423 "Associative/commutative operations should have at least 2 args!");
432 if ((
I->getOperand(0) == CI &&
I->getOperand(1) == CI) ||
433 (
I->getOperand(0) != CI &&
I->getOperand(1) != CI))
444class TailRecursionEliminator {
446 const TargetTransformInfo *TTI;
448 OptimizationRemarkEmitter *ORE;
450 BlockFrequencyInfo *
const BFI;
451 ProfileSummaryInfo *
const PSI;
452 const bool UpdateFunctionEntryCount;
453 const uint64_t OrigEntryBBFreq;
454 const uint64_t OrigEntryCount;
463 PHINode *RetPN =
nullptr;
466 PHINode *RetKnownPN =
nullptr;
477 PHINode *AccPN =
nullptr;
482 TailRecursionEliminator(Function &F,
const TargetTransformInfo *TTI,
484 DomTreeUpdater &DTU, BlockFrequencyInfo *BFI,
485 ProfileSummaryInfo *PSI,
486 bool UpdateFunctionEntryCount)
487 : F(F), TTI(TTI), AA(AA), ORE(ORE), DTU(DTU), BFI(BFI), PSI(PSI),
488 UpdateFunctionEntryCount(UpdateFunctionEntryCount),
490 BFI ? BFI->getBlockFreq(&F.getEntryBlock()).getFrequency() : 0
U),
491 OrigEntryCount(F.getEntryCount() ? *F.getEntryCount() : 0) {
494 assert(OrigEntryBBFreq != 0 &&
495 "If a BFI was provided, the function should have an entry "
496 "basic block with a non-zero frequency.");
500 CallInst *findTRECandidate(BasicBlock *BB);
502 void createTailRecurseLoopHeader(CallInst *CI);
504 void insertAccumulator(Instruction *AccRecInstr);
506 bool eliminateCall(CallInst *CI);
508 void cleanupAndFinalize();
510 bool processBlock(BasicBlock &BB);
512 void copyByValueOperandIntoLocalTemp(CallInst *CI,
int OpndIdx);
514 void copyLocalTempOfByValueOperandIntoArguments(CallInst *CI,
int OpndIdx);
517 static bool eliminate(Function &F,
const TargetTransformInfo *TTI,
519 DomTreeUpdater &DTU, BlockFrequencyInfo *BFI,
520 ProfileSummaryInfo *PSI,
bool UpdateFunctionEntryCount);
527 if (&BB->
front() == TI)
532 CallInst *CI =
nullptr;
539 if (BBI == BB->
begin())
545 "Incompatible call site attributes(Tail,NoTail)");
553 if (BB == &
F.getEntryBlock() && &BB->
front() == CI &&
560 for (;
I !=
E && FI != FE; ++
I, ++FI)
561 if (*
I != &*FI)
break;
562 if (
I ==
E && FI == FE)
569void TailRecursionEliminator::createTailRecurseLoopHeader(CallInst *CI) {
570 HeaderBB = &
F.getEntryBlock();
573 HeaderBB->
setName(
"tailrecurse");
582 NEBI = NewEntry->
begin();
586 AI->moveBefore(NEBI);
596 I->replaceAllUsesWith(PN);
598 ArgumentPHIs.push_back(PN);
605 Type *RetType =
F.getReturnType();
607 Type *BoolType = Type::getInt1Ty(
F.getContext());
623void TailRecursionEliminator::insertAccumulator(Instruction *AccRecInstr) {
624 assert(!AccPN &&
"Trying to insert multiple accumulators");
626 AccumulatorRecursionInstr = AccRecInstr;
642 if (
P == &
F.getEntryBlock()) {
656void TailRecursionEliminator::copyByValueOperandIntoLocalTemp(CallInst *CI,
660 const DataLayout &
DL =
F.getDataLayout();
667 Value *NewAlloca =
new AllocaInst(
668 AggTy,
DL.getAllocaAddrSpace(),
nullptr, Alignment,
672 Value *
Size = Builder.getInt64(
DL.getTypeAllocSize(AggTy));
675 Builder.CreateMemCpy(NewAlloca, Alignment,
683void TailRecursionEliminator::copyLocalTempOfByValueOperandIntoArguments(
684 CallInst *CI,
int OpndIdx) {
687 const DataLayout &
DL =
F.getDataLayout();
693 Value *
Size = Builder.getInt64(
DL.getTypeAllocSize(AggTy));
697 Builder.CreateMemCpy(
F.getArg(OpndIdx), Alignment,
702bool TailRecursionEliminator::eliminateCall(CallInst *CI) {
711 for (++BBI; &*BBI != Ret; ++BBI) {
731 return OptimizationRemark(
DEBUG_TYPE,
"tailcall-recursion", CI)
732 <<
"transforming tail recursion into loop";
738 createTailRecurseLoopHeader(CI);
743 copyByValueOperandIntoLocalTemp(CI,
I);
751 copyLocalTempOfByValueOperandIntoArguments(CI,
I);
757 F.removeParamAttr(
I, Attribute::ReadOnly);
758 ArgumentPHIs[
I]->addIncoming(
F.getArg(
I), BB);
764 insertAccumulator(AccRecInstr);
790 RetSelects.push_back(SI);
797 AccPN->
addIncoming(AccRecInstr ? AccRecInstr : AccPN, BB);
807 DTU.
applyUpdates({{DominatorTree::Insert, BB, HeaderBB}});
811 assert(
F.getEntryCount().has_value());
815 assert(&
F.getEntryBlock() != BB);
816 auto RelativeBBFreq =
817 static_cast<double>(BFI->
getBlockFreq(BB).getFrequency()) /
818 static_cast<double>(OrigEntryBBFreq);
820 static_cast<uint64_t
>(std::round(RelativeBBFreq * OrigEntryCount));
821 auto OldEntryCount = *
F.getEntryCount();
822 if (OldEntryCount <= ToSubtract) {
824 errs() <<
"[TRE] The entrycount attributable to the recursive call, "
826 <<
", should be strictly lower than the function entry count, "
827 << OldEntryCount <<
"\n");
829 F.setEntryCount(OldEntryCount - ToSubtract);
835void TailRecursionEliminator::cleanupAndFinalize() {
841 for (PHINode *PN : ArgumentPHIs) {
850 if (RetSelects.empty()) {
862 Instruction *AccRecInstr = AccumulatorRecursionInstr;
863 for (BasicBlock &BB :
F) {
869 AccRecInstrNew->
setName(
"accumulator.ret.tr");
880 for (BasicBlock &BB :
F) {
889 RetSelects.push_back(SI);
896 Instruction *AccRecInstr = AccumulatorRecursionInstr;
897 for (SelectInst *SI : RetSelects) {
899 AccRecInstrNew->
setName(
"accumulator.ret.tr");
901 SI->getFalseValue());
904 SI->setFalseValue(AccRecInstrNew);
911bool TailRecursionEliminator::processBlock(BasicBlock &BB) {
921 CallInst *CI = findTRECandidate(&BB);
927 <<
"INTO UNCOND BRANCH PRED: " << BB);
942 CallInst *CI = findTRECandidate(&BB);
945 return eliminateCall(CI);
951bool TailRecursionEliminator::eliminate(
953 OptimizationRemarkEmitter *ORE, DomTreeUpdater &DTU,
954 BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
955 bool UpdateFunctionEntryCount) {
956 if (
F.getFnAttribute(
"disable-tail-calls").getValueAsBool())
959 bool MadeChange =
false;
964 if (
F.getFunctionType()->isVarArg())
971 TailRecursionEliminator TRE(
F,
TTI, AA, ORE, DTU, BFI, PSI,
972 UpdateFunctionEntryCount);
974 for (BasicBlock &BB :
F)
975 MadeChange |= TRE.processBlock(BB);
977 TRE.cleanupAndFinalize();
983struct TailCallElim :
public FunctionPass {
985 TailCallElim() : FunctionPass(
ID) {
989 void getAnalysisUsage(AnalysisUsage &AU)
const override {
992 AU.
addRequired<OptimizationRemarkEmitterWrapperPass>();
1002 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1003 auto *DT = DTWP ? &DTWP->getDomTree() :
nullptr;
1004 auto *PDTWP = getAnalysisIfAvailable<PostDominatorTreeWrapperPass>();
1005 auto *PDT = PDTWP ? &PDTWP->getPostDomTree() :
nullptr;
1009 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1011 return TailRecursionEliminator::eliminate(
1012 F, &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
F),
1013 &getAnalysis<AAResultsWrapperPass>().getAAResults(),
1014 &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(), DTU,
1015 nullptr,
nullptr,
false);
1020char TailCallElim::ID = 0;
1030 return new TailCallElim();
1041 auto *BFI =
F.getEntryCount().has_value()
1052 DomTreeUpdater DTU(DT, PDT, DomTreeUpdater::UpdateStrategy::Eager);
1053 bool Changed = TailRecursionEliminator::eliminate(
1054 F, &
TTI, &
AA, &ORE, DTU, BFI, PSI, UpdateFunctionEntryCount);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file defines the SmallPtrSet class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static bool canTRE(Function &F)
Scan the specified function for alloca instructions.
static cl::opt< bool > DisableTailCallElimForColdCalls("disable-tail-call-elim-for-cold-calls", cl::Hidden, cl::init(false), cl::desc("Disable tail call elimination and optimization for cold calls or " "in cold functions"))
static bool canMoveAboveCall(Instruction *I, CallInst *CI, AliasAnalysis *AA)
Return true if it is safe to move the specified instruction from after the call to before the call,...
static cl::opt< bool > DisableEntryCountRecompute("tre-disable-entrycount-recompute", cl::init(false), cl::Hidden, cl::desc("Force disabling recomputing of function entry count, on " "successful tail recursion elimination."))
static bool markTails(Function &F, OptimizationRemarkEmitter *ORE, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI)
static bool canTransformAccumulatorRecursion(Instruction *I, CallInst *CI)
static bool shouldDisableTailCallsForCold(const CallBase *CB, const Function *Caller, const ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI)
A manager for alias analyses.
an instruction to allocate memory on the stack
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
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.
This class represents an incoming formal argument to a Function.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
const Function * getParent() const
Return the enclosing method, or null if none.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
const Instruction & front() const
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool doesNotAccessMemory(unsigned OpNo) const
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
MaybeAlign getParamAlign(unsigned ArgNo) const
Extract the alignment for a call or parameter (0=unknown).
bool onlyReadsMemory(unsigned OpNo) const
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
bool hasOperandBundlesOtherThan(ArrayRef< uint32_t > IDs) const
Return true if this operand bundle user contains operand bundles with tags other than those specified...
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
void setTailCall(bool IsTc=true)
static LLVM_ABI Constant * getIdentity(Instruction *I, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary or intrinsic Instruction.
static LLVM_ABI Constant * getIntrinsicIdentity(Intrinsic::ID, Type *Ty)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
A parsed version of the target data layout string in and methods for querying it.
static DebugLoc getCompilerGenerated()
LLVM_ABI void deleteBB(BasicBlock *DelBB)
Delete DelBB.
Analysis pass which computes a DominatorTree.
FunctionPass class - This class is used to implement most global optimizations.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI void dropLocation()
Drop the instruction's debug location.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
A wrapper class for inspecting calls to intrinsic functions.
@ OB_clang_arc_attachedcall
An instruction for reading from memory.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Analysis pass which computes a PostDominatorTree.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
bool hasProfileSummary() const
Returns true if profile summary is available.
bool isColdBlock(const BBType *BB, BFIT *BFI) const
Returns true if BasicBlock BB is considered cold.
LLVM_ABI bool isColdCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const
Returns true if call site CB is considered cold.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
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 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Analysis pass providing the TargetTransformInfo.
bool isVoidTy() const
Return true if this is 'void'.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
void dropAllReferences()
Drop all references to operands.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
self_iterator getIterator()
Abstract Attribute helper functions.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ BasicBlock
Various leaf nodes.
initializer< Ty > init(const Ty &Val)
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
NodeAddr< UseNode * > Use
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI FunctionPass * createTailCallEliminationPass()
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI ReturnInst * FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, BasicBlock *Pred, DomTreeUpdater *DTU=nullptr)
This method duplicates the specified return instruction into a predecessor which ends in an unconditi...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
bool isModSet(const ModRefInfo MRI)
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const DataLayout &DL, Instruction *ScanFrom, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if we know that executing a load from this value cannot trap.
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 isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
bool pred_empty(const BasicBlock *BB)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI void initializeTailCallElimPass(PassRegistry &)
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.