9#ifndef LLVM_ANALYSIS_TARGETLIBRARYINFO_H
10#define LLVM_ANALYSIS_TARGETLIBRARYINFO_H
62 StringRef VABIPrefix, std::optional<CallingConv::ID> Conv)
63 : ScalarFnName(ScalarFnName), VectorFnName(VectorFnName),
64 VectorizationFactor(VectorizationFactor), Masked(Masked),
65 VABIPrefix(VABIPrefix),
66 CC(Conv ? static_cast<
unsigned>(*Conv) + 1u : 0u) {}
84#define GET_TARGET_LIBRARY_INFO_ENUM
85#include "llvm/Analysis/TargetLibraryInfo.inc"
96 unsigned char AvailableArray[(NumLibFuncs+3)/4];
98#define GET_TARGET_LIBRARY_INFO_IMPL_DECL
99#include "llvm/Analysis/TargetLibraryInfo.inc"
100 bool ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param, ShouldSignExtI32Return;
102 bool IsErrnoFunctionCall;
109 void setState(LibFunc
F, AvailabilityState State) {
110 AvailableArray[
F/4] &= ~(3 << 2*(
F&3));
111 AvailableArray[
F/4] |= State << 2*(
F&3);
113 AvailabilityState getState(LibFunc
F)
const {
116 return static_cast<AvailabilityState
>((AvailableArray[
F/4] >> 2*(
F&3)) & 3);
120 std::vector<VecDesc> VectorDescs;
123 std::vector<VecDesc> ScalarDescs;
127 LLVM_ABI bool isValidProtoForLibFunc(
const FunctionType &FTy, LibFunc
F,
164 setState(
F, Unavailable);
169 setState(
F, StandardName);
175 if (
StringRef(StandardNamesStrTable.getCString(StandardNamesOffsets[
F]),
176 StandardNamesSizeTable[
F]) != Name) {
177 setState(
F, CustomName);
178 CustomNames[
F] = std::string(Name);
179 assert(CustomNames.contains(
F));
181 setState(
F, StandardName);
226 ShouldExtI32Param = Val;
233 ShouldExtI32Return = Val;
239 ShouldSignExtI32Param = Val;
245 ShouldSignExtI32Return = Val;
288 std::bitset<NumLibFuncs> OverrideAsUnavailable;
294 std::optional<const Function *>
F = std::nullopt)
298 if ((*F)->hasFnAttribute(
"no-builtins"))
302 AttributeSet FnAttrs = (*F)->getAttributes().getFnAttrs();
304 if (!Attr.isStringAttribute())
306 auto AttrStr = Attr.getKindAsString();
307 if (!AttrStr.consume_front(
"no-builtin-"))
326 bool AllowCallerSuperset)
const {
327 if (!AllowCallerSuperset)
328 return OverrideAsUnavailable == CalleeTLI.OverrideAsUnavailable;
331 return (CalleeTLI.OverrideAsUnavailable & ~OverrideAsUnavailable).none();
338 return Impl->isValidProtoForLibFunc(FTy,
F, M);
346 return Impl->getLibFunc(funcName);
350 return Impl->getLibFunc(FDecl);
366 return Impl->getLibFunc(Opcode, Ty);
376 assert(
F < OverrideAsUnavailable.size() &&
"out-of-bounds LibFunc");
377 OverrideAsUnavailable.set(
F);
380 TargetLibraryInfoImpl::AvailabilityState
getState(LibFunc
F)
const {
381 assert(
F < OverrideAsUnavailable.size() &&
"out-of-bounds LibFunc");
382 if (OverrideAsUnavailable[
F])
383 return TargetLibraryInfoImpl::Unavailable;
384 return Impl->getState(
F);
389 return getState(
F) != TargetLibraryInfoImpl::Unavailable;
392 return Impl->isFunctionVectorizable(
F, VF);
395 return Impl->isFunctionVectorizable(
F);
398 bool Masked =
false)
const {
399 return Impl->getVectorizedFunction(
F, VF,
Masked);
403 return Impl->getVectorMappingInfo(
F, VF,
Masked);
409 if (
getState(
F) == TargetLibraryInfoImpl::Unavailable)
414 case LibFunc_acos:
case LibFunc_acosf:
case LibFunc_acosl:
415 case LibFunc_asin:
case LibFunc_asinf:
case LibFunc_asinl:
416 case LibFunc_atan2:
case LibFunc_atan2f:
case LibFunc_atan2l:
417 case LibFunc_atan:
case LibFunc_atanf:
case LibFunc_atanl:
418 case LibFunc_copysign:
case LibFunc_copysignf:
case LibFunc_copysignl:
419 case LibFunc_cos:
case LibFunc_cosf:
case LibFunc_cosl:
420 case LibFunc_cosh:
case LibFunc_coshf:
case LibFunc_coshl:
421 case LibFunc_exp2:
case LibFunc_exp2f:
case LibFunc_exp2l:
422 case LibFunc_exp10:
case LibFunc_exp10f:
case LibFunc_exp10l:
423 case LibFunc_ldexp:
case LibFunc_ldexpf:
case LibFunc_ldexpl:
424 case LibFunc_log2:
case LibFunc_log2f:
case LibFunc_log2l:
425 case LibFunc_memcmp:
case LibFunc_bcmp:
case LibFunc_strcmp:
426 case LibFunc_memcpy:
case LibFunc_memset:
case LibFunc_memmove:
427 case LibFunc_sin:
case LibFunc_sinf:
case LibFunc_sinl:
428 case LibFunc_sinh:
case LibFunc_sinhf:
case LibFunc_sinhl:
429 case LibFunc_sqrt:
case LibFunc_sqrtf:
case LibFunc_sqrtl:
430 case LibFunc_sqrt_finite:
case LibFunc_sqrtf_finite:
431 case LibFunc_sqrtl_finite:
432 case LibFunc_strcpy:
case LibFunc_stpcpy:
case LibFunc_strlen:
433 case LibFunc_strnlen:
case LibFunc_strstr:
case LibFunc_memchr:
434 case LibFunc_memccpy:
case LibFunc_mempcpy:
case LibFunc_tan:
435 case LibFunc_tanf:
case LibFunc_tanl:
case LibFunc_tanh:
436 case LibFunc_tanhf:
case LibFunc_tanhl:
446 return StringRef(TargetLibraryInfoImpl::StandardNamesStrTable.getCString(
447 TargetLibraryInfoImpl::StandardNamesOffsets[
F]),
448 TargetLibraryInfoImpl::StandardNamesSizeTable[
F]);
453 if (State == TargetLibraryInfoImpl::Unavailable)
455 if (State == TargetLibraryInfoImpl::StandardName)
457 Impl->StandardNamesStrTable.getCString(Impl->StandardNamesOffsets[
F]),
458 Impl->StandardNamesSizeTable[
F]);
459 assert(State == TargetLibraryInfoImpl::CustomName);
460 return Impl->CustomNames.find(
F)->second;
464 bool &ShouldZExtBoolReturn,
468 bool &ShouldExtI32Return,
469 bool &ShouldSignExtI32Param,
470 bool &ShouldSignExtI32Return,
478 bool ShouldSignExtI32Param_,
480 if (ShouldExtI32Param_)
481 return Signed ? Attribute::SExt : Attribute::ZExt;
482 if (ShouldSignExtI32Param_)
483 return Attribute::SExt;
489 bool ShouldZExtBoolParam, ShouldZExtBoolReturn;
497 return Signed ? Attribute::SExt : Attribute::ZExt;
502 bool ShouldExtI32Param, ShouldExtI32Return;
503 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
505 ShouldSignExtI32Param, ShouldSignExtI32Return,
T);
506 return getExtAttrForI32Param(ShouldExtI32Param, ShouldSignExtI32Param,
511 return getExtAttrForI32Param(Impl->ShouldExtI32Param,
512 Impl->ShouldSignExtI32Param,
Signed);
520 bool ShouldSignExtI32Return_,
522 if (ShouldExtI32Return_)
523 return Signed ? Attribute::SExt : Attribute::ZExt;
524 if (ShouldSignExtI32Return_)
525 return Attribute::SExt;
532 bool ShouldExtI32Param, ShouldExtI32Return;
533 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
535 ShouldSignExtI32Param, ShouldSignExtI32Return,
T);
536 return getExtAttrForI32Return(ShouldExtI32Return, ShouldSignExtI32Return,
541 return getExtAttrForI32Return(Impl->ShouldExtI32Return,
542 Impl->ShouldSignExtI32Return,
Signed);
549 bool Signed,
bool Ret =
false,
551 if (
auto AK = getExtAttrForI32Param(
Signed))
552 for (
auto ArgNo : ArgNos)
553 AL = AL.addParamAttribute(*
C, ArgNo, AK);
555 if (
auto AK = getExtAttrForI32Return(
Signed))
556 AL = AL.addRetAttribute(*
C, AK);
575 return Impl->getIntSize();
583 ModuleAnalysisManager::Invalidator &) {
587 FunctionAnalysisManager::Invalidator &) {
594 Impl->getWidestVF(ScalarF, FixedVF, ScalableVF);
625 : BaselineInfoImpl(
std::
move(BaselineInfoImpl)) {}
633 std::optional<TargetLibraryInfoImpl> BaselineInfoImpl;
638 std::optional<TargetLibraryInfo> TLI;
640 virtual void anchor();
658 TLI = TLA.run(
F, DummyFAM);
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
@ Unavailable
We know the block is not fully available. This is a fixpoint.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class holds the attributes for a particular argument, parameter, function, or return value.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ None
No attributes have been set.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
bool isNoBuiltin() const
Return true if the call should not be treated as a call to a builtin.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
This is the shared class of boolean and integer constants.
Class to represent function types.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
This is an important class for using LLVM in a threaded context.
A Module instance is used to store all the information related to an LLVM module.
A set of analyses that are preserved following a run of a transformation pass.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
Analysis pass providing the TargetLibraryInfo.
TargetLibraryAnalysis()=default
Default construct the library analysis.
LLVM_ABI TargetLibraryInfo run(const Function &F, FunctionAnalysisManager &)
TargetLibraryAnalysis(TargetLibraryInfoImpl BaselineInfoImpl)
Construct a library analysis with baseline Module-level info.
Implementation of the target library information.
void setShouldExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext or zeroext attributes if they...
void setShouldExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext or zeroext attributes if they ...
friend class TargetLibraryInfo
LLVM_ABI void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &Scalable) const
Returns the largest vectorization factor used in the list of vector functions.
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
Return true if the function F has a vector equivalent with vectorization factor VF.
void setShouldSignExtI32Param(bool Val)
Set to true iff i32 parameters to library functions should have signext attribute if they correspond ...
void setAvailableWithName(LibFunc F, StringRef Name)
Forces a function to be marked as available and provide an alternate name that must be used.
TargetLibraryInfoImpl()=delete
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
LLVM_ABI void addVectorizableFunctionsFromVecLib(enum VectorLibrary VecLib, const llvm::Triple &TargetTriple)
Calls addVectorizableFunctions with a known preset of functions for the given vector library.
void setIntSize(unsigned Bits)
Initialize the C-level size of an integer.
LLVM_ABI unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
LLVM_ABI void addVectorizableFunctions(ArrayRef< VecDesc > Fns)
Add a set of scalar -> vector mappings, queryable via getVectorizedFunction and getScalarizedFunction...
LLVM_ABI const VecDesc * getVectorMappingInfo(StringRef F, const ElementCount &VF, bool Masked) const
Return a pointer to a VecDesc object holding all info for scalar to vector mappings in TLI for the eq...
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
bool isErrnoFunctionCall() const
void setShouldSignExtI32Return(bool Val)
Set to true iff i32 results from library functions should have signext attribute if they correspond t...
LLVM_ABI TargetLibraryInfoImpl & operator=(const TargetLibraryInfoImpl &TLI)
LLVM_ABI void disableAllFunctions()
Disables all builtins.
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
LLVM_ABI LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
LLVM_ABI StringRef getVectorizedFunction(StringRef F, const ElementCount &VF, bool Masked) const
Return the name of the equivalent of F, vectorized with factor VF.
void setAvailable(LibFunc F)
Forces a function to be marked as available.
TargetLibraryInfoWrapperPass()
The default constructor should not be used and is only for pass manager initialization purposes.
TargetLibraryInfo & getTLI(const Function &F)
Provides information about what library functions are available for the current target.
AttributeList getAttrList(LLVMContext *C, ArrayRef< unsigned > ArgNos, bool Signed, bool Ret=false, AttributeList AL=AttributeList()) const
static Attribute::AttrKind getExtAttrForI32Param(const Triple &T, bool Signed=true)
static Attribute::AttrKind getExtAttrForI8Param(bool Signed=true)
bool areInlineCompatible(const TargetLibraryInfo &CalleeTLI, bool AllowCallerSuperset) const
Determine whether a callee with the given TLI can be inlined into caller with this TLI,...
bool invalidate(Module &, const PreservedAnalyses &, ModuleAnalysisManager::Invalidator &)
Handle invalidation from the pass manager.
bool isValidProtoForLibFunc(const FunctionType &FTy, LibFunc F, const Module &M) const
Return true if the function type FTy is valid for the library function F, regardless of whether the f...
TargetLibraryInfo()=delete
ConstantInt * getAsSizeT(uint64_t V, const Module &M) const
Returns a constant materialized as a size_t type.
bool hasOptimizedCodeGen(LibFunc F) const
Tests if the function is both available and a candidate for optimized code generation.
Attribute::AttrKind getExtAttrForI32Return(bool Signed=true) const
bool invalidate(Function &, const PreservedAnalyses &, FunctionAnalysisManager::Invalidator &)
bool isKnownVectorFunctionInLibrary(StringRef F) const
Check if the function "F" is listed in a library known to LLVM.
static StringRef getStandardName(LibFunc F)
Return the canonical name for a LibFunc.
bool isFunctionVectorizable(StringRef F) const
bool has(LibFunc F) const
Tests whether a library function is available.
void disableAllFunctions()
Disables all builtins.
bool isErrnoFunctionCall() const
Returns whether errno is defined as a function call on known environments.
unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
TargetLibraryInfoImpl::AvailabilityState getState(LibFunc F) const
LibFunc getLibFunc(unsigned int Opcode, Type *Ty) const
Searches for a function name using an Instruction Opcode.
TargetLibraryInfo & operator=(const TargetLibraryInfo &TLI)=default
TargetLibraryInfo(const TargetLibraryInfo &TLI)=default
static Attribute::AttrKind getExtAttrForBoolParam(const Triple &T)
void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &ScalableVF) const
Returns the largest vectorization factor used in the list of vector functions.
LibFunc getLibFunc(const Function &FDecl) const
TargetLibraryInfo(const TargetLibraryInfoImpl &Impl, std::optional< const Function * > F=std::nullopt)
static Attribute::AttrKind getExtAttrForI32Return(const Triple &T, bool Signed=true)
IntegerType * getSizeTType(const Module &M) const
Returns an IntegerType corresponding to size_t.
static LLVM_ABI void initBoolExtensionsForTriple(bool &ShouldZExtBoolParam, bool &ShouldZExtBoolReturn, const Triple &T)
StringRef getVectorizedFunction(StringRef F, const ElementCount &VF, bool Masked=false) const
StringRef getName(LibFunc F) const
const VecDesc * getVectorMappingInfo(StringRef F, const ElementCount &VF, bool Masked) const
TargetLibraryInfo & operator=(TargetLibraryInfo &&TLI)=default
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
friend class TargetLibraryInfoWrapperPass
TargetLibraryInfo(TargetLibraryInfo &&TLI)=default
static LLVM_ABI void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
friend class TargetLibraryAnalysis
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
Attribute::AttrKind getExtAttrForI32Param(bool Signed=true) const
LibFunc getLibFunc(const CallBase &CB) const
If a callbase does not have the 'nobuiltin' attribute, return the library function the callee is,...
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
Provides info so a possible vectorization of a function can be computed.
StringRef getVABIPrefix() const
std::optional< CallingConv::ID > getCallingConv() const
LLVM_ABI std::string getVectorFunctionABIVariantString() const
Returns a vector function ABI variant string on the form: ZGV<isa><mask><vlen><vparams><scalarname>(<...
StringRef getScalarFnName() const
constexpr VecDesc(StringRef ScalarFnName, StringRef VectorFnName, ElementCount VectorizationFactor, bool Masked, StringRef VABIPrefix, std::optional< CallingConv::ID > Conv)
StringRef getVectorFnName() const
ElementCount getVectorizationFactor() const
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
VectorLibrary
List of known vector-functions libraries.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...