36#include "llvm/IR/IntrinsicsSPIRV.h"
48class SPIRVPrepareFunctionsImpl {
49 const SPIRVTargetMachine &TM;
50 function_ref<
const TargetTransformInfo &(
Function &)> GetTTI;
51 bool substituteIntrinsicCalls(
Function *
F);
52 bool substituteAbortKHRCalls(
Function *
F);
55 bool removeAggregateTypesFromCalls(
Function *
F);
58 SPIRVPrepareFunctionsImpl(
59 const SPIRVTargetMachine &TM,
60 function_ref<
const TargetTransformInfo &(
Function &)> GetTTI)
61 : TM(TM), GetTTI(GetTTI) {}
62 bool runOnModule(
Module &M);
65class SPIRVPrepareFunctionsLegacy :
public ModulePass {
66 const SPIRVTargetMachine &TM;
70 SPIRVPrepareFunctionsLegacy(
const SPIRVTargetMachine &TM)
71 : ModulePass(ID), TM(TM) {}
73 bool runOnModule(
Module &M)
override {
74 auto GetTTI = [
this](
Function &
F) ->
const TargetTransformInfo & {
75 return getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
F);
77 return SPIRVPrepareFunctionsImpl(TM, GetTTI).runOnModule(M);
80 void getAnalysisUsage(AnalysisUsage &AU)
const override {
84 StringRef getPassName()
const override {
return "SPIRV prepare functions"; }
89 cl::desc(
"Emit unknown intrinsics as calls to external functions. A "
90 "comma-separated input list of intrinsic prefixes must be "
91 "provided, and only intrinsics carrying a listed prefix get "
92 "emitted as described."),
96char SPIRVPrepareFunctionsLegacy::ID = 0;
99 "SPIRV prepare functions",
false,
false)
105 Function *IntrinsicFunc =
II->getCalledFunction();
106 assert(IntrinsicFunc &&
"Missing function");
107 std::string FuncName = IntrinsicFunc->
getName().
str();
109 FuncName =
"spirv." + FuncName;
118 if (
F &&
F->getFunctionType() == FT)
143 "cannot lower the intrinsic '" +
144 Intrinsic->getCalledFunction()->getName() +
145 "' that takes a metadata argument",
156 FuncName +=
".volatile";
164 M->getOrInsertFunction(FuncName,
Intrinsic->getFunctionType());
165 auto IntrinsicID =
Intrinsic->getIntrinsicID();
170 switch (IntrinsicID) {
171 case Intrinsic::memset: {
180 IsVolatile->setName(
"isvolatile");
183 auto *MemSet = IRB.
CreateMemSet(Dest, Val, Len, MSI->getDestAlign(),
187 MemSet->eraseFromParent();
190 case Intrinsic::bswap: {
194 Intrinsic::bswap,
Intrinsic->getType(),
F->getArg(0));
208 AnnoVal =
Ref->getOperand(0);
210 OptAnnoVal =
Ref->getOperand(0);
221 C &&
C->getNumOperands()) {
222 Value *MaybeStruct =
C->getOperand(0);
224 for (
unsigned I = 0,
E = Struct->getNumOperands();
I !=
E; ++
I) {
226 Anno += (
I == 0 ?
": " :
", ") +
227 std::to_string(CInt->getType()->getIntegerBitWidth() == 1
228 ? CInt->getZExtValue()
229 : CInt->getSExtValue());
233 for (
unsigned I = 0,
E = Struct->getType()->getStructNumElements();
235 Anno +=
I == 0 ?
": 0" :
", 0";
242 const std::string &Anno,
249 static const std::regex R(
250 "\\{(\\d+)(?:[:,](\\d+|\"[^\"]*\")(?:,(\\d+|\"[^\"]*\"))*)?\\}");
253 for (std::sregex_iterator
254 It = std::sregex_iterator(Anno.begin(), Anno.end(), R),
255 ItEnd = std::sregex_iterator();
257 if (It->position() != Pos)
259 Pos = It->position() + It->length();
260 std::smatch Match = *It;
262 for (std::size_t i = 1; i < Match.size(); ++i) {
263 std::ssub_match SMatch = Match[i];
264 std::string Item = SMatch.str();
265 if (Item.length() == 0)
267 if (Item[0] ==
'"') {
268 Item = Item.substr(1, Item.length() - 2);
270 static const std::regex RStr(
"^(\\d+)(?:,(\\d+))*$");
271 if (std::smatch MatchStr; std::regex_match(Item, MatchStr, RStr)) {
272 for (std::size_t SubIdx = 1; SubIdx < MatchStr.size(); ++SubIdx)
273 if (std::string SubStr = MatchStr[SubIdx].str(); SubStr.length())
275 ConstantInt::get(Int32Ty, std::stoi(SubStr))));
286 if (MDsItem.
size() == 0)
290 return Pos ==
static_cast<int>(Anno.length()) ? std::move(MDs)
299 Value *PtrArg =
nullptr;
301 PtrArg = BI->getOperand(0);
303 PtrArg =
II->getOperand(0);
306 4 <
II->arg_size() ?
II->getArgOperand(4) :
nullptr);
315 if (MDs.
size() == 0) {
317 Int32Ty,
static_cast<uint32_t>(SPIRV::Decoration::UserSemantic)));
325 Intrinsic::spv_assign_decoration, {PtrArg->
getType()},
327 II->replaceAllUsesWith(
II->getOperand(0));
337 Type *FSHRetTy = FSHFuncTy->getReturnType();
342 if (!FSHFunc->
empty()) {
354 unsigned BitWidth = IntTy->getIntegerBitWidth();
356 Value *BitWidthForInsts =
360 Value *RotateModVal =
362 Value *FirstShift =
nullptr, *SecShift =
nullptr;
375 Value *SubRotateVal = IRB.
CreateSub(BitWidthForInsts, RotateModVal);
394 if (!ConstrainedCmpIntrinsic)
416 if (
II->getIntrinsicID() == Intrinsic::assume) {
418 II->getModule(), Intrinsic::SPVIntrinsics::spv_assume);
419 II->setCalledFunction(
F);
420 }
else if (
II->getIntrinsicID() == Intrinsic::expect) {
422 II->getModule(), Intrinsic::SPVIntrinsics::spv_expect,
423 {II->getOperand(0)->getType()});
424 II->setCalledFunction(
F);
425 }
else if (
II->getIntrinsicID() == Intrinsic::expect_with_probability) {
428 Value *Res =
II->getArgOperand(0);
433 Intrinsic::SPVIntrinsics::spv_expect, {
II->getType()},
434 {
II->getArgOperand(0),
II->getArgOperand(1)});
443 auto *LifetimeArg0 =
II->getArgOperand(0);
447 II->eraseFromParent();
452 if (!Alloca || !Alloca->isStaticAlloca()) {
453 II->eraseFromParent();
458 std::optional<TypeSize>
Size =
459 Alloca->getAllocationSize(Alloca->getDataLayout());
461 Builder.CreateIntrinsic(NewID, Alloca->getType(), {SizeVal, LifetimeArg0});
462 II->eraseFromParent();
470 Value *
A = FPI->getArgOperand(0);
474 Builder.SetInsertPoint(
II);
475 std::optional<RoundingMode> Rounding = FPI->getRoundingMode();
476 Value *Product = Builder.CreateFMul(
A,
Mul,
II->getName() +
".mul");
477 Value *Result = Builder.CreateConstrainedFPBinOp(
478 Intrinsic::experimental_constrained_fadd, Product,
Add, {},
479 II->getName() +
".add",
nullptr, Rounding);
480 II->replaceAllUsesWith(Result);
502 Type *Ty =
X->getType();
503 Value *Res = Builder.CreateIntrinsic(
504 IsMax ? Intrinsic::maxnum : Intrinsic::minnum, {Ty}, {
X,
Y}, FMF);
506 Value *XSign = Builder.CreateCopySign(ConstantFP::get(Ty, 1.0),
X);
508 Value *
Sign = IsMax ? Builder.CreateSelect(XNeg,
Y,
X)
509 : Builder.CreateSelect(XNeg,
X,
Y);
510 Res = Builder.CreateCopySign(Res,
Sign);
513 Value *Uno = Builder.CreateFCmpUNO(
X,
Y);
523 Builder,
II->getIntrinsicID() == Intrinsic::maximum,
II->getArgOperand(0),
524 II->getArgOperand(1),
II->getFastMathFlags());
526 II->replaceAllUsesWith(Res);
536 bool IsMax =
II->getIntrinsicID() == Intrinsic::vector_reduce_fmaximum;
537 Value *Vec =
II->getArgOperand(0);
541 for (
unsigned I = 0;
I < NumElts; ++
I)
542 Elts.
push_back(Builder.CreateExtractElement(Vec,
I));
543 Value *Res = Elts[0];
548 II->replaceAllUsesWith(Res);
554bool SPIRVPrepareFunctionsImpl::substituteIntrinsicCalls(
Function *
F) {
555 if (
F->isDeclaration())
559 const SPIRVSubtarget &STI = TM.
getSubtarget<SPIRVSubtarget>(*F);
560 SmallVector<Instruction *> EraseFromParent;
561 const TargetTransformInfo &
TTI = GetTTI(*
F);
562 for (BasicBlock &BB : *
F) {
572 II->getCalledOperand()->getName().starts_with(
"llvm.spv"))
574 switch (
II->getIntrinsicID()) {
575 case Intrinsic::memset:
576 case Intrinsic::bswap:
579 case Intrinsic::fshl:
580 case Intrinsic::fshr:
584 case Intrinsic::minimum:
585 case Intrinsic::maximum:
589 case Intrinsic::vector_reduce_fminimum:
590 case Intrinsic::vector_reduce_fmaximum:
594 case Intrinsic::assume:
595 case Intrinsic::expect:
596 case Intrinsic::expect_with_probability:
601 case Intrinsic::lifetime_start:
604 II, Intrinsic::SPVIntrinsics::spv_lifetime_start);
606 II->eraseFromParent();
610 case Intrinsic::lifetime_end:
613 II, Intrinsic::SPVIntrinsics::spv_lifetime_end);
615 II->eraseFromParent();
619 case Intrinsic::ptr_annotation:
623 case Intrinsic::experimental_constrained_fmuladd:
627 case Intrinsic::experimental_constrained_fcmp:
628 case Intrinsic::experimental_constrained_fcmps:
635 if (
II->isAssumeLikeIntrinsic()) {
636 if (!
II->getType()->isVoidTy())
638 II->eraseFromParent();
642 if (STI.getTargetTriple().getVendor() ==
Triple::AMD ||
643 any_of(SPVAllowUnknownIntrinsics, [
II](
auto &&Prefix) {
646 return II->getCalledFunction()->getName().starts_with(Prefix);
653 for (
auto *
I : EraseFromParent)
654 I->eraseFromParent();
668 transform(ChangedTys, std::back_inserter(MDArgs), [=, &Ctx](
auto &&CTy) {
673 if (!AsmConstraints.empty())
682SPIRVPrepareFunctionsImpl::removeAggregateTypesFromSignature(
Function *
F) {
683 bool IsRetAggr =
F->getReturnType()->isAggregateType();
687 if (
F->isIntrinsic())
692 bool HasAggrArg =
llvm::any_of(
F->args(), [](Argument &Arg) {
693 return Arg.getType()->isAggregateType();
695 bool DoClone = IsRetAggr || HasAggrArg;
699 Type *RetType = IsRetAggr ?
B.getInt32Ty() :
F->getReturnType();
701 ChangedTypes.
push_back(std::pair<int, Type *>(-1,
F->getReturnType()));
703 for (
const auto &Arg :
F->args()) {
704 if (Arg.getType()->isAggregateType()) {
707 std::pair<int, Type *>(Arg.getArgNo(), Arg.getType()));
711 FunctionType *NewFTy =
712 FunctionType::get(RetType, ArgTypes,
F->getFunctionType()->isVarArg());
715 F->getName(),
F->getParent());
719 for (
auto &Arg :
F->args()) {
720 StringRef ArgName = Arg.getName();
721 NewFArgIt->setName(ArgName);
722 VMap[&Arg] = &(*NewFArgIt++);
733 std::move(ChangedTypes), NewF->
getName());
735 for (User *U :
F->users()) {
742 "RAUW requires F and NewF to share the same pointer type");
743 F->replaceAllUsesWith(NewF);
746 if (RetType !=
F->getReturnType())
747 TM.
getSubtarget<SPIRVSubtarget>(*F).getSPIRVGlobalRegistry()->addMutated(
748 NewF,
F->getReturnType());
759 if (!Name.contains(
"__spirv_AbortKHR"))
762 if (Demangled.empty())
782 Msg =
B.CreateLoad(AggTy,
Msg);
784 B.CreateIntrinsic(Intrinsic::spv_abort, {
Msg->getType()}, {
Msg});
791bool SPIRVPrepareFunctionsImpl::substituteAbortKHRCalls(
Function *
F) {
798 if (!CI || CI->getCalledFunction() !=
F)
800 if (CI->arg_size() != 1)
816bool SPIRVPrepareFunctionsImpl::terminateBlocksAfterTrap(
Module &M,
818 assert((IID == Intrinsic::trap || IID == Intrinsic::ubsantrap) &&
819 "Expected trap intrinsic ID");
829 if (!
ST.canUseExtension(SPIRV::Extension::SPV_KHR_abort))
835 if (!CI || CI->getCalledFunction() !=
F)
850 std::string SafeConstraints(
"=r,");
851 for (
unsigned I = 0u;
I != Tmp.
size() - 1; ++
I) {
852 if (Tmp[
I].
starts_with(
'=') && (Tmp[
I][1] ==
'&' || isalnum(Tmp[
I][1])))
854 SafeConstraints.append(Tmp[
I]).append({
','});
856 SafeConstraints.append(Tmp.
back());
858 return SafeConstraints;
866bool SPIRVPrepareFunctionsImpl::removeAggregateTypesFromCalls(
Function *
F) {
867 if (
F->isDeclaration() ||
F->isIntrinsic())
873 if (!CB->getCalledOperand() || CB->getCalledFunction())
875 if (CB->getType()->isAggregateType() ||
877 [](
auto &&Arg) { return Arg->getType()->isAggregateType(); }))
887 unsigned MutatedCallIdx = 0;
888 for (
auto &&[CB, NewFnTy] : Calls) {
892 Type *RetTy = CB->getType();
898 for (
auto &&Arg : CB->args()) {
899 if (Arg->getType()->isAggregateType()) {
901 ChangedTypes.
emplace_back(Arg.getOperandNo(), Arg->getType());
906 NewFnTy = FunctionType::get(RetTy, NewArgTypes,
907 CB->getFunctionType()->isVarArg());
911 (
"spv.mutated_callsite." +
F->getName() +
"." + Twine(MutatedCallIdx++))
914 "spv.mutated_callsite",
917 std::string Constraints;
919 Constraints = ASM->getConstraintString();
922 NewFnTy, ASM->getAsmString(),
924 ASM->isAlignStack(), ASM->getDialect(), ASM->canThrow()));
928 F->getParent()->getOrInsertNamedMetadata(
"spv.mutated_callsites"),
929 std::move(ChangedTypes),
Key, Constraints);
932 for (
auto &&[CB, NewFTy] : Calls) {
933 if (NewFTy->getReturnType() != CB->getType())
934 TM.
getSubtarget<SPIRVSubtarget>(*F).getSPIRVGlobalRegistry()->addMutated(
936 CB->mutateFunctionType(NewFTy);
942bool SPIRVPrepareFunctionsImpl::runOnModule(
Module &M) {
946 const_cast<SPIRVTargetMachine &
>(TM)
947 .getMutableSubtargetImpl()
948 ->resolveEnvFromModule(M);
951 if (
M.getFunctionDefs().empty()) {
963 Changed |= terminateBlocksAfterTrap(M, Intrinsic::trap);
964 Changed |= terminateBlocksAfterTrap(M, Intrinsic::ubsantrap);
966 for (GlobalVariable &GV :
M.globals()) {
969 if (GV.hasAvailableExternallyLinkage() && !GV.isDeclaration()) {
976 std::vector<Function *> FuncsWorklist;
980 if (
F.hasAvailableExternallyLinkage() && !
F.isDeclaration()) {
985 Changed |= substituteAbortKHRCalls(&
F);
986 Changed |= substituteIntrinsicCalls(&
F);
988 Changed |= removeAggregateTypesFromCalls(&
F);
989 FuncsWorklist.push_back(&
F);
992 for (
auto *
F : FuncsWorklist) {
993 Function *NewF = removeAggregateTypesFromSignature(
F);
996 F->eraseFromParent();
1010 return SPIRVPrepareFunctionsImpl(TM, GetTTI).runOnModule(M)
1017 return new SPIRVPrepareFunctionsLegacy(TM);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
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 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
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
static Value * expandFMinimumMaximum(IRBuilderBase &Builder, bool IsMax, Value *X, Value *Y, FastMathFlags FMF)
static void lowerFunnelShifts(IntrinsicInst *FSHIntrinsic)
static std::string getAnnotation(Value *AnnoVal, Value *OptAnnoVal)
spirv prepare SPIRV prepare static false std::string lowerLLVMIntrinsicName(IntrinsicInst *II)
static void lowerVectorReduceFMinimumMaximum(IntrinsicInst *II, SmallVector< Instruction * > &EraseFromParent)
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 void lowerFMinimumMaximum(IntrinsicInst *II, SmallVector< Instruction * > &EraseFromParent)
static Function * getOrCreateFunction(Module *M, Type *RetTy, ArrayRef< Type * > ArgTypes, StringRef Name)
#define SPIRV_WAS_AVAILABLE_EXTERNALLY_ATTR
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
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.
InstListType::iterator iterator
Instruction iterators...
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.
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
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
Diagnostic information for unsupported feature in backend.
Convenience struct for specifying and reasoning about fast-math flags.
bool noSignedZeros() 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
LLVM_ABI void setComdat(Comdat *C)
Module * getParent()
Get the module that this global value is contained inside of...
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
@ ExternalLinkage
Externally visible function.
Common base class shared among various IRBuilders.
LLVM_ABI CallInst * CreateIntrinsicWithoutFolding(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.
LLVM_ABI Value * CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name="")
Return a vector value that contains.
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.
LLVM_ABI Value * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={}, function_ref< void(CallInst *)> SetFn=[](CallInst *) {})
Variant to create a possibly constant-folded intrinsic.
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.
LLVM_ABI 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)
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
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
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.
Analysis pass providing the TargetTransformInfo.
const STC & getSubtarget(const Function &F) const
This method returns a pointer to the specified type of TargetSubtargetInfo.
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.
@ 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.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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)
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI void ReplaceInstWithValue(BasicBlock::iterator &BI, Value *V)
Replace all uses of an instruction (specified by BI) with a value, then remove and delete the origina...
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.
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
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_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
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.
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.
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
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)
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Implement std::hash so that hash_code can be used in STL containers.