LLVM 24.0.0git
ReplaceWithVeclib.cpp File Reference

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "replace-with-veclib"

Functions

 STATISTIC (NumCallsReplaced, "Number of calls to intrinsics that have been replaced.")
 STATISTIC (NumTLIFuncDeclAdded, "Number of vector library function declarations added.")
 STATISTIC (NumFuncUsedAdded, "Number of functions added to `llvm.compiler.used`")
FunctiongetTLIFunction (Module *M, FunctionType *VectorFTy, const StringRef TLIName, std::optional< CallingConv::ID > CC, Function *ScalarFunc=nullptr)
 Returns a vector Function that it adds to the Module M.
static void replaceWithTLIFunction (IntrinsicInst *II, VFInfo &Info, Function *TLIVecFunc)
 Replace the intrinsic call II to TLIVecFunc, which is the corresponding function from the vector library.
static bool replaceWithCallToVeclib (const TargetLibraryInfo &TLI, IntrinsicInst *II)
 Returns true when successfully replaced II, which is a call to a vectorized intrinsic, with a suitable function taking vector arguments, based on available mappings in the TLI.
static bool hasVectorMapping (const TargetLibraryInfo &TLI, StringRef Name, ElementCount EC)
 Returns true when TLI has a vector mapping for the scalar function name Name at EC (matching either masked or unmasked variants).
static bool hasIntrinsicVectorMapping (const TargetLibraryInfo &TLI, Intrinsic::ID IID, Type *ScalarTy, ElementCount EC, Module *M)
 Returns true when TLI has a vector mapping for IID at the given element type and EC.
static bool trySplitVectorSinCos (const TargetLibraryInfo &TLI, IntrinsicInst *II, SmallVectorImpl< Instruction * > &Replaced)
 If II is a vector llvm.sincos with no direct vector library mapping but the target does have vector mappings for both llvm.sin and llvm.cos at the same element count, replace it with separate llvm.sin and llvm.cos calls and run the standard veclib replacement on each.
static bool runImpl (const TargetLibraryInfo &TLI, Function &F)
 INITIALIZE_PASS_BEGIN (ReplaceWithVeclibLegacy, DEBUG_TYPE, "Replace intrinsics with calls to vector library", false, false) INITIALIZE_PASS_END(ReplaceWithVeclibLegacy

Variables

 DEBUG_TYPE
Replace intrinsics with calls to vector library
Replace intrinsics with calls to vector false

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "replace-with-veclib"

Definition at line 35 of file ReplaceWithVeclib.cpp.

Function Documentation

◆ getTLIFunction()

Function * getTLIFunction ( Module * M,
FunctionType * VectorFTy,
const StringRef TLIName,
std::optional< CallingConv::ID > CC,
Function * ScalarFunc = nullptr )

◆ hasIntrinsicVectorMapping()

bool hasIntrinsicVectorMapping ( const TargetLibraryInfo & TLI,
Intrinsic::ID IID,
Type * ScalarTy,
ElementCount EC,
Module * M )
static

Returns true when TLI has a vector mapping for IID at the given element type and EC.

Definition at line 223 of file ReplaceWithVeclib.cpp.

References llvm::Intrinsic::getName(), and hasVectorMapping().

Referenced by trySplitVectorSinCos().

◆ hasVectorMapping()

bool hasVectorMapping ( const TargetLibraryInfo & TLI,
StringRef Name,
ElementCount EC )
static

Returns true when TLI has a vector mapping for the scalar function name Name at EC (matching either masked or unmasked variants).

Definition at line 215 of file ReplaceWithVeclib.cpp.

References llvm::TargetLibraryInfo::getVectorMappingInfo().

Referenced by hasIntrinsicVectorMapping(), and trySplitVectorSinCos().

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( ReplaceWithVeclibLegacy ,
DEBUG_TYPE ,
"Replace intrinsics with calls to vector library" ,
false ,
false  )

◆ replaceWithCallToVeclib()

◆ replaceWithTLIFunction()

void replaceWithTLIFunction ( IntrinsicInst * II,
VFInfo & Info,
Function * TLIVecFunc )
static

Replace the intrinsic call II to TLIVecFunc, which is the corresponding function from the vector library.

Definition at line 79 of file ReplaceWithVeclib.cpp.

References llvm::Instruction::copyMetadata(), llvm::IRBuilderBase::CreateCall(), llvm::VectorType::get(), llvm::Constant::getAllOnesValue(), llvm::Function::getCallingConv(), llvm::Type::getInt1Ty(), II, llvm::IRBuilder(), and llvm::isa().

Referenced by replaceWithCallToVeclib().

◆ runImpl()

◆ STATISTIC() [1/3]

STATISTIC ( NumCallsReplaced ,
"Number of calls to intrinsics that have been replaced."  )

◆ STATISTIC() [2/3]

STATISTIC ( NumFuncUsedAdded ,
"Number of functions added to `llvm.compiler.used`"  )

◆ STATISTIC() [3/3]

STATISTIC ( NumTLIFuncDeclAdded ,
"Number of vector library function declarations added."  )

◆ trySplitVectorSinCos()

bool trySplitVectorSinCos ( const TargetLibraryInfo & TLI,
IntrinsicInst * II,
SmallVectorImpl< Instruction * > & Replaced )
static

If II is a vector llvm.sincos with no direct vector library mapping but the target does have vector mappings for both llvm.sin and llvm.cos at the same element count, replace it with separate llvm.sin and llvm.cos calls and run the standard veclib replacement on each.

Definition at line 234 of file ReplaceWithVeclib.cpp.

References B(), llvm::cast(), llvm::Instruction::copyMetadata(), llvm::dyn_cast(), llvm::TargetLibraryInfo::getName(), llvm::Intrinsic::getOrInsertDeclaration(), llvm::Value::getType(), hasIntrinsicVectorMapping(), hasVectorMapping(), II, llvm::isa(), llvm::Type::isDoubleTy(), llvm::Type::isFloatTy(), llvm::make_early_inc_range(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and replaceWithCallToVeclib().

Referenced by runImpl().

Variable Documentation

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 380 of file ReplaceWithVeclib.cpp.

◆ false

Replace intrinsics with calls to vector false

Definition at line 381 of file ReplaceWithVeclib.cpp.

◆ library

Replace intrinsics with calls to vector library

Definition at line 381 of file ReplaceWithVeclib.cpp.