62 return isIntegerTy() && cast<IntegerType>(
this)->getBitWidth() == Bitwidth;
66 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
67 return ATy->getElementType()->isScalableTy(Visited);
68 if (
const auto *STy = dyn_cast<StructType>(
this))
69 return STy->isScalableTy(Visited);
74 SmallPtrSet<const Type *, 4> Visited;
80 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
81 return ATy->getElementType()->containsNonGlobalTargetExtType(Visited);
82 if (
const auto *STy = dyn_cast<StructType>(
this))
83 return STy->containsNonGlobalTargetExtType(Visited);
84 if (
auto *TT = dyn_cast<TargetExtType>(
this))
85 return !
TT->hasProperty(TargetExtType::CanBeGlobal);
90 SmallPtrSet<const Type *, 4> Visited;
96 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
97 return ATy->getElementType()->containsNonLocalTargetExtType(Visited);
98 if (
const auto *STy = dyn_cast<StructType>(
this))
99 return STy->containsNonLocalTargetExtType(Visited);
100 if (
auto *TT = dyn_cast<TargetExtType>(
this))
101 return !
TT->hasProperty(TargetExtType::CanBeLocal);
106 SmallPtrSet<const Type *, 4> Visited;
112 case HalfTyID:
return APFloat::IEEEhalf();
114 case FloatTyID:
return APFloat::IEEEsingle();
115 case DoubleTyID:
return APFloat::IEEEdouble();
117 case FP128TyID:
return APFloat::IEEEquad();
124 if (
auto *TT = dyn_cast<TargetExtType>(
this))
125 return isa<ScalableVectorType>(
TT->getLayoutType());
131 if (&S == &APFloat::IEEEhalf())
132 Ty = Type::getHalfTy(
C);
133 else if (&S == &APFloat::BFloat())
134 Ty = Type::getBFloatTy(
C);
135 else if (&S == &APFloat::IEEEsingle())
136 Ty = Type::getFloatTy(
C);
137 else if (&S == &APFloat::IEEEdouble())
138 Ty = Type::getDoubleTy(
C);
139 else if (&S == &APFloat::x87DoubleExtended())
140 Ty = Type::getX86_FP80Ty(
C);
141 else if (&S == &APFloat::IEEEquad())
142 Ty = Type::getFP128Ty(
C);
144 assert(&S == &APFloat::PPCDoubleDouble() &&
"Unknown FP format");
145 Ty = Type::getPPC_FP128Ty(
C);
154 return cast<TargetExtType>(
this)->getName() ==
"riscv.vector.tuple";
168 if (isa<VectorType>(
this) && isa<VectorType>(Ty))
172 if (((isa<FixedVectorType>(
this)) && Ty->isX86_AMXTy()) &&
176 Ty->getPrimitiveSizeInBits().getFixedValue() == 8192)
185 if (
auto *ATy = dyn_cast<ArrayType>(
this)) {
186 unsigned NumElements = ATy->getNumElements();
187 return NumElements == 0 || ATy->getElementType()->isEmptyTy();
190 if (
auto *STy = dyn_cast<StructType>(
this)) {
191 unsigned NumElements = STy->getNumElements();
192 for (
unsigned i = 0; i < NumElements; ++i)
193 if (!STy->getElementType(i)->isEmptyTy())
204 return TypeSize::getFixed(16);
205 case Type::BFloatTyID:
206 return TypeSize::getFixed(16);
207 case Type::FloatTyID:
208 return TypeSize::getFixed(32);
209 case Type::DoubleTyID:
210 return TypeSize::getFixed(64);
211 case Type::X86_FP80TyID:
212 return TypeSize::getFixed(80);
213 case Type::FP128TyID:
214 return TypeSize::getFixed(128);
215 case Type::PPC_FP128TyID:
216 return TypeSize::getFixed(128);
217 case Type::X86_AMXTyID:
218 return TypeSize::getFixed(8192);
220 return TypeSize::getFixed(cast<ByteType>(
this)->
getBitWidth());
221 case Type::IntegerTyID:
222 return TypeSize::getFixed(cast<IntegerType>(
this)->
getBitWidth());
223 case Type::FixedVectorTyID:
224 case Type::ScalableVectorTyID: {
225 const VectorType *VTy = cast<VectorType>(
this);
226 ElementCount
EC = VTy->getElementCount();
227 TypeSize ETS = VTy->getElementType()->getPrimitiveSizeInBits();
228 assert(!ETS.
isScalable() &&
"Vector type should have fixed-width elements");
232 return TypeSize::getFixed(0);
238 return getScalarType()->getPrimitiveSizeInBits().getFixedValue();
242 if (
auto *VTy = dyn_cast<VectorType>(
this))
243 return VTy->getElementType()->getFPMantissaWidth();
263 auto *
ST = cast<StructType>(
this);
264 return !
ST->isOpaque();
270 if (
auto *ATy = dyn_cast<ArrayType>(
this))
271 return ATy->getElementType()->isSized(Visited);
273 if (
auto *VTy = dyn_cast<VectorType>(
this))
274 return VTy->getElementType()->isSized(Visited);
276 if (
auto *TTy = dyn_cast<TargetExtType>(
this))
277 return TTy->getLayoutType()->isSized(Visited);
279 return cast<StructType>(
this)->isSized(Visited);
307 return ByteType::get(
C,
N);
318 return IntegerType::get(
C,
N);
322 assert(Ty->isByteOrByteVectorTy() &&
"Expected a byte or byte vector type.");
323 unsigned NumBits = Ty->getScalarSizeInBits();
324 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
325 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
326 return VectorType::get(IntTy, VecTy);
331 assert(!Ty->isPtrOrPtrVectorTy() &&
332 "Expected a non-pointer or non-pointer vector type.");
333 unsigned NumBits = Ty->getScalarSizeInBits();
334 ByteType *ByteTy = ByteType::get(Ty->getContext(), NumBits);
335 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
336 return VectorType::get(ByteTy, VecTy);
342 return PointerType::get(
C, 10);
347 return PointerType::get(
C, 20);
355 assert(NumBits >= MIN_INT_BITS &&
"bitwidth too small");
356 assert(NumBits <= MAX_INT_BITS &&
"bitwidth too large");
385 assert(NumBits >= MIN_BYTE_BITS &&
"bitwidth too small");
386 assert(NumBits <= MAX_BYTE_BITS &&
"bitwidth too large");
404 ByteType *&Entry =
C.pImpl->ByteTypes[NumBits];
407 Entry =
new (
C.pImpl->Alloc)
ByteType(
C, NumBits);
421 Type **SubTys =
reinterpret_cast<Type**
>(
this+1);
422 assert(isValidReturnType(Result) &&
"invalid return type for function");
423 setSubclassData(IsVarArgs);
427 for (
unsigned i = 0, e = Params.
size(); i != e; ++i) {
428 assert(isValidArgumentType(Params[i]) &&
429 "Not a valid type for function argument!");
430 SubTys[i+1] = Params[i];
433 ContainedTys = SubTys;
434 NumContainedTys = Params.
size() + 1;
441 const FunctionTypeKeyInfo::KeyTy
Key(ReturnType, Params,
isVarArg);
449 if (Insertion.second) {
456 *Insertion.first = FT;
459 FT = *Insertion.first;
469 return !RetTy->isFunctionTy() && !RetTy->isLabelTy() &&
470 !RetTy->isMetadataTy();
474 return ArgTy->isFirstClassType() && !ArgTy->isLabelTy();
495 if (Insertion.second) {
499 ST->setSubclassData(SCDB_IsLiteral);
500 ST->setBody(ETypes, isPacked);
501 *Insertion.first =
ST;
504 ST = *Insertion.first;
511 if ((getSubclassData() & SCDB_ContainsScalableVector) != 0)
514 if ((getSubclassData() & SCDB_NotContainsScalableVector) != 0)
517 if (!Visited.
insert(
this).second)
520 for (Type *Ty : elements()) {
521 if (Ty->isScalableTy(Visited)) {
522 const_cast<StructType *
>(
this)->setSubclassData(
523 getSubclassData() | SCDB_ContainsScalableVector);
532 const_cast<StructType *
>(
this)->setSubclassData(
533 getSubclassData() | SCDB_NotContainsScalableVector);
539 if ((getSubclassData() & SCDB_ContainsNonGlobalTargetExtType) != 0)
542 if ((getSubclassData() & SCDB_NotContainsNonGlobalTargetExtType) != 0)
545 if (!Visited.
insert(
this).second)
548 for (Type *Ty : elements()) {
549 if (Ty->containsNonGlobalTargetExtType(Visited)) {
550 const_cast<StructType *
>(
this)->setSubclassData(
551 getSubclassData() | SCDB_ContainsNonGlobalTargetExtType);
560 const_cast<StructType *
>(
this)->setSubclassData(
561 getSubclassData() | SCDB_NotContainsNonGlobalTargetExtType);
567 if ((getSubclassData() & SCDB_ContainsNonLocalTargetExtType) != 0)
570 if ((getSubclassData() & SCDB_NotContainsNonLocalTargetExtType) != 0)
573 if (!Visited.
insert(
this).second)
576 for (Type *Ty : elements()) {
577 if (Ty->containsNonLocalTargetExtType(Visited)) {
578 const_cast<StructType *
>(
this)->setSubclassData(
579 getSubclassData() | SCDB_ContainsNonLocalTargetExtType);
588 const_cast<StructType *
>(
this)->setSubclassData(
589 getSubclassData() | SCDB_NotContainsNonLocalTargetExtType);
596 return containsHomogeneousTypes();
605 cantFail(setBodyOrError(Elements, isPacked));
609 assert(isOpaque() &&
"Struct body already set!");
611 if (
auto E = checkBody(Elements))
614 setSubclassData(getSubclassData() | SCDB_HasBody);
616 setSubclassData(getSubclassData() | SCDB_Packed);
628 for (
unsigned I = 0;
I < Worklist.size(); ++
I) {
629 Type *Ty = Worklist[
I];
633 Worklist.insert_range(Ty->subtypes());
662 getContext().pImpl->NamedStructTypes.insert(std::make_pair(Name,
this));
665 if (!IterBool.second) {
667 TempStr.push_back(
'.');
673 TmpStream <<
getContext().pImpl->NamedStructTypesUniqueID++;
675 IterBool =
getContext().pImpl->NamedStructTypes.insert(
676 std::make_pair(TmpStream.str(),
this));
677 }
while (!IterBool.second);
697 return get(Context, {}, isPacked);
703 ST->setBody(Elements, isPacked);
708 return create(Context, Elements,
StringRef());
718 "This method may not be invoked with an empty list");
719 return create(Elements[0]->
getContext(), Elements, Name, isPacked);
724 "This method may not be invoked with an empty list");
729 if ((getSubclassData() & SCDB_IsSized) != 0)
742 if (containsHomogeneousScalableVectorTypes()) {
743 const_cast<StructType *
>(
this)->setSubclassData(getSubclassData() |
747 for (Type *Ty : elements()) {
752 if (Ty->isScalableTy())
754 if (!Ty->isSized(Visited))
761 const_cast<StructType*
>(
this)->setSubclassData(
762 getSubclassData() | SCDB_IsSized);
767 assert(!isLiteral() &&
"Literal structs never have names");
774 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
775 !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy() &&
776 !ElemTy->isTokenTy();
780 if (
this ==
Other)
return true;
782 if (isPacked() !=
Other->isPacked())
785 return elements() ==
Other->elements();
790 assert(indexValid(Idx) &&
"Invalid structure index!");
791 return getElementType(Idx);
797 if (!V->getType()->isIntOrIntVectorTy(32))
802 if (
C && V->getType()->isVectorTy())
803 C =
C->getSplatValue();
809 return C.pImpl->NamedStructTypes.lookup(Name);
817 : Type(ElType->
getContext(), ArrayTyID), ContainedType(ElType),
819 ContainedTys = &ContainedType;
828 pImpl->
ArrayTypes[std::make_pair(ElementType, NumElements)];
836 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
837 !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy() &&
838 !ElemTy->isTokenTy() && !ElemTy->isX86_AMXTy();
846 : Type(ElType->
getContext(), TID), ContainedType(ElType),
847 ElementQuantity(
EQ) {
848 ContainedTys = &ContainedType;
854 return ScalableVectorType::get(ElementType,
EC.getKnownMinValue());
856 return FixedVectorType::get(ElementType,
EC.getKnownMinValue());
860 if (ElemTy->isIntegerTy() || ElemTy->isFloatingPointTy() ||
864 if (
auto *TTy = dyn_cast<TargetExtType>(ElemTy))
865 return TTy->hasProperty(TargetExtType::CanBeVectorElement);
874 assert(NumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
876 "be an integer, floating point, "
877 "pointer type, or a valid target "
883 VectorType *&Entry = ElementType->getContext()
884 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
896 unsigned MinNumElts) {
897 assert(MinNumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
899 "be an integer, floating point, or "
905 VectorType *&Entry = ElementType->getContext()
906 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
918 assert(EltTy &&
"Can't get a pointer to <null> type!");
922 return get(EltTy->getContext(), AddressSpace);
938 : Type(
C, PointerTyID) {
939 setSubclassData(AddrSpace);
942PointerType *Type::getPointerTo(
unsigned AddrSpace)
const {
943 return PointerType::get(
getContext(), AddrSpace);
947 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
948 !ElemTy->isMetadataTy() && !ElemTy->isTokenTy() &&
949 !ElemTy->isX86_AMXTy();
962 : Type(
C, TargetExtTyID),
Name(
C.pImpl->Saver.save(
Name)) {
963 NumContainedTys = Types.size();
966 Type **Params =
reinterpret_cast<Type **
>(
this + 1);
967 ContainedTys = Params;
968 for (Type *
T : Types)
971 setSubclassData(Ints.
size());
972 unsigned *IntParamSpace =
reinterpret_cast<unsigned *
>(Params);
973 IntParams = IntParamSpace;
974 for (
unsigned IntParam : Ints)
975 *IntParamSpace++ = IntParam;
981 return cantFail(getOrError(
C, Name, Types, Ints));
995 auto [Iter,
Inserted] =
C.pImpl->TargetExtTypes.insert_as(
nullptr,
Key);
1001 sizeof(
unsigned) * Ints.
size(),
1005 return checkParams(TT);
1014 if (TTy->Name ==
"aarch64.svcount" &&
1017 "target extension type aarch64.svcount should have no parameters");
1020 if (TTy->Name ==
"riscv.vector.tuple" &&
1023 "target extension type riscv.vector.tuple should have one "
1024 "type parameter and one integer parameter");
1027 if (TTy->Name ==
"amdgcn.named.barrier" &&
1030 "should have no type parameters "
1031 "and one integer parameter");
1038struct TargetTypeInfo {
1040 uint64_t Properties;
1042 template <
typename... ArgTys>
1043 TargetTypeInfo(
Type *LayoutType, ArgTys... Properties)
1044 : LayoutType(LayoutType), Properties((0 | ... | Properties)) {
1045 assert((!(this->Properties & TargetExtType::CanBeVectorElement) ||
1046 LayoutType->isSized()) &&
1047 "Vector element type must be sized");
1055 if (Name ==
"spirv.Image" || Name ==
"spirv.SignedImage")
1058 if (Name ==
"spirv.Type") {
1059 assert(Ty->getNumIntParameters() == 3 &&
1060 "Wrong number of parameters for spirv.Type");
1062 auto Size = Ty->getIntParameter(1);
1063 auto Alignment = Ty->getIntParameter(2);
1066 if (
Size > 0 && Alignment > 0) {
1079 if (Name ==
"spirv.IntegralConstant" || Name ==
"spirv.Literal")
1081 if (Name ==
"spirv.Padding")
1082 return TargetTypeInfo(
1085 if (
Name.starts_with(
"spirv."))
1091 if (Name ==
"aarch64.svcount")
1099 if (Name ==
"riscv.vector.tuple") {
1100 unsigned TotalNumElts =
1102 ->getMinNumElements(),
1104 Ty->getIntParameter(0);
1105 return TargetTypeInfo(
1111 if (Name ==
"dx.Padding")
1112 return TargetTypeInfo(
1115 if (
Name.starts_with(
"dx."))
1121 if (Name ==
"amdgcn.named.barrier") {
1128 if (Name ==
"llvm.test.vectorelement") {
1139 if (
auto *TT = dyn_cast<TargetExtType>(
this))
1140 return TT->hasProperty(TargetExtType::Property::IsTokenLike);
1150 return (Properties & Prop) == Prop;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static char getTypeID(Type *Ty)
static StringRef getName(Value *V)
static unsigned getNumElements(Type *Ty)
static bool isValidElementType(Type *Ty)
Predicate for the element types that the SLP vectorizer supports.
static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallString class.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
ArrayType(const Node *Base_, Node *Dimension_)
FunctionType(const Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, FunctionRefQual RefQual_, const Node *ExceptionSpec_)
PointerType(const Node *Pointee_)
VectorType(const Node *BaseType_, const Node *Dimension_)
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.
bool empty() const
empty - Check if the array is empty.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Class to represent byte types.
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
LLVM_ABI APInt getMask() const
For example, this is 0xFF for an 8 bit byte, 0xFFFF for b16, etc.
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)
static ErrorSuccess success()
Create a success value.
Class to represent fixed width SIMD vectors.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
static LLVM_ABI bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static LLVM_ABI 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 LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
LLVM_ABI APInt getMask() const
For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
StructTypeSet AnonStructTypes
DenseMap< std::pair< Type *, uint64_t >, ArrayType * > ArrayTypes
DenseMap< unsigned, PointerType * > PointerTypes
PointerType * AS0PointerType
FunctionTypeSet FunctionTypes
This is an important class for using LLVM in a threaded context.
static LLVM_ABI bool isLoadableOrStorableType(Type *ElemTy)
Return true if we can load or store from a pointer to this type.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Class to represent scalable SIMD vectors.
static LLVM_ABI 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.
A SetVector that performs no allocations if smaller than a certain size.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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.
AllocatorTy & getAllocator()
StringMapEntry< ValueTy > MapEntryTy
StringRef - Represent a constant reference to a string, i.e.
Class to represent struct types.
LLVM_ABI bool indexValid(const Value *V) const
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
LLVM_ABI bool containsNonLocalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a local.
LLVM_ABI void setBody(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type, which must not make the type recursive.
LLVM_ABI bool containsHomogeneousScalableVectorTypes() const
Returns true if this struct contains homogeneous scalable vector types.
LLVM_ABI Error checkBody(ArrayRef< Type * > Elements)
Return an error if the body for an opaque identified type would make it recursive.
LLVM_ABI bool containsHomogeneousTypes() const
Return true if this struct is non-empty and all element types are the same.
LLVM_ABI bool containsNonGlobalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a global...
static LLVM_ABI StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
LLVM_ABI bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
isSized - Return true if this is a sized type.
LLVM_ABI 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...
LLVM_ABI bool isLayoutIdentical(StructType *Other) const
Return true if this is layout identical to the specified struct.
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
LLVM_ABI Type * getTypeAtIndex(const Value *V) const
Given an index value into the type, return the type of the element.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
LLVM_ABI 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...
unsigned getNumIntParameters() const
static LLVM_ABI TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters.
unsigned getNumTypeParameters() const
static LLVM_ABI Expected< TargetExtType * > checkParams(TargetExtType *TTy)
Check that a newly created target extension type has the expected number of type parameters and integ...
LLVM_ABI bool hasProperty(Property Prop) const
Returns true if the target extension type contains the given property.
@ IsTokenLike
In particular, it cannot be used in select and phi instructions.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
@ CanBeVectorElement
This type may be used as an element in a vector.
@ CanBeGlobal
This type may be used as the value type of a global variable.
@ CanBeLocal
This type may be allocated on the stack, either as the allocated type of an alloca instruction or as ...
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
LLVM_ABI Type * getLayoutType() const
Returns an underlying layout type for the target extension type.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI ByteType * getByte16Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getX86_AMXTy(LLVMContext &C)
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
bool isByteTy() const
True if this is an instance of ByteType.
static LLVM_ABI Type * getWasm_ExternrefTy(LLVMContext &C)
LLVM_ABI bool containsNonGlobalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a global...
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
LLVM_ABI bool containsNonLocalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a local.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
static LLVM_ABI IntegerType * getInt128Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI Type * getPPC_FP128Ty(LLVMContext &C)
static LLVM_ABI Type * getFP128Ty(LLVMContext &C)
static LLVM_ABI Type * getLabelTy(LLVMContext &C)
LLVM_ABI bool isTokenLikeTy() const
Returns true if this is 'token' or a token-like target type.s.
static LLVM_ABI Type * getByteFromIntType(Type *)
Returns a byte (vector of byte) type with the same size of an integer of the given integer (vector of...
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
@ 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)
static LLVM_ABI ByteType * getByte32Ty(LLVMContext &C)
LLVM_ABI bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
LLVM_ABI bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
static LLVM_ABI Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Type(LLVMContext &C, TypeID tid)
LLVM_ABI bool isRISCVVectorTupleTy() const
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isTargetExtTy() const
Return true if this is a target extension type.
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
static LLVM_ABI Type * getPrimitiveType(LLVMContext &C, TypeID IDNumber)
Return a type based on an identifier.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI Type * getIntFromByteType(Type *)
Returns an integer (vector of integer) type with the same size of a byte of the given byte (vector of...
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static LLVM_ABI ByteType * getByte8Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
friend class LLVMContextImpl
static LLVM_ABI ByteType * getByte128Ty(LLVMContext &C)
static LLVM_ABI ByteType * getByte1Ty(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 isIntegerTy() const
True if this is an instance of IntegerType.
bool isTokenTy() const
Return true if this is 'token'.
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
static LLVM_ABI Type * getX86_FP80Ty(LLVMContext &C)
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
static LLVM_ABI ByteType * getByteNTy(LLVMContext &C, unsigned N)
LLVM_ABI const fltSemantics & getFltSemantics() const
static LLVM_ABI Type * getWasm_FuncrefTy(LLVMContext &C)
static LLVM_ABI ByteType * getByte64Ty(LLVMContext &C)
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
LLVM_ABI bool isScalableTargetExtTy() const
Return true if this is a target extension type with a scalable layout.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static constexpr unsigned RVVBytesPerBlock
constexpr size_t NameSize
ElementType
The element type of an SRV or UAV resource.
Context & getContext() const
LLVM_ABI Instruction & front() const
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
auto dyn_cast_or_null(const Y &Val)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.