48#define DEBUG_TYPE "pre-isel-intrinsic-lowering"
54 "mem-intrinsic-expand-size",
60struct PreISelIntrinsicLowering {
69 const bool UseMemIntrinsicLibFunc;
71 explicit PreISelIntrinsicLowering(
76 bool UseMemIntrinsicLibFunc_ =
true)
77 : TM(TM_), ModuleLibcalls(ModuleLibcalls_), LookupTTI(LookupTTI_),
78 LookupTLI(LookupTLI_), UseMemIntrinsicLibFunc(UseMemIntrinsicLibFunc_) {
81 static bool shouldExpandMemIntrinsicWithSize(
Value *
Size,
82 const TargetTransformInfo &
TTI);
84 expandMemIntrinsicUses(Function &
F,
85 DenseMap<Constant *, GlobalVariable *> &CMap)
const;
86 bool lowerIntrinsics(
Module &M)
const;
97 Use *LastUse =
nullptr;
99 while (!Intrin.
use_empty() && (!LastUse || LastUse->getNext())) {
100 Use *U = LastUse ? LastUse->getNext() : &*Intrin.
use_begin();
101 bool Removed =
false;
105 Changed |= Removed = Callback(CI);
121 if (!CI || CI->getCalledOperand() != &
F)
126 B.CreatePtrAdd(CI->getArgOperand(0), CI->getArgOperand(1));
129 Value *ResultPtr =
B.CreatePtrAdd(CI->getArgOperand(0), OffsetI32);
131 CI->replaceAllUsesWith(ResultPtr);
132 CI->eraseFromParent();
153 "Pre-ISel intrinsics do lower into regular function calls");
165 M->getOrInsertFunction(NewFnName,
F.getFunctionType());
168 Fn->setLinkage(
F.getLinkage());
172 Fn->addFnAttr(Attribute::NonLazyBind);
181 if (CB->getCalledFunction() != &
F) {
183 "use expected to be the argument of operand bundle "
184 "\"clang.arc.attachedcall\"");
190 assert(CI->getCalledFunction() &&
"Cannot lower an indirect call!");
192 IRBuilder<> Builder(CI->getParent(), CI->getIterator());
195 CI->getOperandBundlesAsDefs(BundleList);
196 CallInst *NewCI = Builder.CreateCall(FCache, Args, BundleList);
214 if (
F.getAttributes().hasAttrSomewhere(Attribute::Returned, &Index) &&
216 NewCI->
addParamAttr(Index - AttributeList::FirstArgIndex,
217 Attribute::Returned);
219 if (!CI->use_empty())
220 CI->replaceAllUsesWith(NewCI);
221 CI->eraseFromParent();
229bool PreISelIntrinsicLowering::shouldExpandMemIntrinsicWithSize(
241 return SizeVal > Threshold || Threshold == 0;
252 return Lowering.getLibcallImpl(LC) != RTLIB::Unsupported;
263 return Lowering.getMemcpyImpl() != RTLIB::Unsupported;
279 Type *VTy = V->getType();
299 if (
DL.isBigEndian())
322bool PreISelIntrinsicLowering::expandMemIntrinsicUses(
323 Function &
F, DenseMap<Constant *, GlobalVariable *> &CMap)
const {
331 case Intrinsic::memcpy: {
333 Function *ParentFunc = Memcpy->getFunction();
334 const TargetTransformInfo &
TTI = LookupTTI(*ParentFunc);
335 if (shouldExpandMemIntrinsicWithSize(Memcpy->getLength(),
TTI)) {
336 if (UseMemIntrinsicLibFunc &&
343 Memcpy->eraseFromParent();
348 case Intrinsic::memcpy_inline: {
357 const TargetTransformInfo &
TTI = LookupTTI(*ParentFunc);
360 Memcpy->eraseFromParent();
363 case Intrinsic::memmove: {
366 const TargetTransformInfo &
TTI = LookupTTI(*ParentFunc);
367 if (shouldExpandMemIntrinsicWithSize(Memmove->getLength(),
TTI)) {
368 if (UseMemIntrinsicLibFunc &&
374 Memmove->eraseFromParent();
380 case Intrinsic::memset: {
383 const TargetTransformInfo &
TTI = LookupTTI(*ParentFunc);
384 if (shouldExpandMemIntrinsicWithSize(Memset->getLength(),
TTI)) {
385 if (UseMemIntrinsicLibFunc &&
391 Memset->eraseFromParent();
396 case Intrinsic::memset_inline: {
405 const TargetTransformInfo &
TTI = LookupTTI(*ParentFunc);
408 Memset->eraseFromParent();
411 case Intrinsic::experimental_memset_pattern: {
413 const TargetLibraryInfo &TLI = LookupTLI(*Memset->getFunction());
420 Memset->eraseFromParent();
426 Module *
M = Memset->getModule();
427 const DataLayout &
DL = Memset->getDataLayout();
429 Type *DestPtrTy = Memset->getRawDest()->getType();
431 StringRef FuncName =
"memset_pattern16";
433 Builder.getVoidTy(), DestPtrTy,
434 Builder.getPtrTy(), SizeTTy);
440 assert(Memset->getRawDest()->getType()->getPointerAddressSpace() == 0 &&
441 "Should have skipped if non-zero AS");
443 auto It = CMap.
find(PatternValue);
444 if (It != CMap.
end()) {
447 GV =
new GlobalVariable(
448 *M, PatternValue->
getType(),
true,
451 GlobalValue::UnnamedAddr::Global);
454 CMap[PatternValue] = GV;
456 Value *PatternPtr = GV;
457 Value *NumBytes = Builder.CreateMul(
458 TLI.
getAsSizeT(
DL.getTypeAllocSize(Memset->getValue()->getType()),
460 Builder.CreateZExtOrTrunc(Memset->getLength(), SizeTTy));
461 CallInst *MemsetPattern16Call =
462 Builder.CreateCall(MSP, {Memset->getRawDest(), PatternPtr, NumBytes});
466 AttrBuilder ArgAttrs(Memset->getContext(),
467 Memset->getAttributes().getParamAttrs(0));
470 Memset->getContext(), 0, ArgAttrs));
472 Memset->eraseFromParent();
501 Function *
F =
B.GetInsertBlock()->getParent();
502 Attribute FSAttr =
F->getFnAttribute(
"target-features");
505 SignIntr, {Val,
B.getInt32( 2), Disc}, DSBundle);
507 M.getOrInsertFunction(
"__emupac_pacda", EmuFnTy);
508 return B.CreateCall(EmuSignIntr, {Val, Disc}, DSBundle);
513 Function *
F =
B.GetInsertBlock()->getParent();
514 Attribute FSAttr =
F->getFnAttribute(
"target-features");
517 AuthIntr, {Val,
B.getInt32( 2), Disc}, DSBundle);
519 M.getOrInsertFunction(
"__emupac_autda", EmuFnTy);
520 return B.CreateCall(EmuAuthIntr, {Val, Disc}, DSBundle);
533 auto *Pointer =
Call->getArgOperand(0);
534 auto *Disc =
Call->getArgOperand(1);
540 auto *DS = GetDeactivationSymbol(
Call);
547 if (U.getOperandNo() == 1 &&
551 B.CreatePtrToInt(
SI->getValueOperand(),
B.getInt64Ty());
552 Value *Sign = CreateSign(
B, SIValInt, Disc, DSBundle);
553 SI->setOperand(0,
B.CreateIntToPtr(Sign,
B.getPtrTy()));
554 SI->setOperand(1, Pointer);
566 NewLI->setOperand(0, Pointer);
568 auto *LIInt =
B.CreatePtrToInt(NewLI,
B.getInt64Ty());
569 Value *Auth = CreateAuth(
B, LIInt, Disc, DSBundle);
570 LI->replaceAllUsesWith(
B.CreateIntToPtr(Auth,
B.getPtrTy()));
571 LI->eraseFromParent();
580 if (
Op->isNullValue()) {
586 if (
Op->isNullValue()) {
597 DSsToDeactivate.
insert(DS);
600 Call->eraseFromParent();
603 if (!DSsToDeactivate.
empty()) {
614 OldDS->replaceAllUsesWith(DS);
615 OldDS->eraseFromParent();
629 Br->setSuccessor(0, Br->getParent());
630 Call->eraseFromParent();
638 if (!
Call->getParent()->isEntryBlock() &&
640 [](
Instruction &
I) { return !I.mayHaveSideEffects(); })) {
643 if (!BI || BI->isUnconditional())
655 if (BI->getSuccessor(0) ==
Call->getParent()) {
657 Cond = BI->getCondition();
662 Cond =
B.CreateNot(BI->getCondition());
665 B.CreateIntrinsic(Intrinsic::cond_loop,
Cond);
669 B.CreateIntrinsic(Intrinsic::cond_loop,
671 Call->eraseFromParent();
676bool PreISelIntrinsicLowering::lowerIntrinsics(
Module &M)
const {
678 DenseMap<Constant *, GlobalVariable *> CMap;
680 for (Function &
F : M) {
681 switch (
F.getIntrinsicID()) {
684 case Intrinsic::memcpy:
685 case Intrinsic::memcpy_inline:
686 case Intrinsic::memmove:
687 case Intrinsic::memset:
688 case Intrinsic::memset_inline:
689 case Intrinsic::experimental_memset_pattern:
690 Changed |= expandMemIntrinsicUses(
F, CMap);
692 case Intrinsic::load_relative:
695 case Intrinsic::is_constant:
696 case Intrinsic::objectsize:
699 TargetLibraryInfo &TLI = LookupTLI(*Parent);
705#define BEGIN_REGISTER_VP_INTRINSIC(VPID, MASKPOS, VLENPOS) \
706 case Intrinsic::VPID:
707#include "llvm/IR/VPIntrinsics.def"
710 const TargetTransformInfo &
TTI = LookupTTI(*Parent);
716 Changed |= ED != VPExpansionDetails::IntrinsicUnchanged;
717 bool Removed = ED == VPExpansionDetails::IntrinsicReplaced;
721 case Intrinsic::objc_autorelease:
724 case Intrinsic::objc_autoreleasePoolPop:
727 case Intrinsic::objc_autoreleasePoolPush:
730 case Intrinsic::objc_autoreleaseReturnValue:
733 case Intrinsic::objc_copyWeak:
736 case Intrinsic::objc_destroyWeak:
739 case Intrinsic::objc_initWeak:
742 case Intrinsic::objc_loadWeak:
745 case Intrinsic::objc_loadWeakRetained:
748 case Intrinsic::objc_moveWeak:
751 case Intrinsic::objc_release:
754 case Intrinsic::objc_retain:
757 case Intrinsic::objc_retainAutorelease:
760 case Intrinsic::objc_retainAutoreleaseReturnValue:
764 case Intrinsic::objc_retainAutoreleasedReturnValue:
768 case Intrinsic::objc_claimAutoreleasedReturnValue:
772 case Intrinsic::objc_retainBlock:
775 case Intrinsic::objc_storeStrong:
778 case Intrinsic::objc_storeWeak:
781 case Intrinsic::objc_unsafeClaimAutoreleasedReturnValue:
783 lowerObjCCall(
F, RTLIB::impl_objc_unsafeClaimAutoreleasedReturnValue);
785 case Intrinsic::objc_retainedObject:
788 case Intrinsic::objc_unretainedObject:
791 case Intrinsic::objc_unretainedPointer:
794 case Intrinsic::objc_retain_autorelease:
797 case Intrinsic::objc_sync_enter:
800 case Intrinsic::objc_sync_exit:
804 case Intrinsic::exp2:
818 case Intrinsic::protected_field_ptr:
821 case Intrinsic::cond_loop:
825 case Intrinsic::looptrap:
828 if (
auto *CondLoop =
M.getFunction(
"llvm.cond.loop"))
838class PreISelIntrinsicLoweringLegacyPass :
public ModulePass {
842 PreISelIntrinsicLoweringLegacyPass() : ModulePass(
ID) {}
844 void getAnalysisUsage(AnalysisUsage &AU)
const override {
851 bool runOnModule(
Module &M)
override {
852 const LibcallLoweringModuleAnalysisResult &ModuleLibcalls =
853 getAnalysis<LibcallLoweringInfoWrapper>().getResult(M);
855 auto LookupTTI = [
this](
Function &
F) -> TargetTransformInfo & {
856 return this->getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
F);
858 auto LookupTLI = [
this](
Function &
F) -> TargetLibraryInfo & {
859 return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
F);
862 const auto *TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
863 PreISelIntrinsicLowering
Lowering(TM, ModuleLibcalls, LookupTTI, LookupTLI);
870char PreISelIntrinsicLoweringLegacyPass::ID;
873 "pre-isel-intrinsic-lowering",
874 "Pre-ISel Intrinsic Lowering",
false,
false)
881 "pre-isel-intrinsic-lowering",
885 return new PreISelIntrinsicLoweringLegacyPass();
902 PreISelIntrinsicLowering
Lowering(
TM, LibcallLowering, LookupTTI, LookupTLI);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool setNonLazyBind(Function &F)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Module.h This file contains the declarations for the Module class.
This defines the Use class.
The header file for the LowerConstantIntrinsics pass as used by the new pass manager.
Machine Check Debug Module
This file defines ARC utility functions which are used by various parts of the compiler.
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
static cl::opt< int64_t > MemIntrinsicExpandSizeThresholdOpt("mem-intrinsic-expand-size", cl::desc("Set minimum mem intrinsic size to expand in IR"), cl::init(-1), cl::Hidden)
Threshold to leave statically sized memory intrinsic calls.
static bool forEachCall(Function &Intrin, T Callback)
static bool expandLoopTrap(Function &Intr)
static bool expandCondLoop(Function &Intr)
pre isel intrinsic Pre ISel Intrinsic Lowering
static bool canEmitLibcall(const LibcallLoweringModuleAnalysisResult &ModuleLowering, const TargetMachine *TM, Function *F, RTLIB::Libcall LC)
static CallInst::TailCallKind getOverridingTailCallKind(const Function &F)
static bool canEmitMemcpy(const LibcallLoweringModuleAnalysisResult &ModuleLowering, const TargetMachine *TM, Function *F)
static Constant * getMemSetPattern16Value(MemSetPatternInst *Inst, const TargetLibraryInfo &TLI)
static bool expandProtectedFieldPtr(Function &Intr)
static bool lowerObjCCall(Function &F, RTLIB::LibcallImpl NewFn, bool setNonLazyBind=false)
static bool lowerLoadRelative(Function &F)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
AnalysisUsage & addRequired()
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
InstListType::iterator iterator
Instruction iterators...
void setAttributes(AttributeList A)
Set the attributes for this call.
Value * getArgOperand(unsigned i) const
AttributeList getAttributes() const
Return the attributes for this call.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
This class represents a function call, abstracting a target machine's calling convention.
void setTailCallKind(TailCallKind TCK)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
iterator find(const_arg_type_t< KeyT > Val)
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
const Function & getFunction() const
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
void setUnnamedAddr(UnnamedAddr Val)
Module * getParent()
Get the module that this global value is contained inside of...
@ HiddenVisibility
The GV is hidden.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ ExternalLinkage
Externally visible function.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
static LLVM_ABI bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
Tracks which library functions to use for a particular subtarget.
Record a mapping from subtarget to LibcallLoweringInfo.
const LibcallLoweringInfo & getLibcallLowering(const TargetSubtargetInfo &Subtarget) const
Value * getRawDest() const
This class wraps the llvm.experimental.memset.pattern intrinsic.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
A Module instance is used to store all the information related to an LLVM module.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
ConstantInt * getAsSizeT(uint64_t V, const Module &M) const
Returns a constant materialized as a size_t type.
IntegerType * getSizeTType(const Module &M) const
Returns an IntegerType corresponding to size_t.
bool isOperationExpand(unsigned Op, EVT VT) const
Return true if the specified operation is illegal on this target or unlikely to be made legal with cu...
int IntrinsicIDToISD(Intrinsic::ID ID) const
Get the ISD node that corresponds to the Intrinsic ID.
Primary interface to the complete machine description for the target machine.
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
virtual bool canLowerCondLoop() const
Returns whether the backend can lower the llvm.cond.loop intrinsic.
Target-Independent Code Generator Pass Configuration Options.
virtual const TargetLowering * getTargetLowering() const
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
LLVM Value Representation.
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.
iterator_range< user_iterator > users()
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
initializer< Ty > init(const Ty &Val)
bool IsNeverTail(ARCInstKind Class)
Test if the given class represents instructions which are never safe to mark with the "tail" keyword.
bool IsAlwaysTail(ARCInstKind Class)
Test if the given class represents instructions which are always safe to mark with the "tail" keyword...
ARCInstKind
Equivalence classes of instructions in the ARC Model.
ARCInstKind GetFunctionClass(const Function *F)
Determine if F is one of the special known Functions.
std::optional< Function * > getAttachedARCFunction(const CallBase *CB)
This function returns operand bundle clang_arc_attachedcall's argument, which is the address of the A...
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
bool lowerUnaryVectorIntrinsicAsLoop(Module &M, CallInst *CI)
Lower CI as a loop.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
bool lowerConstantIntrinsics(Function &F, const TargetLibraryInfo &TLI, DominatorTree *DT)
LLVM_ABI void expandMemSetPatternAsLoop(MemSetPatternInst *MemSet)
Expand MemSetPattern as a loop. MemSet is not deleted.
LLVM_ABI bool expandMemMoveAsLoop(MemMoveInst *MemMove, const TargetTransformInfo &TTI)
Expand MemMove as a loop.
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...
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
LLVM_ABI bool inferNonMandatoryLibFuncAttrs(Module *M, StringRef Name, const TargetLibraryInfo &TLI)
Analyze the name and prototype of the given function and set any applicable attributes.
LLVM_ABI bool isLibFuncEmittable(const Module *M, const TargetLibraryInfo *TLI, LibFunc TheLibFunc)
Check whether the library function is available on target and also that it in the current Module is a...
LLVM_ABI ModulePass * createPreISelIntrinsicLoweringPass()
This pass lowers the @llvm.load.relative and @llvm.objc.
LLVM_ABI FunctionCallee getOrInsertLibFunc(Module *M, const TargetLibraryInfo &TLI, LibFunc TheLibFunc, FunctionType *T, AttributeList AttributeList)
Calls getOrInsertFunction() and then makes sure to add mandatory argument attributes.
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 MDNode * getExplicitlyUnknownBranchWeightsIfProfiled(Function &F, StringRef PassName)
Returns a metadata node containing unknown branch weights if the function has an entry count,...
VPExpansionDetails expandVectorPredicationIntrinsic(VPIntrinsic &VPI, const TargetTransformInfo &TTI)
Expand a vector predication intrinsic.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
OperandBundleDefT< Value * > OperandBundleDef
DWARFExpression::Operation Op
LLVM_ABI void expandMemSetAsLoop(MemSetInst *MemSet, const TargetTransformInfo *TTI=nullptr)
Expand MemSet as a loop.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI void expandMemCpyAsLoop(MemCpyInst *MemCpy, const TargetTransformInfo &TTI, ScalarEvolution *SE=nullptr)
Expand MemCpy as a loop. MemCpy is not deleted.
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
VPExpansionDetails
Represents the details the expansion of a VP intrinsic.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
This struct is a compact representation of a valid (non-zero power of two) alignment.
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.