LLVM 23.0.0git
Intrinsics.cpp File Reference
#include "llvm/IR/Intrinsics.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringTable.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IntrinsicsAArch64.h"
#include "llvm/IR/IntrinsicsAMDGPU.h"
#include "llvm/IR/IntrinsicsARM.h"
#include "llvm/IR/IntrinsicsBPF.h"
#include "llvm/IR/IntrinsicsHexagon.h"
#include "llvm/IR/IntrinsicsLoongArch.h"
#include "llvm/IR/IntrinsicsMips.h"
#include "llvm/IR/IntrinsicsNVPTX.h"
#include "llvm/IR/IntrinsicsPowerPC.h"
#include "llvm/IR/IntrinsicsR600.h"
#include "llvm/IR/IntrinsicsRISCV.h"
#include "llvm/IR/IntrinsicsS390.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
#include "llvm/IR/IntrinsicsVE.h"
#include "llvm/IR/IntrinsicsX86.h"
#include "llvm/IR/IntrinsicsXCore.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/NVVMIntrinsicUtils.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/IntrinsicImpl.inc"
#include "llvm/IR/ConstrainedOps.def"

Go to the source code of this file.

Classes

struct  InterleaveIntrinsic

Macros

#define GET_INTRINSIC_NAME_TABLE
 Table of string intrinsic names indexed by enum value.
#define GET_INTRINSIC_IITINFO
#define GET_INTRINSIC_GENERATOR_GLOBAL
#define GET_INTRINSIC_OVERLOAD_TABLE
#define GET_INTRINSIC_SCALARIZABLE_TABLE
#define GET_INTRINSIC_PRETTY_PRINT_TABLE
#define GET_INTRINSIC_TARGET_DATA
 Table of per-target intrinsic name tables.
#define GET_INTRINSIC_ATTRIBUTES
 This defines the "Intrinsic::getAttributes(ID id)" method.
#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN
#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC)
#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC)
#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS

Typedefs

using DeferredIntrinsicMatchPair

Enumerations

enum  IIT_Info
 IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntries function. More...

Functions

static bool isSignatureValid (FunctionType *FTy, ArrayRef< Intrinsic::IITDescriptor > &Infos, unsigned NumArgs, bool IsVarArg, SmallVectorImpl< Type * > &OverloadTys, raw_ostream &OS)
 Return true if the function type FTy is a valid type signature for the type constraints specified in the .td file, represented by Infos and IsVarArg.
static std::string getMangledTypeStr (Type *Ty, bool &HasUnnamedType)
 Returns a stable mangling for the type specified for use in the name mangling scheme used by 'any' types in intrinsic signatures.
static std::string getIntrinsicNameImpl (Intrinsic::ID Id, ArrayRef< Type * > OverloadTys, Module *M, FunctionType *FT, bool EarlyModuleCheck)
static void DecodeIITType (unsigned &NextElt, ArrayRef< unsigned char > Infos, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)
static TypeDecodeFixedType (ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > OverloadTys, LLVMContext &Context)
static int lookupLLVMIntrinsicByName (ArrayRef< unsigned > NameOffsetTable, StringRef Name, StringRef Target="")
 Looks up Name in NameTable via binary search.
static std::pair< ArrayRef< unsigned >, StringReffindTargetSubtable (StringRef Name)
 Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name, or the generic table if Name is not target specific.
static FunctiongetOrInsertIntrinsicDeclarationImpl (Module *M, Intrinsic::ID id, ArrayRef< Type * > OverloadTys, FunctionType *FT)
static bool matchIntrinsicType (Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &OverloadTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)

Variables

static InterleaveIntrinsic InterleaveIntrinsics []

Macro Definition Documentation

◆ GET_INTRINSIC_ATTRIBUTES

#define GET_INTRINSIC_ATTRIBUTES

This defines the "Intrinsic::getAttributes(ID id)" method.

Definition at line 755 of file Intrinsics.cpp.

◆ GET_INTRINSIC_GENERATOR_GLOBAL

#define GET_INTRINSIC_GENERATOR_GLOBAL

Definition at line 452 of file Intrinsics.cpp.

◆ GET_INTRINSIC_IITINFO

#define GET_INTRINSIC_IITINFO

Definition at line 208 of file Intrinsics.cpp.

◆ GET_INTRINSIC_NAME_TABLE

#define GET_INTRINSIC_NAME_TABLE

Table of string intrinsic names indexed by enum value.

Definition at line 48 of file Intrinsics.cpp.

◆ GET_INTRINSIC_OVERLOAD_TABLE

#define GET_INTRINSIC_OVERLOAD_TABLE

◆ GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS

#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS

Definition at line 1214 of file Intrinsics.cpp.

◆ GET_INTRINSIC_PRETTY_PRINT_TABLE

#define GET_INTRINSIC_PRETTY_PRINT_TABLE

◆ GET_INTRINSIC_SCALARIZABLE_TABLE

#define GET_INTRINSIC_SCALARIZABLE_TABLE

◆ GET_INTRINSIC_TARGET_DATA

#define GET_INTRINSIC_TARGET_DATA

Table of per-target intrinsic name tables.

Definition at line 642 of file Intrinsics.cpp.

◆ GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN

#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN

Definition at line 816 of file Intrinsics.cpp.

◆ GET_LLVM_INTRINSIC_FOR_MS_BUILTIN

#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN

Definition at line 820 of file Intrinsics.cpp.

◆ INSTRUCTION [1/2]

#define INSTRUCTION ( NAME,
NARG,
ROUND_MODE,
INTRINSIC )
Value:
case Intrinsic::INTRINSIC:

◆ INSTRUCTION [2/2]

#define INSTRUCTION ( NAME,
NARG,
ROUND_MODE,
INTRINSIC )
Value:
case Intrinsic::INTRINSIC: \
return ROUND_MODE == 1;

Typedef Documentation

◆ DeferredIntrinsicMatchPair

Initial value:
std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>

Definition at line 847 of file Intrinsics.cpp.

Enumeration Type Documentation

◆ IIT_Info

enum IIT_Info

IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntries function.

Defined in Intrinsics.td.

Definition at line 207 of file Intrinsics.cpp.

Function Documentation

◆ DecodeFixedType()

◆ DecodeIITType()

◆ findTargetSubtable()

std::pair< ArrayRef< unsigned >, StringRef > findTargetSubtable ( StringRef Name)
static

Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name, or the generic table if Name is not target specific.

Returns the relevant slice of IntrinsicNameOffsetTable and the target name.

Definition at line 716 of file Intrinsics.cpp.

References llvm::ArrayRef(), assert(), llvm::ArrayRef< T >::end(), and llvm::partition_point().

Referenced by llvm::Intrinsic::lookupIntrinsicID().

◆ getIntrinsicNameImpl()

◆ getMangledTypeStr()

std::string getMangledTypeStr ( Type * Ty,
bool & HasUnnamedType )
static

Returns a stable mangling for the type specified for use in the name mangling scheme used by 'any' types in intrinsic signatures.

The mangling of named types is simply their name. Manglings for unnamed types consist of a prefix ('p' for pointers, 'a' for arrays, 'f_' for functions) combined with the mangling of their component types. A vararg function type will have a suffix of 'vararg'. Since function types can contain other function types, we close a function type mangling with suffix 'f' which can't be confused with it's prefix. This ensures we don't have collisions between two unrelated function types. Otherwise, you might parse ffXX as f(fXX) or f(fX)X. (X is a placeholder for any other type.) The HasUnnamedType boolean is set if an unnamed type was encountered, indicating that extra care must be taken to ensure a unique name.

Definition at line 75 of file Intrinsics.cpp.

References llvm::Type::BFloatTyID, llvm::Type::ByteTyID, llvm::cast(), llvm::Type::DoubleTyID, llvm::dyn_cast(), llvm::Type::FloatTyID, llvm::Type::FP128TyID, getBitWidth(), getMangledTypeStr(), llvm::Type::HalfTyID, llvm::Type::IntegerTyID, llvm_unreachable, llvm::Type::MetadataTyID, llvm::Type::PPC_FP128TyID, llvm::utostr(), llvm::Type::VoidTyID, llvm::Type::X86_AMXTyID, and llvm::Type::X86_FP80TyID.

Referenced by getIntrinsicNameImpl(), and getMangledTypeStr().

◆ getOrInsertIntrinsicDeclarationImpl()

Function * getOrInsertIntrinsicDeclarationImpl ( Module * M,
Intrinsic::ID id,
ArrayRef< Type * > OverloadTys,
FunctionType * FT )
static

◆ isSignatureValid()

bool isSignatureValid ( FunctionType * FTy,
ArrayRef< Intrinsic::IITDescriptor > & Infos,
unsigned NumArgs,
bool IsVarArg,
SmallVectorImpl< Type * > & OverloadTys,
raw_ostream & OS )
static

Return true if the function type FTy is a valid type signature for the type constraints specified in the .td file, represented by Infos and IsVarArg.

The overloaded types for the intrinsic are pushed to the OverloadTys vector.

If the type is not valid, returns false and prints an error message to OS.

Definition at line 1077 of file Intrinsics.cpp.

References Check, E(), llvm::ArrayRef< T >::empty(), I, matchIntrinsicType(), and llvm::SmallVectorTemplateCommon< T, typename >::size().

Referenced by llvm::Intrinsic::getOrInsertDeclaration(), llvm::Intrinsic::isSignatureValid(), and llvm::Intrinsic::remangleIntrinsicFunction().

◆ lookupLLVMIntrinsicByName()

int lookupLLVMIntrinsicByName ( ArrayRef< unsigned > NameOffsetTable,
StringRef Name,
StringRef Target = "" )
static

Looks up Name in NameTable via binary search.

NameTable must be sorted and all entries must start with "llvm.". If NameTable contains an exact match for Name or a prefix of Name followed by a dot, its index in NameTable is returned. Otherwise, -1 is returned.

Definition at line 653 of file Intrinsics.cpp.

References assert(), llvm::ArrayRef< T >::begin(), llvm::ArrayRef< T >::end(), High, LHS, llvm::Low, llvm::StringRef::npos, RHS, and llvm::StringRef::size().

Referenced by llvm::Intrinsic::lookupIntrinsicID().

◆ matchIntrinsicType()

Variable Documentation

◆ InterleaveIntrinsics

InterleaveIntrinsic InterleaveIntrinsics[]
static
Initial value:
= {
{Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},
{Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},
{Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},
{Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},
{Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},
{Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},
{Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},
}

Definition at line 1194 of file Intrinsics.cpp.

Referenced by llvm::Intrinsic::getDeinterleaveIntrinsicID(), and llvm::Intrinsic::getInterleaveIntrinsicID().