LLVM 20.0.0git
Type.h
Go to the documentation of this file.
1//===- llvm/Type.h - Classes for handling data types ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the declaration of the Type class. For more "Type"
10// stuff, look in DerivedTypes.h.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_TYPE_H
15#define LLVM_IR_TYPE_H
16
17#include "llvm/ADT/ArrayRef.h"
23#include <cassert>
24#include <cstdint>
25#include <iterator>
26
27namespace llvm {
28
29class IntegerType;
30struct fltSemantics;
31class LLVMContext;
32class PointerType;
33class raw_ostream;
34class StringRef;
35template <typename PtrType> class SmallPtrSetImpl;
36
37/// The instances of the Type class are immutable: once they are created,
38/// they are never changed. Also note that only one instance of a particular
39/// type is ever created. Thus seeing if two types are equal is a matter of
40/// doing a trivial pointer comparison. To enforce that no two equal instances
41/// are created, Type instances can only be created via static factory methods
42/// in class Type and in derived classes. Once allocated, Types are never
43/// free'd.
44///
45class Type {
46public:
47 //===--------------------------------------------------------------------===//
48 /// Definitions of all of the base types for the Type system. Based on this
49 /// value, you can cast to a class defined in DerivedTypes.h.
50 /// Note: If you add an element to this, you need to add an element to the
51 /// Type::getPrimitiveType function, or else things will break!
52 /// Also update LLVMTypeKind and LLVMGetTypeKind () in the C binding.
53 ///
54 enum TypeID {
55 // PrimitiveTypes
56 HalfTyID = 0, ///< 16-bit floating point type
57 BFloatTyID, ///< 16-bit floating point type (7-bit significand)
58 FloatTyID, ///< 32-bit floating point type
59 DoubleTyID, ///< 64-bit floating point type
60 X86_FP80TyID, ///< 80-bit floating point type (X87)
61 FP128TyID, ///< 128-bit floating point type (112-bit significand)
62 PPC_FP128TyID, ///< 128-bit floating point type (two 64-bits, PowerPC)
63 VoidTyID, ///< type with no size
64 LabelTyID, ///< Labels
65 MetadataTyID, ///< Metadata
66 X86_AMXTyID, ///< AMX vectors (8192 bits, X86 specific)
67 TokenTyID, ///< Tokens
68
69 // Derived types... see DerivedTypes.h file.
70 IntegerTyID, ///< Arbitrary bit width integers
71 FunctionTyID, ///< Functions
72 PointerTyID, ///< Pointers
73 StructTyID, ///< Structures
74 ArrayTyID, ///< Arrays
75 FixedVectorTyID, ///< Fixed width SIMD vector type
76 ScalableVectorTyID, ///< Scalable SIMD vector type
77 TypedPointerTyID, ///< Typed pointer used by some GPU targets
78 TargetExtTyID, ///< Target extension type
79 };
80
81private:
82 /// This refers to the LLVMContext in which this type was uniqued.
83 LLVMContext &Context;
84
85 TypeID ID : 8; // The current base type of this type.
86 unsigned SubclassData : 24; // Space for subclasses to store data.
87 // Note that this should be synchronized with
88 // MAX_INT_BITS value in IntegerType class.
89
90protected:
91 friend class LLVMContextImpl;
92
93 explicit Type(LLVMContext &C, TypeID tid)
94 : Context(C), ID(tid), SubclassData(0) {}
95 ~Type() = default;
96
97 unsigned getSubclassData() const { return SubclassData; }
98
99 void setSubclassData(unsigned val) {
100 SubclassData = val;
101 // Ensure we don't have any accidental truncation.
102 assert(getSubclassData() == val && "Subclass data too large for field");
103 }
104
105 /// Keeps track of how many Type*'s there are in the ContainedTys list.
106 unsigned NumContainedTys = 0;
107
108 /// A pointer to the array of Types contained by this Type. For example, this
109 /// includes the arguments of a function type, the elements of a structure,
110 /// the pointee of a pointer, the element type of an array, etc. This pointer
111 /// may be 0 for types that don't contain other types (Integer, Double,
112 /// Float).
113 Type * const *ContainedTys = nullptr;
114
115public:
116 /// Print the current type.
117 /// Omit the type details if \p NoDetails == true.
118 /// E.g., let %st = type { i32, i16 }
119 /// When \p NoDetails is true, we only print %st.
120 /// Put differently, \p NoDetails prints the type as if
121 /// inlined with the operands when printing an instruction.
122 void print(raw_ostream &O, bool IsForDebug = false,
123 bool NoDetails = false) const;
124
125 void dump() const;
126
127 /// Return the LLVMContext in which this type was uniqued.
128 LLVMContext &getContext() const { return Context; }
129
130 //===--------------------------------------------------------------------===//
131 // Accessors for working with types.
132 //
133
134 /// Return the type id for the type. This will return one of the TypeID enum
135 /// elements defined above.
136 TypeID getTypeID() const { return ID; }
137
138 /// Return true if this is 'void'.
139 bool isVoidTy() const { return getTypeID() == VoidTyID; }
140
141 /// Return true if this is 'half', a 16-bit IEEE fp type.
142 bool isHalfTy() const { return getTypeID() == HalfTyID; }
143
144 /// Return true if this is 'bfloat', a 16-bit bfloat type.
145 bool isBFloatTy() const { return getTypeID() == BFloatTyID; }
146
147 /// Return true if this is a 16-bit float type.
148 bool is16bitFPTy() const {
149 return getTypeID() == BFloatTyID || getTypeID() == HalfTyID;
150 }
151
152 /// Return true if this is 'float', a 32-bit IEEE fp type.
153 bool isFloatTy() const { return getTypeID() == FloatTyID; }
154
155 /// Return true if this is 'double', a 64-bit IEEE fp type.
156 bool isDoubleTy() const { return getTypeID() == DoubleTyID; }
157
158 /// Return true if this is x86 long double.
159 bool isX86_FP80Ty() const { return getTypeID() == X86_FP80TyID; }
160
161 /// Return true if this is 'fp128'.
162 bool isFP128Ty() const { return getTypeID() == FP128TyID; }
163
164 /// Return true if this is powerpc long double.
165 bool isPPC_FP128Ty() const { return getTypeID() == PPC_FP128TyID; }
166
167 /// Return true if this is a well-behaved IEEE-like type, which has a IEEE
168 /// compatible layout as defined by APFloat::isIEEE(), and does not have
169 /// non-IEEE values, such as x86_fp80's unnormal values.
170 bool isIEEELikeFPTy() const {
171 switch (getTypeID()) {
172 case DoubleTyID:
173 case FloatTyID:
174 case HalfTyID:
175 case BFloatTyID:
176 case FP128TyID:
177 return true;
178 default:
179 return false;
180 }
181 }
182
183 /// Return true if this is one of the floating-point types
184 bool isFloatingPointTy() const {
185 return isIEEELikeFPTy() || getTypeID() == X86_FP80TyID ||
187 }
188
189 /// Returns true if this is a floating-point type that is an unevaluated sum
190 /// of multiple floating-point units.
191 /// An example of such a type is ppc_fp128, also known as double-double, which
192 /// consists of two IEEE 754 doubles.
193 bool isMultiUnitFPType() const {
194 return getTypeID() == PPC_FP128TyID;
195 }
196
198
199 /// Return true if this is X86 AMX.
200 bool isX86_AMXTy() const { return getTypeID() == X86_AMXTyID; }
201
202 /// Return true if this is a target extension type.
203 bool isTargetExtTy() const { return getTypeID() == TargetExtTyID; }
204
205 /// Return true if this is a target extension type with a scalable layout.
207
208 /// Return true if this is a type whose size is a known multiple of vscale.
210 bool isScalableTy() const;
211
212 /// Return true if this type is or contains a target extension type that
213 /// disallows being used as a global.
214 bool
217
218 /// Return true if this type is or contains a target extension type that
219 /// disallows being used as a local.
220 bool
223
224 /// Return true if this is a FP type or a vector of FP.
226
227 /// Return true if this is 'label'.
228 bool isLabelTy() const { return getTypeID() == LabelTyID; }
229
230 /// Return true if this is 'metadata'.
231 bool isMetadataTy() const { return getTypeID() == MetadataTyID; }
232
233 /// Return true if this is 'token'.
234 bool isTokenTy() const { return getTypeID() == TokenTyID; }
235
236 /// True if this is an instance of IntegerType.
237 bool isIntegerTy() const { return getTypeID() == IntegerTyID; }
238
239 /// Return true if this is an IntegerType of the given width.
240 bool isIntegerTy(unsigned Bitwidth) const;
241
242 /// Return true if this is an integer type or a vector of integer types.
243 bool isIntOrIntVectorTy() const { return getScalarType()->isIntegerTy(); }
244
245 /// Return true if this is an integer type or a vector of integer types of
246 /// the given width.
247 bool isIntOrIntVectorTy(unsigned BitWidth) const {
249 }
250
251 /// Return true if this is an integer type or a pointer type.
252 bool isIntOrPtrTy() const { return isIntegerTy() || isPointerTy(); }
253
254 /// True if this is an instance of FunctionType.
255 bool isFunctionTy() const { return getTypeID() == FunctionTyID; }
256
257 /// True if this is an instance of StructType.
258 bool isStructTy() const { return getTypeID() == StructTyID; }
259
260 /// True if this is an instance of ArrayType.
261 bool isArrayTy() const { return getTypeID() == ArrayTyID; }
262
263 /// True if this is an instance of PointerType.
264 bool isPointerTy() const { return getTypeID() == PointerTyID; }
265
266 /// Return true if this is a pointer type or a vector of pointer types.
267 bool isPtrOrPtrVectorTy() const { return getScalarType()->isPointerTy(); }
268
269 /// True if this is an instance of VectorType.
270 inline bool isVectorTy() const {
272 }
273
274 // True if this is an instance of TargetExtType of RISC-V vector tuple.
276
277 /// Return true if this type could be converted with a lossless BitCast to
278 /// type 'Ty'. For example, i8* to i32*. BitCasts are valid for types of the
279 /// same size only where no re-interpretation of the bits is done.
280 /// Determine if this type could be losslessly bitcast to Ty
282
283 /// Return true if this type is empty, that is, it has no elements or all of
284 /// its elements are empty.
285 bool isEmptyTy() const;
286
287 /// Return true if the type is "first class", meaning it is a valid type for a
288 /// Value.
289 bool isFirstClassType() const {
290 return getTypeID() != FunctionTyID && getTypeID() != VoidTyID;
291 }
292
293 /// Return true if the type is a valid type for a register in codegen. This
294 /// includes all first-class types except struct and array types.
295 bool isSingleValueType() const {
296 return isFloatingPointTy() || isIntegerTy() || isPointerTy() ||
298 }
299
300 /// Return true if the type is an aggregate type. This means it is valid as
301 /// the first operand of an insertvalue or extractvalue instruction. This
302 /// includes struct and array types, but does not include vector types.
303 bool isAggregateType() const {
304 return getTypeID() == StructTyID || getTypeID() == ArrayTyID;
305 }
306
307 /// Return true if it makes sense to take the size of this type. To get the
308 /// actual size for a particular target, it is reasonable to use the
309 /// DataLayout subsystem to do this.
310 bool isSized(SmallPtrSetImpl<Type*> *Visited = nullptr) const {
311 // If it's a primitive, it is always sized.
314 return true;
315 // If it is not something that can have a size (e.g. a function or label),
316 // it doesn't have a size.
317 if (getTypeID() != StructTyID && getTypeID() != ArrayTyID &&
319 return false;
320 // Otherwise we have to try harder to decide.
321 return isSizedDerivedType(Visited);
322 }
323
324 /// Return the basic size of this type if it is a primitive type. These are
325 /// fixed by LLVM and are not target-dependent.
326 /// This will return zero if the type does not have a size or is not a
327 /// primitive type.
328 ///
329 /// If this is a scalable vector type, the scalable property will be set and
330 /// the runtime size will be a positive integer multiple of the base size.
331 ///
332 /// Note that this may not reflect the size of memory allocated for an
333 /// instance of the type or the number of bytes that are written when an
334 /// instance of the type is stored to memory. The DataLayout class provides
335 /// additional query functions to provide this information.
336 ///
338
339 /// If this is a vector type, return the getPrimitiveSizeInBits value for the
340 /// element type. Otherwise return the getPrimitiveSizeInBits value for this
341 /// type.
343
344 /// Return the width of the mantissa of this type. This is only valid on
345 /// floating-point types. If the FP type does not have a stable mantissa (e.g.
346 /// ppc long double), this method returns -1.
348
349 /// Return whether the type is IEEE compatible, as defined by the eponymous
350 /// method in APFloat.
351 bool isIEEE() const;
352
353 /// If this is a vector type, return the element type, otherwise return
354 /// 'this'.
356 if (isVectorTy())
357 return getContainedType(0);
358 return const_cast<Type *>(this);
359 }
360
361 //===--------------------------------------------------------------------===//
362 // Type Iteration support.
363 //
364 using subtype_iterator = Type * const *;
365
370 }
371
372 using subtype_reverse_iterator = std::reverse_iterator<subtype_iterator>;
373
376 }
379 }
380
381 /// This method is used to implement the type iterator (defined at the end of
382 /// the file). For derived types, this returns the types 'contained' in the
383 /// derived type.
384 Type *getContainedType(unsigned i) const {
385 assert(i < NumContainedTys && "Index out of range!");
386 return ContainedTys[i];
387 }
388
389 /// Return the number of types in the derived type.
390 unsigned getNumContainedTypes() const { return NumContainedTys; }
391
392 //===--------------------------------------------------------------------===//
393 // Helper methods corresponding to subclass methods. This forces a cast to
394 // the specified subclass and calls its accessor. "getArrayNumElements" (for
395 // example) is shorthand for cast<ArrayType>(Ty)->getNumElements(). This is
396 // only intended to cover the core methods that are frequently used, helper
397 // methods should not be added here.
398
399 inline unsigned getIntegerBitWidth() const;
400
401 inline Type *getFunctionParamType(unsigned i) const;
402 inline unsigned getFunctionNumParams() const;
403 inline bool isFunctionVarArg() const;
404
405 inline StringRef getStructName() const;
406 inline unsigned getStructNumElements() const;
407 inline Type *getStructElementType(unsigned N) const;
408
410
413 return ContainedTys[0];
414 }
415
417
418 /// Given vector type, change the element type,
419 /// whilst keeping the old number of elements.
420 /// For non-vectors simply returns \p EltTy.
421 inline Type *getWithNewType(Type *EltTy) const;
422
423 /// Given an integer or vector type, change the lane bitwidth to NewBitwidth,
424 /// whilst keeping the old number of lanes.
425 inline Type *getWithNewBitWidth(unsigned NewBitWidth) const;
426
427 /// Given scalar/vector integer type, returns a type with elements twice as
428 /// wide as in the original type. For vectors, preserves element count.
429 inline Type *getExtendedType() const;
430
431 /// Get the address space of this pointer or pointer vector type.
432 inline unsigned getPointerAddressSpace() const;
433
434 //===--------------------------------------------------------------------===//
435 // Static members exported by the Type class itself. Useful for getting
436 // instances of Type.
437 //
438
439 /// Return a type based on an identifier.
441
442 //===--------------------------------------------------------------------===//
443 // These are the builtin types that are always available.
444 //
457 static IntegerType *getIntNTy(LLVMContext &C, unsigned N);
464 template <typename ScalarTy> static Type *getScalarTy(LLVMContext &C) {
465 int noOfBits = sizeof(ScalarTy) * CHAR_BIT;
466 if (std::is_integral<ScalarTy>::value) {
467 return (Type*) Type::getIntNTy(C, noOfBits);
468 } else if (std::is_floating_point<ScalarTy>::value) {
469 switch (noOfBits) {
470 case 32:
471 return Type::getFloatTy(C);
472 case 64:
473 return Type::getDoubleTy(C);
474 }
475 }
476 llvm_unreachable("Unsupported type in Type::getScalarTy");
477 }
479
480 //===--------------------------------------------------------------------===//
481 // Convenience methods for getting pointer types.
482 //
485
486 /// Return a pointer to the current type. This is equivalent to
487 /// PointerType::get(Ctx, AddrSpace).
488 /// TODO: Remove this after opaque pointer transition is complete.
489 LLVM_DEPRECATED("Use PointerType::get instead", "PointerType::get")
490 PointerType *getPointerTo(unsigned AddrSpace = 0) const;
491
492private:
493 /// Derived types like structures and arrays are sized iff all of the members
494 /// of the type are sized as well. Since asking for their size is relatively
495 /// uncommon, move this operation out-of-line.
496 bool isSizedDerivedType(SmallPtrSetImpl<Type*> *Visited = nullptr) const;
497};
498
499// Printing of types.
501 T.print(OS);
502 return OS;
503}
504
505// allow isa<PointerType>(x) to work without DerivedTypes.h included.
506template <> struct isa_impl<PointerType, Type> {
507 static inline bool doit(const Type &Ty) {
508 return Ty.getTypeID() == Type::PointerTyID;
509 }
510};
511
512// Create wrappers for C Binding types (see CBindingWrapping.h).
514
515/* Specialized opaque type conversions.
516 */
518 return reinterpret_cast<Type**>(Tys);
519}
520
521inline LLVMTypeRef *wrap(Type **Tys) {
522 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
523}
524
525} // end namespace llvm
526
527#endif // LLVM_IR_TYPE_H
aarch64 promote const
always inline
#define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
#define LLVM_DEPRECATED(MSG, FIX)
Definition: Compiler.h:236
#define LLVM_READONLY
Definition: Compiler.h:306
Type::TypeID TypeID
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Class to represent integer types.
Definition: DerivedTypes.h:42
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
Class to represent pointers.
Definition: DerivedTypes.h:670
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:363
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
~Type()=default
bool isIntOrIntVectorTy(unsigned BitWidth) const
Return true if this is an integer type or a vector of integer types of the given width.
Definition: Type.h:247
static Type * getHalfTy(LLVMContext &C)
unsigned getIntegerBitWidth() const
Type * getStructElementType(unsigned N) const
static Type * getDoubleTy(LLVMContext &C)
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:270
static Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
bool isX86_FP80Ty() const
Return true if this is x86 long double.
Definition: Type.h:159
PointerType * getPointerTo(unsigned AddrSpace=0) const
Return a pointer to the current type.
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.
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition: Type.h:261
static Type * getX86_FP80Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
Definition: Type.h:228
static Type * getBFloatTy(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:243
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
static IntegerType * getInt1Ty(LLVMContext &C)
Type * getArrayElementType() const
Definition: Type.h:411
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
void dump() const
bool isIntegerTy(unsigned Bitwidth) const
Return true if this is an IntegerType of the given width.
static Type * getX86_AMXTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:145
static Type * getMetadataTy(LLVMContext &C)
StringRef getStructName() const
Type *const * subtype_iterator
Definition: Type.h:364
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...
unsigned getStructNumElements() const
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
uint64_t getArrayNumElements() const
bool containsNonLocalTargetExtType() const
TypeID
Definitions of all of the base types for the Type system.
Definition: Type.h:54
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
Definition: Type.h:66
@ FunctionTyID
Functions.
Definition: Type.h:71
@ ArrayTyID
Arrays.
Definition: Type.h:74
@ TypedPointerTyID
Typed pointer used by some GPU targets.
Definition: Type.h:77
@ HalfTyID
16-bit floating point type
Definition: Type.h:56
@ TargetExtTyID
Target extension type.
Definition: Type.h:78
@ VoidTyID
type with no size
Definition: Type.h:63
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition: Type.h:76
@ LabelTyID
Labels.
Definition: Type.h:64
@ FloatTyID
32-bit floating point type
Definition: Type.h:58
@ StructTyID
Structures.
Definition: Type.h:73
@ IntegerTyID
Arbitrary bit width integers.
Definition: Type.h:70
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition: Type.h:75
@ BFloatTyID
16-bit floating point type (7-bit significand)
Definition: Type.h:57
@ DoubleTyID
64-bit floating point type
Definition: Type.h:59
@ X86_FP80TyID
80-bit floating point type (X87)
Definition: Type.h:60
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
Definition: Type.h:62
@ MetadataTyID
Metadata.
Definition: Type.h:65
@ TokenTyID
Tokens.
Definition: Type.h:67
@ PointerTyID
Pointers.
Definition: Type.h:72
@ FP128TyID
128-bit floating point type (112-bit significand)
Definition: Type.h:61
ArrayRef< Type * > subtypes() const
Definition: Type.h:368
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
Definition: Type.h:295
void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
unsigned getNumContainedTypes() const
Return the number of types in the derived type.
Definition: Type.h:390
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:165
unsigned NumContainedTys
Keeps track of how many Type*'s there are in the ContainedTys list.
Definition: Type.h:106
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
bool isFP128Ty() const
Return true if this is 'fp128'.
Definition: Type.h:162
bool is16bitFPTy() const
Return true if this is a 16-bit float type.
Definition: Type.h:148
StringRef getTargetExtName() const
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 isMultiUnitFPType() const
Returns true if this is a floating-point type that is an unevaluated sum of multiple floating-point u...
Definition: Type.h:193
Type(LLVMContext &C, TypeID tid)
Definition: Type.h:93
bool isStructTy() const
True if this is an instance of StructType.
Definition: Type.h:258
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
Definition: Type.h:289
static Type * getFP128Ty(LLVMContext &C)
Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
bool isTargetExtTy() const
Return true if this is a target extension type.
Definition: Type.h:203
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:310
static IntegerType * getInt16Ty(LLVMContext &C)
bool isAggregateType() const
Return true if the type is an aggregate type.
Definition: Type.h:303
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:142
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:128
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.
Definition: Type.h:113
unsigned getSubclassData() const
Definition: Type.h:97
static IntegerType * getInt8Ty(LLVMContext &C)
bool isIEEE() const
Return whether the type is IEEE compatible, as defined by the eponymous method in APFloat.
std::reverse_iterator< subtype_iterator > subtype_reverse_iterator
Definition: Type.h:372
static IntegerType * getInt128Ty(LLVMContext &C)
bool isFunctionVarArg() const
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
void setSubclassData(unsigned val)
Definition: Type.h:99
static Type * getTokenTy(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition: Type.h:184
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition: Type.h:267
subtype_iterator subtype_begin() const
Definition: Type.h:366
bool isX86_AMXTy() const
Return true if this is X86 AMX.
Definition: Type.h:200
static Type * getScalarTy(LLVMContext &C)
Definition: Type.h:464
bool isRISCVVectorTupleTy() const
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition: Type.h:255
bool isScalableTy() const
bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
Definition: Type.h:252
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
Type * getExtendedType() const
Given scalar/vector integer type, returns a type with elements twice as wide as in the original type.
static Type * getFloatTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:237
TypeID getTypeID() const
Return the type id for the type.
Definition: Type.h:136
static Type * getWasm_FuncrefTy(LLVMContext &C)
bool isTokenTy() const
Return true if this is 'token'.
Definition: Type.h:234
Type * getFunctionParamType(unsigned i) const
subtype_reverse_iterator subtype_rend() const
Definition: Type.h:377
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition: Type.h:225
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
subtype_reverse_iterator subtype_rbegin() const
Definition: Type.h:374
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
Definition: Type.h:384
subtype_iterator subtype_end() const
Definition: Type.h:367
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
Definition: Type.h:170
bool containsNonGlobalTargetExtType() const
static Type * getPPC_FP128Ty(LLVMContext &C)
unsigned getFunctionNumParams() const
static Type * getWasm_ExternrefTy(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:355
bool isMetadataTy() const
Return true if this is 'metadata'.
Definition: Type.h:231
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
struct LLVMOpaqueType * LLVMTypeRef
Each value in the LLVM IR has a type, an LLVMTypeRef.
Definition: Types.h:68
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Attribute unwrap(LLVMAttributeRef Attr)
Definition: Attributes.h:332
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:217
LLVMAttributeRef wrap(Attribute Attr)
Definition: Attributes.h:327
#define N
static bool doit(const Type &Ty)
Definition: Type.h:507