56 return isIntegerTy() && cast<IntegerType>(
this)->getBitWidth() == Bitwidth;
60 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
61 return ATy->getElementType()->isScalableTy();
62 if (
const auto *STy = dyn_cast<StructType>(
this)) {
64 return STy->containsScalableVectorType(&Visited);
87 if (
auto *TT = dyn_cast<TargetExtType>(
this))
88 return isa<ScalableVectorType>(
TT->getLayoutType());
124 if (isa<VectorType>(
this) && isa<VectorType>(Ty))
128 if (((isa<FixedVectorType>(
this)) && Ty->
isX86_AMXTy()) &&
141 if (
auto *ATy = dyn_cast<ArrayType>(
this)) {
142 unsigned NumElements = ATy->getNumElements();
143 return NumElements == 0 || ATy->getElementType()->isEmptyTy();
146 if (
auto *STy = dyn_cast<StructType>(
this)) {
147 unsigned NumElements = STy->getNumElements();
148 for (
unsigned i = 0; i < NumElements; ++i)
149 if (!STy->getElementType(i)->isEmptyTy())
179 const VectorType *VTy = cast<VectorType>(
this);
181 TypeSize ETS = VTy->getElementType()->getPrimitiveSizeInBits();
182 assert(!ETS.
isScalable() &&
"Vector type should have fixed-width elements");
196 if (
auto *VTy = dyn_cast<VectorType>(
this))
197 return VTy->getElementType()->getFPMantissaWidth();
210 if (
auto *ATy = dyn_cast<ArrayType>(
this))
211 return ATy->getElementType()->isSized(Visited);
213 if (
auto *VTy = dyn_cast<VectorType>(
this))
214 return VTy->getElementType()->isSized(Visited);
216 if (
auto *TTy = dyn_cast<TargetExtType>(
this))
217 return TTy->getLayoutType()->isSized(Visited);
219 return cast<StructType>(
this)->isSized(Visited);
298 :
Type(Result->getContext(), FunctionTyID) {
299 Type **SubTys =
reinterpret_cast<Type**
>(
this+1);
300 assert(isValidReturnType(Result) &&
"invalid return type for function");
305 for (
unsigned i = 0, e = Params.
size(); i != e; ++i) {
306 assert(isValidArgumentType(Params[i]) &&
307 "Not a valid type for function argument!");
308 SubTys[i+1] = Params[i];
327 if (Insertion.second) {
334 *Insertion.first = FT;
337 FT = *Insertion.first;
347 return !
RetTy->isFunctionTy() && !
RetTy->isLabelTy() &&
348 !
RetTy->isMetadataTy();
373 if (Insertion.second) {
377 ST->setSubclassData(SCDB_IsLiteral);
379 *Insertion.first = ST;
382 ST = *Insertion.first;
400 if (isa<ScalableVectorType>(Ty)) {
405 if (
auto *STy = dyn_cast<StructType>(Ty)) {
406 if (STy->containsScalableVectorType(Visited)) {
425 if (!FirstTy || !isa<ScalableVectorType>(FirstTy))
442 if (Elements.empty()) {
477 if (!IterBool.second) {
488 std::make_pair(TmpStream.
str(),
this));
489 }
while (!IterBool.second);
529 assert(!Elements.empty() &&
530 "This method may not be invoked with an empty list");
535 assert(!Elements.empty() &&
536 "This method may not be invoked with an empty list");
592 if (
this ==
Other)
return true;
601 unsigned Idx = (
unsigned)cast<Constant>(V)->getUniqueInteger().getZExtValue();
609 if (!V->getType()->isIntOrIntVectorTy(32))
611 if (isa<ScalableVectorType>(V->getType()))
613 const Constant *
C = dyn_cast<Constant>(V);
614 if (
C && V->getType()->isVectorTy())
615 C =
C->getSplatValue();
621 return C.pImpl->NamedStructTypes.lookup(
Name);
629 :
Type(ElType->getContext(), ArrayTyID), ContainedType(ElType),
640 pImpl->
ArrayTypes[std::make_pair(ElementType, NumElements)];
658 :
Type(ElType->getContext(), TID), ContainedType(ElType),
659 ElementQuantity(
EQ) {
681 assert(NumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
683 "be an integer, floating point, or "
689 VectorType *&Entry = ElementType->getContext()
690 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
694 return cast<FixedVectorType>(Entry);
702 unsigned MinNumElts) {
703 assert(MinNumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
705 "be an integer, floating point, or "
711 VectorType *&Entry = ElementType->getContext()
712 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
716 return cast<ScalableVectorType>(Entry);
724 assert(EltTy &&
"Can't get a pointer to <null> type!");
743PointerType::PointerType(
LLVMContext &
C,
unsigned AddrSpace)
744 :
Type(
C, PointerTyID) {
772 Type **Params =
reinterpret_cast<Type **
>(
this + 1);
774 for (
Type *
T : Types)
778 unsigned *IntParamSpace =
reinterpret_cast<unsigned *
>(Params);
779 IntParams = IntParamSpace;
780 for (
unsigned IntParam : Ints)
781 *IntParamSpace++ = IntParam;
794 auto Insertion =
C.pImpl->TargetExtTypes.insert_as(
nullptr, Key);
795 if (Insertion.second) {
803 *Insertion.first = TT;
806 TT = *Insertion.first;
812struct TargetTypeInfo {
816 template <
typename... ArgTys>
817 TargetTypeInfo(
Type *LayoutType, ArgTys... Properties)
818 : LayoutType(LayoutType), Properties((0 | ... | Properties)) {}
825 if (
Name ==
"spirv.Image")
827 if (
Name.starts_with(
"spirv."))
832 if (
Name ==
"aarch64.svcount")
845 return (Properties & Prop) == Prop;
This file defines the StringMap class.
This file implements a class to represent arbitrary precision integral constant values and operations...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty)
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Class to represent array types.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM_ATTRIBUTE_RETURNS_NONNULL void * Allocate(size_t Size, Align Alignment)
Allocate space at the specified alignment.
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
static constexpr ElementCount getScalable(ScalarTy MinVal)
static constexpr ElementCount getFixed(ScalarTy MinVal)
Class to represent fixed width SIMD vectors.
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
Class to represent function types.
static bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
static bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
Class to represent integer types.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
APInt getMask() const
For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
StructTypeSet AnonStructTypes
DenseMap< std::pair< Type *, uint64_t >, ArrayType * > ArrayTypes
DenseMap< unsigned, PointerType * > PointerTypes
StringMap< StructType * > NamedStructTypes
PointerType * AS0PointerType
unsigned NamedStructTypesUniqueID
FunctionTypeSet FunctionTypes
This is an important class for using LLVM in a threaded context.
LLVMContextImpl *const pImpl
Class to represent pointers.
static bool isLoadableOrStorableType(Type *ElemTy)
Return true if we can load or store from a pointer to this type.
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Class to represent scalable SIMD vectors.
static ScalableVectorType * get(Type *ElementType, unsigned MinNumElts)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void push_back(const T &Elt)
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
void remove(MapEntryTy *KeyValue)
remove - Remove the specified key/value pair from the map, but do not erase it.
StringRef - Represent a constant reference to a string, i.e.
Class to represent struct types.
bool indexValid(const Value *V) const
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
ArrayRef< Type * > elements() const
void setBody(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type.
bool containsHomogeneousScalableVectorTypes() const
Returns true if this struct contains homogeneous scalable vector types.
static StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
static StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
unsigned getNumElements() const
Random access to the elements.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
isSized - Return true if this is a sized type.
bool containsScalableVectorType(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Returns true if this struct contains a scalable vector.
void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
bool isLayoutIdentical(StructType *Other) const
Return true if this is layout identical to the specified struct.
Type * getTypeAtIndex(const Value *V) const
Given an index value into the type, return the type of the element.
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition.
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
Type * getElementType(unsigned N) const
StringRef getName() const
Return the name for this struct type if it has an identity.
Symbol info for RuntimeDyld.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
static TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types=std::nullopt, ArrayRef< unsigned > Ints=std::nullopt)
Return a target extension type having the specified name and optional type and integer parameters.
bool hasProperty(Property Prop) const
Returns true if the target extension type contains the given property.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
@ CanBeGlobal
This type may be used as the value type of a global variable.
StringRef getName() const
Return the name for this target extension type.
Type * getLayoutType() const
Returns an underlying layout type for the target extension type.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
The instances of the Type class are immutable: once they are created, they are never changed.
static Type * getHalfTy(LLVMContext &C)
static Type * getDoubleTy(LLVMContext &C)
const fltSemantics & getFltSemantics() const
static Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
PointerType * getPointerTo(unsigned AddrSpace=0) const
Return a pointer to the current type.
static Type * getX86_FP80Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
static Type * getBFloatTy(LLVMContext &C)
bool isPointerTy() const
True if this is an instance of PointerType.
static IntegerType * getInt1Ty(LLVMContext &C)
bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
static Type * getX86_AMXTy(LLVMContext &C)
static Type * getMetadataTy(LLVMContext &C)
TypeID
Definitions of all of the base types for the Type system.
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
@ TypedPointerTyID
Typed pointer used by some GPU targets.
@ HalfTyID
16-bit floating point type
@ VoidTyID
type with no size
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ FixedVectorTyID
Fixed width SIMD vector type.
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
@ X86_FP80TyID
80-bit floating point type (X87)
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
@ FP128TyID
128-bit floating point type (112-bit significand)
unsigned NumContainedTys
Keeps track of how many Type*'s there are in the ContainedTys list.
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static Type * getVoidTy(LLVMContext &C)
static Type * getLabelTy(LLVMContext &C)
bool isScalableTargetExtTy() const
Return true if this is a target extension type with a scalable layout.
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
static Type * getFP128Ty(LLVMContext &C)
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
static IntegerType * getInt16Ty(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static Type * getPrimitiveType(LLVMContext &C, TypeID IDNumber)
Return a type based on an identifier.
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Type *const * ContainedTys
A pointer to the array of Types contained by this Type.
unsigned getSubclassData() const
static IntegerType * getInt8Ty(LLVMContext &C)
bool isIEEE() const
Return whether the type is IEEE compatible, as defined by the eponymous method in APFloat.
static IntegerType * getInt128Ty(LLVMContext &C)
void setSubclassData(unsigned val)
static Type * getTokenTy(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isX86_AMXTy() const
Return true if this is X86 AMX.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isScalableTy() const
Return true if this is a type whose size is a known multiple of vscale.
bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
static Type * getFloatTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeID getTypeID() const
Return the type id for the type.
static Type * getWasm_FuncrefTy(LLVMContext &C)
bool isTokenTy() const
Return true if this is 'token'.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static Type * getPPC_FP128Ty(LLVMContext &C)
static Type * getWasm_ExternrefTy(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isMetadataTy() const
Return true if this is 'metadata'.
LLVM Value Representation.
Base class of all SIMD vector types.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
VectorType(Type *ElType, unsigned EQ, Type::TypeID TID)
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
std::pair< iterator, bool > insert_as(const ValueT &V, const LookupKeyT &LookupKey)
Alternative version of insert that uses a different (and possibly less expensive) key type.
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
constexpr size_t NameSize
This is an optimization pass for GlobalISel generic memory operations.
static const fltSemantics & IEEEsingle() LLVM_READNONE
static const fltSemantics & PPCDoubleDouble() LLVM_READNONE
static const fltSemantics & x87DoubleExtended() LLVM_READNONE
static const fltSemantics & IEEEquad() LLVM_READNONE
static const fltSemantics & IEEEdouble() LLVM_READNONE
static const fltSemantics & IEEEhalf() LLVM_READNONE
static const fltSemantics & BFloat() LLVM_READNONE