36#include "llvm/IR/IntrinsicsSPIRV.h"
46class SPIRVPrepareFunctionsImpl {
47 const SPIRVTargetMachine &TM;
48 bool substituteIntrinsicCalls(Function *
F);
49 bool substituteAbortKHRCalls(Function *
F);
51 Function *removeAggregateTypesFromSignature(Function *
F);
52 bool removeAggregateTypesFromCalls(Function *
F);
55 SPIRVPrepareFunctionsImpl(
const SPIRVTargetMachine &TM) : TM(TM) {}
56 bool runOnModule(
Module &M);
59class SPIRVPrepareFunctionsLegacy :
public ModulePass {
60 const SPIRVTargetMachine &TM;
64 SPIRVPrepareFunctionsLegacy(
const SPIRVTargetMachine &TM)
65 : ModulePass(ID), TM(TM) {}
67 bool runOnModule(
Module &M)
override {
68 return SPIRVPrepareFunctionsImpl(TM).runOnModule(M);
71 StringRef getPassName()
const override {
return "SPIRV prepare functions"; }
76 cl::desc(
"Emit unknown intrinsics as calls to external functions. A "
77 "comma-separated input list of intrinsic prefixes must be "
78 "provided, and only intrinsics carrying a listed prefix get "
79 "emitted as described."),
83char SPIRVPrepareFunctionsLegacy::ID = 0;
86 "SPIRV prepare functions",
false,
false)
89 Function *IntrinsicFunc =
II->getCalledFunction();
90 assert(IntrinsicFunc &&
"Missing function");
91 std::string FuncName = IntrinsicFunc->
getName().
str();
93 FuncName =
"spirv." + FuncName;
102 if (
F &&
F->getFunctionType() == FT)
122 std::string FuncName = lowerLLVMIntrinsicName(
Intrinsic);
124 FuncName +=
".volatile";
133 M->getOrInsertFunction(FuncName,
Intrinsic->getFunctionType());
134 auto IntrinsicID =
Intrinsic->getIntrinsicID();
138 assert(
F &&
"Callee must be a function");
140 switch (IntrinsicID) {
141 case Intrinsic::memset: {
150 IsVolatile->setName(
"isvolatile");
153 auto *MemSet = IRB.
CreateMemSet(Dest, Val, Len, MSI->getDestAlign(),
157 MemSet->eraseFromParent();
160 case Intrinsic::bswap: {
178 AnnoVal =
Ref->getOperand(0);
180 OptAnnoVal =
Ref->getOperand(0);
191 C &&
C->getNumOperands()) {
192 Value *MaybeStruct =
C->getOperand(0);
194 for (
unsigned I = 0,
E = Struct->getNumOperands();
I !=
E; ++
I) {
196 Anno += (
I == 0 ?
": " :
", ") +
197 std::to_string(CInt->getType()->getIntegerBitWidth() == 1
198 ? CInt->getZExtValue()
199 : CInt->getSExtValue());
203 for (
unsigned I = 0,
E = Struct->getType()->getStructNumElements();
205 Anno +=
I == 0 ?
": 0" :
", 0";
212 const std::string &Anno,
219 static const std::regex R(
220 "\\{(\\d+)(?:[:,](\\d+|\"[^\"]*\")(?:,(\\d+|\"[^\"]*\"))*)?\\}");
223 for (std::sregex_iterator
224 It = std::sregex_iterator(Anno.begin(), Anno.end(), R),
225 ItEnd = std::sregex_iterator();
227 if (It->position() != Pos)
229 Pos = It->position() + It->length();
230 std::smatch Match = *It;
232 for (std::size_t i = 1; i < Match.size(); ++i) {
233 std::ssub_match SMatch = Match[i];
234 std::string Item = SMatch.str();
235 if (Item.length() == 0)
237 if (Item[0] ==
'"') {
238 Item = Item.substr(1, Item.length() - 2);
240 static const std::regex RStr(
"^(\\d+)(?:,(\\d+))*$");
241 if (std::smatch MatchStr; std::regex_match(Item, MatchStr, RStr)) {
242 for (std::size_t SubIdx = 1; SubIdx < MatchStr.size(); ++SubIdx)
243 if (std::string SubStr = MatchStr[SubIdx].str(); SubStr.length())
245 ConstantInt::get(
Int32Ty, std::stoi(SubStr))));
256 if (MDsItem.
size() == 0)
260 return Pos ==
static_cast<int>(Anno.length()) ? std::move(MDs)
269 Value *PtrArg =
nullptr;
271 PtrArg = BI->getOperand(0);
273 PtrArg =
II->getOperand(0);
276 4 <
II->arg_size() ?
II->getArgOperand(4) :
nullptr);
285 if (MDs.
size() == 0) {
295 Intrinsic::spv_assign_decoration, {PtrArg->
getType()},
297 II->replaceAllUsesWith(
II->getOperand(0));
307 Type *FSHRetTy = FSHFuncTy->getReturnType();
308 const std::string FuncName = lowerLLVMIntrinsicName(FSHIntrinsic);
312 if (!FSHFunc->
empty()) {
324 unsigned BitWidth = IntTy->getIntegerBitWidth();
326 Value *BitWidthForInsts =
330 Value *RotateModVal =
332 Value *FirstShift =
nullptr, *SecShift =
nullptr;
345 Value *SubRotateVal = IRB.
CreateSub(BitWidthForInsts, RotateModVal);
364 if (!ConstrainedCmpIntrinsic)
386 if (
II->getIntrinsicID() == Intrinsic::assume) {
388 II->getModule(), Intrinsic::SPVIntrinsics::spv_assume);
389 II->setCalledFunction(
F);
390 }
else if (
II->getIntrinsicID() == Intrinsic::expect) {
392 II->getModule(), Intrinsic::SPVIntrinsics::spv_expect,
393 {II->getOperand(0)->getType()});
394 II->setCalledFunction(
F);
401 auto *LifetimeArg0 =
II->getArgOperand(0);
405 II->eraseFromParent();
411 std::optional<TypeSize>
Size =
412 Alloca->getAllocationSize(Alloca->getDataLayout());
414 Builder.CreateIntrinsic(NewID, Alloca->getType(), {SizeVal, LifetimeArg0});
415 II->eraseFromParent();
423 Value *
A = FPI->getArgOperand(0);
427 Builder.SetInsertPoint(
II);
428 std::optional<RoundingMode> Rounding = FPI->getRoundingMode();
429 Value *Product = Builder.CreateFMul(
A,
Mul,
II->getName() +
".mul");
430 Value *Result = Builder.CreateConstrainedFPBinOp(
431 Intrinsic::experimental_constrained_fadd, Product,
Add, {},
432 II->getName() +
".add",
nullptr, Rounding);
433 II->replaceAllUsesWith(Result);
439bool SPIRVPrepareFunctionsImpl::substituteIntrinsicCalls(
Function *
F) {
441 const SPIRVSubtarget &STI = TM.
getSubtarget<SPIRVSubtarget>(*F);
444 for (BasicBlock &BB : *
F) {
454 II->getCalledOperand()->getName().starts_with(
"llvm.spv"))
456 switch (
II->getIntrinsicID()) {
457 case Intrinsic::memset:
458 case Intrinsic::bswap:
461 case Intrinsic::fshl:
462 case Intrinsic::fshr:
466 case Intrinsic::assume:
467 case Intrinsic::expect:
472 case Intrinsic::lifetime_start:
475 II, Intrinsic::SPVIntrinsics::spv_lifetime_start);
477 II->eraseFromParent();
481 case Intrinsic::lifetime_end:
484 II, Intrinsic::SPVIntrinsics::spv_lifetime_end);
486 II->eraseFromParent();
490 case Intrinsic::ptr_annotation:
494 case Intrinsic::experimental_constrained_fmuladd:
498 case Intrinsic::experimental_constrained_fcmp:
499 case Intrinsic::experimental_constrained_fcmps:
506 any_of(SPVAllowUnknownIntrinsics, [
II](
auto &&Prefix) {
509 return II->getCalledFunction()->getName().starts_with(Prefix);
516 for (
auto *
I : EraseFromParent)
517 I->eraseFromParent();
531 transform(ChangedTys, std::back_inserter(MDArgs), [=, &Ctx](
auto &&CTy) {
536 if (!AsmConstraints.empty())
545SPIRVPrepareFunctionsImpl::removeAggregateTypesFromSignature(Function *
F) {
546 bool IsRetAggr =
F->getReturnType()->isAggregateType();
550 if (
F->isIntrinsic())
555 bool HasAggrArg =
llvm::any_of(
F->args(), [](Argument &Arg) {
556 return Arg.getType()->isAggregateType();
558 bool DoClone = IsRetAggr || HasAggrArg;
562 Type *RetType = IsRetAggr ?
B.getInt32Ty() :
F->getReturnType();
564 ChangedTypes.
push_back(std::pair<int, Type *>(-1,
F->getReturnType()));
566 for (
const auto &Arg :
F->args()) {
567 if (Arg.getType()->isAggregateType()) {
570 std::pair<int, Type *>(Arg.getArgNo(), Arg.getType()));
574 FunctionType *NewFTy =
575 FunctionType::get(RetType, ArgTypes,
F->getFunctionType()->isVarArg());
578 F->getName(),
F->getParent());
582 for (
auto &Arg :
F->args()) {
583 StringRef ArgName = Arg.getName();
584 NewFArgIt->setName(ArgName);
585 VMap[&Arg] = &(*NewFArgIt++);
595 std::move(ChangedTypes), NewF->
getName());
602 C->handleOperandChange(
F, NewF);
604 U->replaceUsesOfWith(
F, NewF);
608 if (RetType !=
F->getReturnType())
609 TM.
getSubtarget<SPIRVSubtarget>(*F).getSPIRVGlobalRegistry()->addMutated(
610 NewF,
F->getReturnType());
621 if (!Name.contains(
"__spirv_AbortKHR"))
624 if (Demangled.empty())
644 Msg =
B.CreateLoad(AggTy, Msg);
646 B.CreateIntrinsic(Intrinsic::spv_abort, {Msg->
getType()}, {Msg});
653bool SPIRVPrepareFunctionsImpl::substituteAbortKHRCalls(Function *
F) {
658 for (User *U :
F->users()) {
660 if (!CI || CI->getCalledFunction() !=
F)
662 if (CI->arg_size() != 1)
667 for (CallInst *CI : Calls)
670 return !Calls.empty();
680bool SPIRVPrepareFunctionsImpl::terminateBlocksAfterTrap(
Module &M,
682 assert((IID == Intrinsic::trap || IID == Intrinsic::ubsantrap) &&
683 "Expected trap intrinsic ID");
693 if (!
ST.canUseExtension(SPIRV::Extension::SPV_KHR_abort))
697 for (User *U :
F->users()) {
699 if (!CI || CI->getCalledFunction() !=
F)
705 for (CallInst *CI : Calls) {
719 std::string SafeConstraints(
"=r,");
720 for (
unsigned I = 0u;
I != Tmp.
size() - 1; ++
I) {
721 if (Tmp[
I].
starts_with(
'=') && (Tmp[
I][1] ==
'&' || isalnum(Tmp[
I][1])))
723 SafeConstraints.append(Tmp[
I]).append({
','});
725 SafeConstraints.append(Tmp.
back());
727 return SafeConstraints;
735bool SPIRVPrepareFunctionsImpl::removeAggregateTypesFromCalls(Function *
F) {
736 if (
F->isDeclaration() ||
F->isIntrinsic())
742 if (!CB->getCalledOperand() || CB->getCalledFunction())
744 if (CB->getType()->isAggregateType() ||
746 [](
auto &&Arg) { return Arg->getType()->isAggregateType(); }))
756 for (
auto &&[CB, NewFnTy] : Calls) {
760 Type *RetTy = CB->getType();
766 for (
auto &&Arg : CB->args()) {
767 if (Arg->getType()->isAggregateType()) {
769 ChangedTypes.
emplace_back(Arg.getOperandNo(), Arg->getType());
774 NewFnTy = FunctionType::get(RetTy, NewArgTypes,
775 CB->getFunctionType()->isVarArg());
778 CB->setName(
"spv.mutated_callsite." +
F->getName());
780 CB->setName(
"spv.named_mutated_callsite." +
F->getName() +
"." +
783 std::string Constraints;
785 Constraints = ASM->getConstraintString();
788 NewFnTy, ASM->getAsmString(),
790 ASM->isAlignStack(), ASM->getDialect(), ASM->canThrow()));
794 F->getParent()->getOrInsertNamedMetadata(
"spv.mutated_callsites"),
795 std::move(ChangedTypes), CB->getName(), Constraints);
798 for (
auto &&[CB, NewFTy] : Calls) {
799 if (NewFTy->getReturnType() != CB->getType())
800 TM.
getSubtarget<SPIRVSubtarget>(*F).getSPIRVGlobalRegistry()->addMutated(
802 CB->mutateFunctionType(NewFTy);
808bool SPIRVPrepareFunctionsImpl::runOnModule(
Module &M) {
812 const_cast<SPIRVTargetMachine &
>(TM)
813 .getMutableSubtargetImpl()
814 ->resolveEnvFromModule(M);
817 if (
M.functions().empty()) {
829 Changed |= terminateBlocksAfterTrap(M, Intrinsic::trap);
830 Changed |= terminateBlocksAfterTrap(M, Intrinsic::ubsantrap);
832 for (Function &
F : M) {
833 Changed |= substituteAbortKHRCalls(&
F);
834 Changed |= substituteIntrinsicCalls(&
F);
836 Changed |= removeAggregateTypesFromCalls(&
F);
839 std::vector<Function *> FuncsWorklist;
841 FuncsWorklist.push_back(&
F);
843 for (
auto *
F : FuncsWorklist) {
844 Function *NewF = removeAggregateTypesFromSignature(
F);
847 F->eraseFromParent();
856 return SPIRVPrepareFunctionsImpl(TM).runOnModule(M)
863 return new SPIRVPrepareFunctionsLegacy(TM);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Machine Check Debug Module
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static void lowerFunnelShifts(IntrinsicInst *FSHIntrinsic)
static std::string getAnnotation(Value *AnnoVal, Value *OptAnnoVal)
static void lowerConstrainedFPCmpIntrinsic(ConstrainedFPCmpIntrinsic *ConstrainedCmpIntrinsic, SmallVector< Instruction * > &EraseFromParent)
static void lowerConstrainedFmuladd(IntrinsicInst *II, SmallVector< Instruction * > &EraseFromParent)
static void lowerPtrAnnotation(IntrinsicInst *II)
static bool lowerIntrinsicToFunction(IntrinsicInst *Intrinsic, const TargetTransformInfo &TTI)
static bool isAbortKHRBuiltin(const Function &F)
static SmallVector< Metadata * > parseAnnotation(Value *I, const std::string &Anno, LLVMContext &Ctx, Type *Int32Ty)
static std::string fixMultiOutputConstraintString(StringRef Constraints)
static void rewriteAbortKHRCall(CallInst *CI)
static void addFunctionTypeMutation(NamedMDNode *NMD, SmallVector< std::pair< int, Type * > > ChangedTys, StringRef Name, StringRef AsmConstraints="")
static bool toSpvLifetimeIntrinsic(IntrinsicInst *II, Intrinsic::ID NewID)
static void lowerExpectAssume(IntrinsicInst *II)
static Function * getOrCreateFunction(Module *M, Type *RetTy, ArrayRef< Type * > ArgTypes, StringRef Name)
This class represents an incoming formal argument to a Function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
Type * getParamByValType(unsigned ArgNo) const
Extract the byval type for a call or parameter.
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
This class represents a function call, abstracting a target machine's calling convention.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This is the shared class of boolean and integer constants.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Constrained floating point compare intrinsics.
LLVM_ABI FCmpInst::Predicate getPredicate() const
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
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.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
FunctionType * getFunctionType() const
Returns the FunctionType for me.
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Type * getReturnType() const
Returns the type of the ret val.
void setCallingConv(CallingConv::ID CC)
Argument * getArg(unsigned i) const
Module * getParent()
Get the module that this global value is contained inside of...
void setDSOLocal(bool Local)
@ ExternalLinkage
Externally visible function.
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
LLVM_ABI CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={})
Create a call to intrinsic ID with Args, mangled using OverloadTypes.
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
ReturnInst * CreateRet(Value *V)
Create a 'ret <val>' instruction.
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
CallInst * CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, MaybeAlign Align, bool isVolatile=false, const AAMDNodes &AAInfo=AAMDNodes())
Create and insert a memset to the specified pointer and the specified value.
ReturnInst * CreateRetVoid()
Create a 'ret void' instruction.
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Value * CreateURem(Value *LHS, Value *RHS, const Twine &Name="")
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
void LowerIntrinsicCall(CallInst *CI)
Replace a call to the specified intrinsic function.
This is an important class for using LLVM in a threaded context.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
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.
LLVMContext & getContext() const
Get the global data context.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Module * getParent()
Get the module that holds this named metadata collection.
LLVM_ABI void addOperand(MDNode *M)
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.
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
bool canUseExtension(SPIRV::Extension::Extension E) const
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::string str() const
Get the contents as an std::string.
const Triple & getTargetTriple() const
const STC & getSubtarget(const Function &F) const
This method returns a pointer to the specified type of TargetSubtargetInfo.
VendorType getVendor() const
Get the parsed vendor type of this triple.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isAggregateType() const
Return true if the type is an aggregate type.
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.
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.
Type * getElementType() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI bool isTargetIntrinsic(ID IID)
isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.
std::string lookupBuiltinNameHelper(StringRef DemangledCall, FPDecorationId *DecorationId)
Parses the name part of the demangled builtin call.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
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
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
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 sortBlocks(Function &F)
LLVM_ABI void SplitString(StringRef Source, SmallVectorImpl< StringRef > &OutFragments, StringRef Delimiters=" \t\n\v\f\r")
SplitString - Split up the specified string according to the specified delimiters,...
Function * getOrCreateBackendServiceFunction(Module &M)
std::string getOclOrSpirvBuiltinDemangledName(StringRef Name)
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
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 unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA=false, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Insert an unreachable instruction before the specified instruction, making it and the rest of the cod...
@ Ref
The access may reference the value stored in memory.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
void replace(R &&Range, const T &OldValue, const T &NewValue)
Provide wrappers to std::replace which take ranges instead of having to pass begin/end explicitly.
FunctionAddr VTableAddr Next
constexpr unsigned BitWidth
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI void expandMemSetAsLoop(MemSetInst *MemSet, const TargetTransformInfo *TTI=nullptr)
Expand MemSet as a loop.
LLVM_ABI void CloneFunctionInto(Function *NewFunc, const Function *OldFunc, ValueToValueMapTy &VMap, CloneFunctionChangeType Changes, SmallVectorImpl< ReturnInst * > &Returns, const char *NameSuffix="", ClonedCodeInfo *CodeInfo=nullptr, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr)
Clone OldFunc into NewFunc, transforming the old arguments into references to VMap values.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool to_integer(StringRef S, N &Num, unsigned Base=0)
Convert the string S to an integer of the specified type using the radix Base. If Base is 0,...
ModulePass * createSPIRVPrepareFunctionsPass(const SPIRVTargetMachine &TM)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Implement std::hash so that hash_code can be used in STL containers.