62 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
63 return ATy->getElementType()->isScalableTy(Visited);
64 if (
const auto *STy = dyn_cast<StructType>(
this))
65 return STy->isScalableTy(Visited);
70 SmallPtrSet<const Type *, 4> Visited;
76 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
77 return ATy->getElementType()->containsNonGlobalTargetExtType(Visited);
78 if (
const auto *STy = dyn_cast<StructType>(
this))
79 return STy->containsNonGlobalTargetExtType(Visited);
80 if (
auto *TT = dyn_cast<TargetExtType>(
this))
81 return !
TT->hasProperty(TargetExtType::CanBeGlobal);
86 SmallPtrSet<const Type *, 4> Visited;
92 if (
const auto *ATy = dyn_cast<ArrayType>(
this))
93 return ATy->getElementType()->containsNonLocalTargetExtType(Visited);
94 if (
const auto *STy = dyn_cast<StructType>(
this))
95 return STy->containsNonLocalTargetExtType(Visited);
96 if (
auto *TT = dyn_cast<TargetExtType>(
this))
97 return !
TT->hasProperty(TargetExtType::CanBeLocal);
102 SmallPtrSet<const Type *, 4> Visited;
108 case HalfTyID:
return APFloat::IEEEhalf();
110 case FloatTyID:
return APFloat::IEEEsingle();
111 case DoubleTyID:
return APFloat::IEEEdouble();
113 case FP128TyID:
return APFloat::IEEEquad();
120 if (
auto *TT = dyn_cast<TargetExtType>(
this))
121 return isa<ScalableVectorType>(
TT->getLayoutType());
127 if (&S == &APFloat::IEEEhalf())
128 Ty = Type::getHalfTy(
C);
129 else if (&S == &APFloat::BFloat())
130 Ty = Type::getBFloatTy(
C);
131 else if (&S == &APFloat::IEEEsingle())
132 Ty = Type::getFloatTy(
C);
133 else if (&S == &APFloat::IEEEdouble())
134 Ty = Type::getDoubleTy(
C);
135 else if (&S == &APFloat::x87DoubleExtended())
136 Ty = Type::getX86_FP80Ty(
C);
137 else if (&S == &APFloat::IEEEquad())
138 Ty = Type::getFP128Ty(
C);
140 assert(&S == &APFloat::PPCDoubleDouble() &&
"Unknown FP format");
141 Ty = Type::getPPC_FP128Ty(
C);
150 return cast<TargetExtType>(
this)->getName() ==
"riscv.vector.tuple";
164 if (isa<VectorType>(
this) && isa<VectorType>(Ty))
168 if (((isa<FixedVectorType>(
this)) && Ty->isX86_AMXTy()) &&
172 Ty->getPrimitiveSizeInBits().getFixedValue() == 8192)
181 if (
auto *ATy = dyn_cast<ArrayType>(
this)) {
182 unsigned NumElements = ATy->getNumElements();
183 return NumElements == 0 || ATy->getElementType()->isEmptyTy();
186 if (
auto *STy = dyn_cast<StructType>(
this)) {
187 unsigned NumElements = STy->getNumElements();
188 for (
unsigned i = 0; i < NumElements; ++i)
189 if (!STy->getElementType(i)->isEmptyTy())
200 return TypeSize::getFixed(16);
201 case Type::BFloatTyID:
202 return TypeSize::getFixed(16);
203 case Type::FloatTyID:
204 return TypeSize::getFixed(32);
205 case Type::DoubleTyID:
206 return TypeSize::getFixed(64);
207 case Type::X86_FP80TyID:
208 return TypeSize::getFixed(80);
209 case Type::FP128TyID:
210 return TypeSize::getFixed(128);
211 case Type::PPC_FP128TyID:
212 return TypeSize::getFixed(128);
213 case Type::X86_AMXTyID:
214 return TypeSize::getFixed(8192);
216 return TypeSize::getFixed(cast<ByteType>(
this)->
getBitWidth());
217 case Type::IntegerTyID:
218 return TypeSize::getFixed(cast<IntegerType>(
this)->
getBitWidth());
219 case Type::FixedVectorTyID:
220 case Type::ScalableVectorTyID: {
221 const VectorType *VTy = cast<VectorType>(
this);
222 ElementCount
EC = VTy->getElementCount();
223 TypeSize ETS = VTy->getElementType()->getPrimitiveSizeInBits();
224 assert(!ETS.
isScalable() &&
"Vector type should have fixed-width elements");
228 return TypeSize::getFixed(0);
234 return getScalarType()->getPrimitiveSizeInBits().getFixedValue();
238 if (
auto *VTy = dyn_cast<VectorType>(
this))
239 return VTy->getElementType()->getFPMantissaWidth();
259 auto *
ST = cast<StructType>(
this);
260 return !
ST->isOpaque();
266 if (
auto *ATy = dyn_cast<ArrayType>(
this))
267 return ATy->getElementType()->isSized(Visited);
269 if (
auto *VTy = dyn_cast<VectorType>(
this))
270 return VTy->getElementType()->isSized(Visited);
272 if (
auto *TTy = dyn_cast<TargetExtType>(
this))
273 return TTy->getLayoutType()->isSized(Visited);
275 return cast<StructType>(
this)->isSized(Visited);
303 return ByteType::get(
C,
N);
314 return IntegerType::get(
C,
N);
318 assert(Ty->isByteOrByteVectorTy() &&
"Expected a byte or byte vector type.");
319 unsigned NumBits = Ty->getScalarSizeInBits();
320 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
321 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
322 return VectorType::get(IntTy, VecTy);
327 assert(!Ty->isPtrOrPtrVectorTy() &&
328 "Expected a non-pointer or non-pointer vector type.");
329 unsigned NumBits = Ty->getScalarSizeInBits();
330 ByteType *ByteTy = ByteType::get(Ty->getContext(), NumBits);
331 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
332 return VectorType::get(ByteTy, VecTy);
338 return PointerType::get(
C, 10);
343 return PointerType::get(
C, 20);
351 assert(NumBits >= MIN_INT_BITS &&
"bitwidth too small");
352 assert(NumBits <= MAX_INT_BITS &&
"bitwidth too large");
381 assert(NumBits >= MIN_BYTE_BITS &&
"bitwidth too small");
382 assert(NumBits <= MAX_BYTE_BITS &&
"bitwidth too large");
400 ByteType *&Entry =
C.pImpl->ByteTypes[NumBits];
403 Entry =
new (
C.pImpl->Alloc)
ByteType(
C, NumBits);
417 Type **SubTys =
reinterpret_cast<Type**
>(
this+1);
418 assert(isValidReturnType(Result) &&
"invalid return type for function");
419 setSubclassData(IsVarArgs);
423 for (
unsigned i = 0, e = Params.
size(); i != e; ++i) {
424 assert(isValidArgumentType(Params[i]) &&
425 "Not a valid type for function argument!");
426 SubTys[i+1] = Params[i];
429 ContainedTys = SubTys;
430 NumContainedTys = Params.
size() + 1;
437 const FunctionTypeKeyInfo::KeyTy
Key(ReturnType, Params,
isVarArg);
445 if (Insertion.second) {
452 *Insertion.first = FT;
455 FT = *Insertion.first;
465 return !RetTy->isFunctionTy() && !RetTy->isLabelTy() &&
466 !RetTy->isMetadataTy();
470 return ArgTy->isFirstClassType() && !ArgTy->isLabelTy();
491 if (Insertion.second) {
495 ST->setSubclassData(SCDB_IsLiteral);
496 ST->setBody(ETypes, isPacked);
497 *Insertion.first =
ST;
500 ST = *Insertion.first;
507 if ((getSubclassData() & SCDB_ContainsScalableVector) != 0)
510 if ((getSubclassData() & SCDB_NotContainsScalableVector) != 0)
513 if (!Visited.
insert(
this).second)
516 for (Type *Ty : elements()) {
517 if (Ty->isScalableTy(Visited)) {
518 const_cast<StructType *
>(
this)->setSubclassData(
519 getSubclassData() | SCDB_ContainsScalableVector);
528 const_cast<StructType *
>(
this)->setSubclassData(
529 getSubclassData() | SCDB_NotContainsScalableVector);
535 if ((getSubclassData() & SCDB_ContainsNonGlobalTargetExtType) != 0)
538 if ((getSubclassData() & SCDB_NotContainsNonGlobalTargetExtType) != 0)
541 if (!Visited.
insert(
this).second)
544 for (Type *Ty : elements()) {
545 if (Ty->containsNonGlobalTargetExtType(Visited)) {
546 const_cast<StructType *
>(
this)->setSubclassData(
547 getSubclassData() | SCDB_ContainsNonGlobalTargetExtType);
556 const_cast<StructType *
>(
this)->setSubclassData(
557 getSubclassData() | SCDB_NotContainsNonGlobalTargetExtType);
563 if ((getSubclassData() & SCDB_ContainsNonLocalTargetExtType) != 0)
566 if ((getSubclassData() & SCDB_NotContainsNonLocalTargetExtType) != 0)
569 if (!Visited.
insert(
this).second)
572 for (Type *Ty : elements()) {
573 if (Ty->containsNonLocalTargetExtType(Visited)) {
574 const_cast<StructType *
>(
this)->setSubclassData(
575 getSubclassData() | SCDB_ContainsNonLocalTargetExtType);
584 const_cast<StructType *
>(
this)->setSubclassData(
585 getSubclassData() | SCDB_NotContainsNonLocalTargetExtType);
592 return containsHomogeneousTypes();
601 cantFail(setBodyOrError(Elements, isPacked));
605 assert(isOpaque() &&
"Struct body already set!");
607 if (
auto E = checkBody(Elements))
610 setSubclassData(getSubclassData() | SCDB_HasBody);
612 setSubclassData(getSubclassData() | SCDB_Packed);
624 for (
unsigned I = 0;
I < Worklist.size(); ++
I) {
625 Type *Ty = Worklist[
I];
629 Worklist.insert_range(Ty->subtypes());
658 getContext().pImpl->NamedStructTypes.insert(std::make_pair(Name,
this));
661 if (!IterBool.second) {
663 TempStr.push_back(
'.');
669 TmpStream <<
getContext().pImpl->NamedStructTypesUniqueID++;
671 IterBool =
getContext().pImpl->NamedStructTypes.insert(
672 std::make_pair(TmpStream.str(),
this));
673 }
while (!IterBool.second);
693 return get(Context, {}, isPacked);
699 ST->setBody(Elements, isPacked);
704 return create(Context, Elements,
StringRef());
714 "This method may not be invoked with an empty list");
715 return create(Elements[0]->
getContext(), Elements, Name, isPacked);
720 "This method may not be invoked with an empty list");
725 if ((getSubclassData() & SCDB_IsSized) != 0)
738 if (containsHomogeneousScalableVectorTypes()) {
739 const_cast<StructType *
>(
this)->setSubclassData(getSubclassData() |
743 for (Type *Ty : elements()) {
748 if (Ty->isScalableTy())
750 if (!Ty->isSized(Visited))
757 const_cast<StructType*
>(
this)->setSubclassData(
758 getSubclassData() | SCDB_IsSized);
763 assert(!isLiteral() &&
"Literal structs never have names");
770 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
771 !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy() &&
772 !ElemTy->isTokenTy();
776 if (
this ==
Other)
return true;
778 if (isPacked() !=
Other->isPacked())
781 return elements() ==
Other->elements();
786 assert(indexValid(Idx) &&
"Invalid structure index!");
787 return getElementType(Idx);
793 if (!V->getType()->isIntOrIntVectorTy(32))
798 if (
C && V->getType()->isVectorTy())
799 C =
C->getSplatValue();
805 return C.pImpl->NamedStructTypes.lookup(Name);
815 ContainedTys = &ContainedType;
824 pImpl->
ArrayTypes[std::make_pair(ElementType, NumElements)];
832 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
833 !ElemTy->isMetadataTy() && !ElemTy->isFunctionTy() &&
834 !ElemTy->isTokenTy() && !ElemTy->isX86_AMXTy();
842 : Type(ElType->
getContext(), TID), ContainedType(ElType),
843 ElementQuantity(
EQ) {
844 ContainedTys = &ContainedType;
850 return ScalableVectorType::get(ElementType,
EC.getKnownMinValue());
852 return FixedVectorType::get(ElementType,
EC.getKnownMinValue());
856 if (ElemTy->isIntegerTy() || ElemTy->isFloatingPointTy() ||
860 if (
auto *TTy = dyn_cast<TargetExtType>(ElemTy))
861 return TTy->hasProperty(TargetExtType::CanBeVectorElement);
870 assert(NumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
872 "be an integer, floating point, "
873 "pointer type, or a valid target "
879 VectorType *&Entry = ElementType->getContext()
880 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
892 unsigned MinNumElts) {
893 assert(MinNumElts > 0 &&
"#Elements of a VectorType must be greater than 0");
895 "be an integer, floating point, or "
901 VectorType *&Entry = ElementType->getContext()
902 .pImpl->VectorTypes[std::make_pair(ElementType, EC)];
914 assert(EltTy &&
"Can't get a pointer to <null> type!");
918 return get(EltTy->getContext(), AddressSpace);
935 setSubclassData(AddrSpace);
938PointerType *Type::getPointerTo(
unsigned AddrSpace)
const {
939 return PointerType::get(
getContext(), AddrSpace);
943 return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&
944 !ElemTy->isMetadataTy() && !ElemTy->isTokenTy() &&
945 !ElemTy->isX86_AMXTy();
959 NumContainedTys = Types.size();
962 Type **Params =
reinterpret_cast<Type **
>(
this + 1);
963 ContainedTys = Params;
964 for (Type *
T : Types)
967 setSubclassData(Ints.
size());
968 unsigned *IntParamSpace =
reinterpret_cast<unsigned *
>(Params);
969 IntParams = IntParamSpace;
970 for (
unsigned IntParam : Ints)
971 *IntParamSpace++ = IntParam;
977 return cantFail(getOrError(
C, Name, Types, Ints));
991 auto [Iter,
Inserted] =
C.pImpl->TargetExtTypes.insert_as(
nullptr,
Key);
997 sizeof(
unsigned) * Ints.
size(),
1001 return checkParams(TT);
1010 if (TTy->Name ==
"aarch64.svcount" &&
1013 "target extension type aarch64.svcount should have no parameters");
1016 if (TTy->Name ==
"riscv.vector.tuple" &&
1019 "target extension type riscv.vector.tuple should have one "
1020 "type parameter and one integer parameter");
1023 if (TTy->Name ==
"amdgcn.named.barrier" &&
1026 "should have no type parameters "
1027 "and one integer parameter");
1029 if (TTy->Name ==
"amdgpu.stridemark" &&
1032 "should have no type parameters "
1033 "and at most one integer parameter");
1040struct TargetTypeInfo {
1042 uint64_t Properties;
1044 template <
typename... ArgTys>
1045 TargetTypeInfo(
Type *LayoutType, ArgTys... Properties)
1046 : LayoutType(LayoutType), Properties((0 | ... | Properties)) {
1047 assert((!(this->Properties & TargetExtType::CanBeVectorElement) ||
1048 LayoutType->isSized()) &&
1049 "Vector element type must be sized");
1057 if (Name ==
"spirv.Image" || Name ==
"spirv.SignedImage")
1060 if (Name ==
"spirv.Type") {
1061 assert(Ty->getNumIntParameters() == 3 &&
1062 "Wrong number of parameters for spirv.Type");
1064 auto Size = Ty->getIntParameter(1);
1065 auto Alignment = Ty->getIntParameter(2);
1068 if (
Size > 0 && Alignment > 0) {
1081 if (Name ==
"spirv.IntegralConstant" || Name ==
"spirv.Literal")
1083 if (Name ==
"spirv.Padding")
1084 return TargetTypeInfo(
1087 if (
Name.starts_with(
"spirv."))
1093 if (Name ==
"aarch64.svcount")
1101 if (Name ==
"riscv.vector.tuple") {
1102 unsigned TotalNumElts =
1104 ->getMinNumElements(),
1106 Ty->getIntParameter(0);
1107 return TargetTypeInfo(
1113 if (Name ==
"dx.Padding")
1114 return TargetTypeInfo(
1117 if (
Name.starts_with(
"dx."))
1123 if (Name ==
"amdgcn.named.barrier") {
1127 if (Name ==
"amdgpu.stridemark")
1132 if (Name ==
"llvm.test.vectorelement") {
1143 if (
auto *TT = dyn_cast<TargetExtType>(
this))
1144 return TT->hasProperty(TargetExtType::Property::IsTokenLike);
1154 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)
@ TargetExtTyID
Target extension type.
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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
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.
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
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 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.