9#ifndef LLVM_ANALYSIS_TARGETLIBRARYINFO_H
10#define LLVM_ANALYSIS_TARGETLIBRARYINFO_H
49 std::optional<CallingConv::ID> CC;
55 std::optional<CallingConv::ID> Conv)
56 : ScalarFnName(ScalarFnName), VectorFnName(VectorFnName),
58 VABIPrefix(VABIPrefix), CC(Conv) {}
73#define TLI_DEFINE_ENUM
74#include "llvm/Analysis/TargetLibraryInfo.def"
92 bool ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param, ShouldSignExtI32Return;
95 enum AvailabilityState {
101 AvailableArray[
F/4] &= ~(3 << 2*(
F&3));
102 AvailableArray[
F/4] |= State << 2*(
F&3);
109 std::vector<VecDesc> VectorDescs;
112 std::vector<VecDesc> ScalarDescs;
174 setState(
F, StandardName);
180 if (StandardNames[
F] !=
Name) {
181 setState(
F, CustomName);
182 CustomNames[
F] = std::string(
Name);
183 assert(CustomNames.contains(
F));
185 setState(
F, StandardName);
230 ShouldExtI32Param = Val;
237 ShouldExtI32Return = Val;
243 ShouldSignExtI32Param = Val;
249 ShouldSignExtI32Return = Val;
294 std::bitset<NumLibFuncs> OverrideAsUnavailable;
300 std::optional<const Function *>
F = std::nullopt)
304 if ((*F)->hasFnAttribute(
"no-builtins"))
309 AttributeSet FnAttrs = (*F)->getAttributes().getFnAttrs();
311 if (!Attr.isStringAttribute())
313 auto AttrStr = Attr.getKindAsString();
314 if (!AttrStr.consume_front(
"no-builtin-"))
333 bool AllowCallerSuperset)
const {
334 if (!AllowCallerSuperset)
335 return OverrideAsUnavailable == CalleeTLI.OverrideAsUnavailable;
338 return (CalleeTLI.OverrideAsUnavailable & ~OverrideAsUnavailable).none();
345 return Impl->isValidProtoForLibFunc(FTy,
F, M);
377 OverrideAsUnavailable.set();
382 assert(
F < OverrideAsUnavailable.size() &&
"out-of-bounds LibFunc");
383 OverrideAsUnavailable.set(
F);
387 assert(
F < OverrideAsUnavailable.size() &&
"out-of-bounds LibFunc");
388 if (OverrideAsUnavailable[
F])
389 return TargetLibraryInfoImpl::Unavailable;
390 return Impl->getState(
F);
395 return getState(
F) != TargetLibraryInfoImpl::Unavailable;
404 bool Masked =
false)
const {
415 if (
getState(
F) == TargetLibraryInfoImpl::Unavailable)
420 case LibFunc_acos:
case LibFunc_acosf:
case LibFunc_acosl:
421 case LibFunc_asin:
case LibFunc_asinf:
case LibFunc_asinl:
422 case LibFunc_atan2:
case LibFunc_atan2f:
case LibFunc_atan2l:
423 case LibFunc_atan:
case LibFunc_atanf:
case LibFunc_atanl:
424 case LibFunc_ceil:
case LibFunc_ceilf:
case LibFunc_ceill:
425 case LibFunc_copysign:
case LibFunc_copysignf:
case LibFunc_copysignl:
426 case LibFunc_cos:
case LibFunc_cosf:
case LibFunc_cosl:
427 case LibFunc_cosh:
case LibFunc_coshf:
case LibFunc_coshl:
428 case LibFunc_exp2:
case LibFunc_exp2f:
case LibFunc_exp2l:
429 case LibFunc_exp10:
case LibFunc_exp10f:
case LibFunc_exp10l:
430 case LibFunc_fabs:
case LibFunc_fabsf:
case LibFunc_fabsl:
431 case LibFunc_floor:
case LibFunc_floorf:
case LibFunc_floorl:
432 case LibFunc_fmax:
case LibFunc_fmaxf:
case LibFunc_fmaxl:
433 case LibFunc_fmin:
case LibFunc_fminf:
case LibFunc_fminl:
434 case LibFunc_ldexp:
case LibFunc_ldexpf:
case LibFunc_ldexpl:
435 case LibFunc_log2:
case LibFunc_log2f:
case LibFunc_log2l:
436 case LibFunc_memcmp:
case LibFunc_bcmp:
case LibFunc_strcmp:
437 case LibFunc_memcpy:
case LibFunc_memset:
case LibFunc_memmove:
438 case LibFunc_nearbyint:
case LibFunc_nearbyintf:
case LibFunc_nearbyintl:
439 case LibFunc_rint:
case LibFunc_rintf:
case LibFunc_rintl:
440 case LibFunc_round:
case LibFunc_roundf:
case LibFunc_roundl:
441 case LibFunc_sin:
case LibFunc_sinf:
case LibFunc_sinl:
442 case LibFunc_sinh:
case LibFunc_sinhf:
case LibFunc_sinhl:
443 case LibFunc_sqrt:
case LibFunc_sqrtf:
case LibFunc_sqrtl:
444 case LibFunc_sqrt_finite:
case LibFunc_sqrtf_finite:
445 case LibFunc_sqrtl_finite:
446 case LibFunc_strcpy:
case LibFunc_stpcpy:
case LibFunc_strlen:
447 case LibFunc_strnlen:
case LibFunc_memchr:
case LibFunc_mempcpy:
448 case LibFunc_tan:
case LibFunc_tanf:
case LibFunc_tanl:
449 case LibFunc_tanh:
case LibFunc_tanhf:
case LibFunc_tanhl:
450 case LibFunc_trunc:
case LibFunc_truncf:
case LibFunc_truncl:
459 if (State == TargetLibraryInfoImpl::Unavailable)
461 if (State == TargetLibraryInfoImpl::StandardName)
462 return Impl->StandardNames[
F];
463 assert(State == TargetLibraryInfoImpl::CustomName);
464 return Impl->CustomNames.
find(
F)->second;
468 bool &ShouldExtI32Return,
469 bool &ShouldSignExtI32Param,
470 bool &ShouldSignExtI32Return,
472 ShouldExtI32Param = ShouldExtI32Return =
false;
473 ShouldSignExtI32Param = ShouldSignExtI32Return =
false;
479 ShouldExtI32Param =
true;
480 ShouldExtI32Return =
true;
484 if (
T.isLoongArch() ||
T.isMIPS() ||
T.isRISCV64()) {
485 ShouldSignExtI32Param =
true;
489 if (
T.isLoongArch() ||
T.isRISCV64()) {
490 ShouldSignExtI32Return =
true;
499 bool ShouldSignExtI32Param_,
501 if (ShouldExtI32Param_)
502 return Signed ? Attribute::SExt : Attribute::ZExt;
503 if (ShouldSignExtI32Param_)
504 return Attribute::SExt;
511 bool ShouldExtI32Param, ShouldExtI32Return;
512 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
514 ShouldSignExtI32Param, ShouldSignExtI32Return,
T);
515 return getExtAttrForI32Param(ShouldExtI32Param, ShouldSignExtI32Param,
520 return getExtAttrForI32Param(Impl->ShouldExtI32Param,
521 Impl->ShouldSignExtI32Param,
Signed);
529 bool ShouldSignExtI32Return_,
531 if (ShouldExtI32Return_)
532 return Signed ? Attribute::SExt : Attribute::ZExt;
533 if (ShouldSignExtI32Return_)
534 return Attribute::SExt;
541 bool ShouldExtI32Param, ShouldExtI32Return;
542 bool ShouldSignExtI32Param, ShouldSignExtI32Return;
544 ShouldSignExtI32Param, ShouldSignExtI32Return,
T);
545 return getExtAttrForI32Return(ShouldExtI32Return, ShouldSignExtI32Return,
550 return getExtAttrForI32Return(Impl->ShouldExtI32Return,
551 Impl->ShouldSignExtI32Return,
Signed);
558 bool Signed,
bool Ret =
false,
560 if (
auto AK = getExtAttrForI32Param(
Signed))
561 for (
auto ArgNo : ArgNos)
562 AL = AL.addParamAttribute(*
C, ArgNo, AK);
564 if (
auto AK = getExtAttrForI32Return(
Signed))
565 AL = AL.addRetAttribute(*
C, AK);
635 : BaselineInfoImpl(
std::
move(BaselineInfoImpl)) {}
643 std::optional<TargetLibraryInfoImpl> BaselineInfoImpl;
648 std::optional<TargetLibraryInfo> TLI;
650 virtual void anchor();
668 TLI = TLA.run(
F, DummyFAM);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ATTRIBUTE_UNUSED
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.
Machine Check Debug Module
API to communicate dependencies between analyses during invalidation.
A container for analyses that lazily runs them and caches their results.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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.
iterator find(const_arg_type_t< KeyT > Val)
Class to represent function types.
ImmutablePass class - This class is used to provide information that does not need to be run.
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.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - 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 ...
LLVM_ABI unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
LLVM_ABI bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
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.
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.
VectorLibrary
List of known vector-functions libraries.
void setUnavailable(LibFunc F)
Forces a function to be marked as unavailable.
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.
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)
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 getLibFunc(const CallBase &CB, LibFunc &F) const
If a callbase does not have the 'nobuiltin' attribute, return if the called function is a known libra...
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
unsigned getWCharSize(const Module &M) const
Returns the size of the wchar_t type in bytes or 0 if the size is unknown.
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.
bool isFunctionVectorizable(StringRef F) const
bool has(LibFunc F) const
Tests whether a library function is available.
unsigned getSizeTSize(const Module &M) const
Returns the size of the size_t type in bits.
TargetLibraryInfoImpl::AvailabilityState getState(LibFunc F) const
TargetLibraryInfo & operator=(const TargetLibraryInfo &TLI)=default
void disableAllFunctions() LLVM_ATTRIBUTE_UNUSED
Disables all builtins.
TargetLibraryInfo(const TargetLibraryInfo &TLI)=default
void getWidestVF(StringRef ScalarF, ElementCount &FixedVF, ElementCount &ScalableVF) const
Returns the largest vectorization factor used in the list of vector functions.
void setUnavailable(LibFunc F) LLVM_ATTRIBUTE_UNUSED
Forces a function to be marked as unavailable.
TargetLibraryInfo(const TargetLibraryInfoImpl &Impl, std::optional< const Function * > F=std::nullopt)
static Attribute::AttrKind getExtAttrForI32Return(const Triple &T, bool Signed=true)
bool getLibFunc(const Function &FDecl, LibFunc &F) const
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
IntegerType * getSizeTType(const Module &M) const
Returns an IntegerType corresponding to size_t.
static void initExtensionsForTriple(bool &ShouldExtI32Param, bool &ShouldExtI32Return, bool &ShouldSignExtI32Param, bool &ShouldSignExtI32Return, const Triple &T)
bool getLibFunc(unsigned int Opcode, Type *Ty, LibFunc &F) const
Searches for a function name using an Instruction Opcode.
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.
TargetLibraryInfo(TargetLibraryInfo &&TLI)=default
Attribute::AttrKind getExtAttrForI32Param(bool Signed=true) const
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
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
StringRef getVectorFnName() const
ElementCount getVectorizationFactor() const
VecDesc(StringRef ScalarFnName, StringRef VectorFnName, ElementCount VectorizationFactor, bool Masked, StringRef VABIPrefix, std::optional< CallingConv::ID > Conv)
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
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...
TODO: The following VectorizationFactor was pulled out of LoopVectorizationCostModel class.