LLVM 22.0.0git
ValueTypes.h
Go to the documentation of this file.
1//===- CodeGen/ValueTypes.h - Low-Level Target independ. 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 defines the set of low-level target independent types which various
10// values in the code generator are. This allows the target specific behavior
11// of instructions to be described to target independent passes.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CODEGEN_VALUETYPES_H
16#define LLVM_CODEGEN_VALUETYPES_H
17
22#include <cassert>
23#include <cstdint>
24#include <string>
25
26namespace llvm {
27
28 class LLVMContext;
29 class Type;
30 struct fltSemantics;
31
32 /// Extended Value Type. Capable of holding value types which are not native
33 /// for any processor (such as the i12345 type), as well as the types an MVT
34 /// can represent.
35 struct EVT {
36 private:
38 Type *LLVMTy = nullptr;
39
40 public:
41 constexpr EVT() = default;
42 constexpr EVT(MVT::SimpleValueType SVT) : V(SVT) {}
43 constexpr EVT(MVT S) : V(S) {}
44
45 bool operator==(EVT VT) const {
46 return !(*this != VT);
47 }
48 bool operator!=(EVT VT) const {
49 if (V.SimpleTy != VT.V.SimpleTy)
50 return true;
51 if (V.SimpleTy == MVT::INVALID_SIMPLE_VALUE_TYPE)
52 return LLVMTy != VT.LLVMTy;
53 return false;
54 }
55
56 /// Returns the EVT that represents a floating-point type with the given
57 /// number of bits. There are two floating-point types with 128 bits - this
58 /// returns f128 rather than ppcf128.
59 static EVT getFloatingPointVT(unsigned BitWidth) {
61 }
62
63 /// Returns the EVT that represents an integer with the given number of
64 /// bits.
65 static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth) {
67 if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE)
68 return M;
69 return getExtendedIntegerVT(Context, BitWidth);
70 }
71
72 /// Returns the EVT that represents a vector NumElements in length, where
73 /// each element is of type VT.
74 static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements,
75 bool IsScalable = false) {
76 MVT M = MVT::getVectorVT(VT.V, NumElements, IsScalable);
77 if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE)
78 return M;
79 return getExtendedVectorVT(Context, VT, NumElements, IsScalable);
80 }
81
82 /// Returns the EVT that represents a vector EC.Min elements in length,
83 /// where each element is of type VT.
84 static EVT getVectorVT(LLVMContext &Context, EVT VT, ElementCount EC) {
85 MVT M = MVT::getVectorVT(VT.V, EC);
86 if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE)
87 return M;
88 return getExtendedVectorVT(Context, VT, EC);
89 }
90
91 /// Return a vector with the same number of elements as this vector, but
92 /// with the element type converted to an integer type with the same
93 /// bitwidth.
95 if (isSimple())
97 return changeExtendedVectorElementTypeToInteger();
98 }
99
100 /// Return a VT for a vector type whose attributes match ourselves
101 /// with the exception of the element type that is chosen by the caller.
103 if (isSimple()) {
104 assert(EltVT.isSimple() &&
105 "Can't change simple vector VT to have extended element VT");
107 }
108 return changeExtendedVectorElementType(EltVT);
109 }
110
111 /// Return a VT for a type whose attributes match ourselves with the
112 /// exception of the element type that is chosen by the caller.
113 EVT changeElementType(EVT EltVT) const {
114 EltVT = EltVT.getScalarType();
115 return isVector() ? changeVectorElementType(EltVT) : EltVT;
116 }
117
118 /// Return the type converted to an equivalently sized integer or vector
119 /// with integer element type. Similar to changeVectorElementTypeToInteger,
120 /// but also handles scalars.
122 if (isVector())
124
125 if (isSimple())
127 return changeExtendedTypeToInteger();
128 }
129
130 /// Test if the given EVT has zero size, this will fail if called on a
131 /// scalable type
132 bool isZeroSized() const {
133 return getSizeInBits().isZero();
134 }
135
136 /// Test if the given EVT is simple (as opposed to being extended).
137 bool isSimple() const {
138 return V.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE;
139 }
140
141 /// Test if the given EVT is extended (as opposed to being simple).
142 bool isExtended() const {
143 return !isSimple();
144 }
145
146 /// Return true if this is a FP or a vector FP type.
147 bool isFloatingPoint() const {
148 return isSimple() ? V.isFloatingPoint() : isExtendedFloatingPoint();
149 }
150
151 /// Return true if this is an integer or a vector integer type.
152 bool isInteger() const {
153 return isSimple() ? V.isInteger() : isExtendedInteger();
154 }
155
156 /// Return true if this is an integer, but not a vector.
157 bool isScalarInteger() const {
158 return isSimple() ? V.isScalarInteger() : isExtendedScalarInteger();
159 }
160
161 /// Return true if this is a vector type where the runtime
162 /// length is machine dependent
164 return isSimple() && V.isScalableTargetExtVT();
165 }
166
167 /// Return true if this is a vector value type.
168 bool isVector() const {
169 return isSimple() ? V.isVector() : isExtendedVector();
170 }
171
172 /// Return true if this is a vector type where the runtime
173 /// length is machine dependent
174 bool isScalableVector() const {
175 return isSimple() ? V.isScalableVector() : isExtendedScalableVector();
176 }
177
178 /// Return true if this is a vector value type.
179 bool isRISCVVectorTuple() const { return V.isRISCVVectorTuple(); }
180
181 bool isFixedLengthVector() const {
182 return isSimple() ? V.isFixedLengthVector()
183 : isExtendedFixedLengthVector();
184 }
185
186 /// Return true if the type is a scalable type.
187 bool isScalableVT() const {
189 }
190
191 /// Return true if this is a 16-bit vector type.
192 bool is16BitVector() const {
193 return isSimple() ? V.is16BitVector() : isExtended16BitVector();
194 }
195
196 /// Return true if this is a 32-bit vector type.
197 bool is32BitVector() const {
198 return isSimple() ? V.is32BitVector() : isExtended32BitVector();
199 }
200
201 /// Return true if this is a 64-bit vector type.
202 bool is64BitVector() const {
203 return isSimple() ? V.is64BitVector() : isExtended64BitVector();
204 }
205
206 /// Return true if this is a 128-bit vector type.
207 bool is128BitVector() const {
208 return isSimple() ? V.is128BitVector() : isExtended128BitVector();
209 }
210
211 /// Return true if this is a 256-bit vector type.
212 bool is256BitVector() const {
213 return isSimple() ? V.is256BitVector() : isExtended256BitVector();
214 }
215
216 /// Return true if this is a 512-bit vector type.
217 bool is512BitVector() const {
218 return isSimple() ? V.is512BitVector() : isExtended512BitVector();
219 }
220
221 /// Return true if this is a 1024-bit vector type.
222 bool is1024BitVector() const {
223 return isSimple() ? V.is1024BitVector() : isExtended1024BitVector();
224 }
225
226 /// Return true if this is a 2048-bit vector type.
227 bool is2048BitVector() const {
228 return isSimple() ? V.is2048BitVector() : isExtended2048BitVector();
229 }
230
231 /// Return true if this is a capability type.
232 bool isCheriCapability() const {
233 return isSimple() ? V.isCheriCapability() : false;
234 }
235
236 /// Return true if this is an overloaded type for TableGen.
237 bool isOverloaded() const {
238 return (V == MVT::iAny || V == MVT::fAny || V == MVT::vAny ||
239 V == MVT::pAny);
240 }
241
242 /// Return true if the bit size is a multiple of 8.
243 bool isByteSized() const {
245 }
246
247 /// Return true if the size is a power-of-two number of bytes.
248 bool isRound() const {
249 if (isScalableVector())
250 return false;
251 unsigned BitSize = getSizeInBits();
252 return BitSize >= 8 && !(BitSize & (BitSize - 1));
253 }
254
255 /// Return true if this has the same number of bits as VT.
256 bool bitsEq(EVT VT) const {
257 if (EVT::operator==(VT)) return true;
258 return getSizeInBits() == VT.getSizeInBits();
259 }
260
261 /// Return true if we know at compile time this has more bits than VT.
262 bool knownBitsGT(EVT VT) const {
264 }
265
266 /// Return true if we know at compile time this has more than or the same
267 /// bits as VT.
268 bool knownBitsGE(EVT VT) const {
270 }
271
272 /// Return true if we know at compile time this has fewer bits than VT.
273 bool knownBitsLT(EVT VT) const {
275 }
276
277 /// Return true if we know at compile time this has fewer than or the same
278 /// bits as VT.
279 bool knownBitsLE(EVT VT) const {
281 }
282
283 /// Return true if this has more bits than VT.
284 bool bitsGT(EVT VT) const {
285 if (EVT::operator==(VT)) return false;
287 "Comparison between scalable and fixed types");
288 return knownBitsGT(VT);
289 }
290
291 /// Return true if this has no less bits than VT.
292 bool bitsGE(EVT VT) const {
293 if (EVT::operator==(VT)) return true;
295 "Comparison between scalable and fixed types");
296 return knownBitsGE(VT);
297 }
298
299 /// Return true if this has less bits than VT.
300 bool bitsLT(EVT VT) const {
301 if (EVT::operator==(VT)) return false;
303 "Comparison between scalable and fixed types");
304 return knownBitsLT(VT);
305 }
306
307 /// Return true if this has no more bits than VT.
308 bool bitsLE(EVT VT) const {
309 if (EVT::operator==(VT)) return true;
311 "Comparison between scalable and fixed types");
312 return knownBitsLE(VT);
313 }
314
315 /// Return the SimpleValueType held in the specified simple EVT.
316 MVT getSimpleVT() const {
317 assert(isSimple() && "Expected a SimpleValueType!");
318 return V;
319 }
320
321 /// If this is a vector type, return the element type, otherwise return
322 /// this.
324 return isVector() ? getVectorElementType() : *this;
325 }
326
327 /// Given a vector type, return the type of each element.
329 assert(isVector() && "Invalid vector type!");
330 if (isSimple())
331 return V.getVectorElementType();
332 return getExtendedVectorElementType();
333 }
334
335 /// Given a vector type, return the number of elements it contains.
336 unsigned getVectorNumElements() const {
337 assert(isVector() && "Invalid vector type!");
338
339 if (isScalableVector())
341 "Possible incorrect use of EVT::getVectorNumElements() for "
342 "scalable vector. Scalable flag may be dropped, use "
343 "EVT::getVectorElementCount() instead");
344
345 return isSimple() ? V.getVectorNumElements()
346 : getExtendedVectorNumElements();
347 }
348
349 // Given a (possibly scalable) vector type, return the ElementCount
351 assert((isVector()) && "Invalid vector type!");
352 if (isSimple())
353 return V.getVectorElementCount();
354
355 return getExtendedVectorElementCount();
356 }
357
358 /// Given a vector type, return the minimum number of elements it contains.
359 unsigned getVectorMinNumElements() const {
361 }
362
363 /// Given a RISCV vector tuple type, return the num_fields.
365 return V.getRISCVVectorTupleNumFields();
366 }
367
368 /// Return the size of the specified value type in bits.
369 ///
370 /// If the value type is a scalable vector type, the scalable property will
371 /// be set and the runtime size will be a positive integer multiple of the
372 /// base size.
374 if (isSimple())
375 return V.getSizeInBits();
376 return getExtendedSizeInBits();
377 }
378
379 /// Return the size of the specified fixed width value type in bits. The
380 /// function will assert if the type is scalable.
384
388
389 /// Return the number of bytes overwritten by a store of the specified value
390 /// type.
391 ///
392 /// If the value type is a scalable vector type, the scalable property will
393 /// be set and the runtime size will be a positive integer multiple of the
394 /// base size.
396 TypeSize BaseSize = getSizeInBits();
397 return {(BaseSize.getKnownMinValue() + 7) / 8, BaseSize.isScalable()};
398 }
399
400 // Return the number of bytes overwritten by a store of this value type or
401 // this value type's element type in the case of a vector.
405
406 /// Return the number of bits overwritten by a store of the specified value
407 /// type.
408 ///
409 /// If the value type is a scalable vector type, the scalable property will
410 /// be set and the runtime size will be a positive integer multiple of the
411 /// base size.
413 return getStoreSize() * 8;
414 }
415
416 /// Rounds the bit-width of the given integer EVT up to the nearest power of
417 /// two (and at least to eight), and returns the integer EVT with that
418 /// number of bits.
420 assert(isInteger() && !isVector() && "Invalid integer type!");
421 unsigned BitWidth = getSizeInBits();
422 if (BitWidth <= 8)
423 return EVT(MVT::i8);
424 return getIntegerVT(Context, llvm::bit_ceil(BitWidth));
425 }
426
427 /// Finds the smallest simple value type that is greater than or equal to
428 /// half the width of this EVT. If no simple value type can be found, an
429 /// extended integer value type of half the size (rounded up) is returned.
431 assert(isInteger() && !isVector() && "Invalid integer type!");
432 unsigned EVTSize = getSizeInBits();
433 for (unsigned IntVT = MVT::FIRST_INTEGER_VALUETYPE;
434 IntVT <= MVT::LAST_INTEGER_VALUETYPE; ++IntVT) {
435 EVT HalfVT = EVT((MVT::SimpleValueType)IntVT);
436 if (HalfVT.getSizeInBits() * 2 >= EVTSize)
437 return HalfVT;
438 }
439 return getIntegerVT(Context, (EVTSize + 1) / 2);
440 }
441
442 /// Return a VT for an integer vector type with the size of the
443 /// elements doubled. The typed returned may be an extended type.
445 EVT EltVT = getVectorElementType();
446 EltVT = EVT::getIntegerVT(Context, 2 * EltVT.getSizeInBits());
447 return EVT::getVectorVT(Context, EltVT, getVectorElementCount());
448 }
449
450 // Return a VT for a vector type with the same element type but
451 // half the number of elements. The type returned may be an
452 // extended type.
454 EVT EltVT = getVectorElementType();
455 auto EltCnt = getVectorElementCount();
456 assert(EltCnt.isKnownEven() && "Splitting vector, but not in half!");
457 return EVT::getVectorVT(Context, EltVT, EltCnt.divideCoefficientBy(2));
458 }
459
460 // Return a VT for a vector type with the same element type but
461 // double the number of elements. The type returned may be an
462 // extended type.
464 EVT EltVT = getVectorElementType();
465 auto EltCnt = getVectorElementCount();
466 return EVT::getVectorVT(Context, EltVT, EltCnt * 2);
467 }
468
469 /// Returns true if the given vector is a power of 2.
470 bool isPow2VectorType() const {
471 unsigned NElts = getVectorMinNumElements();
472 return !(NElts & (NElts - 1));
473 }
474
475 /// Widens the length of the given vector EVT up to the nearest power of 2
476 /// and returns that type.
478 if (!isPow2VectorType()) {
480 unsigned NewMinCount = 1 << Log2_32_Ceil(NElts.getKnownMinValue());
481 NElts = ElementCount::get(NewMinCount, NElts.isScalable());
482 return EVT::getVectorVT(Context, getVectorElementType(), NElts);
483 }
484 else {
485 return *this;
486 }
487 }
488
489 /// This function returns value type as a string, e.g. "i32".
490 LLVM_ABI std::string getEVTString() const;
491
492 /// Support for debugging, callable in GDB: VT.dump()
493 LLVM_ABI void dump() const;
494
495 /// Implement operator<<.
496 void print(raw_ostream &OS) const {
497 OS << getEVTString();
498 }
499
500 /// This method returns an LLVM type corresponding to the specified EVT.
501 /// For integer types, this returns an unsigned type. Note that this will
502 /// abort for types that cannot be represented.
503 LLVM_ABI Type *getTypeForEVT(LLVMContext &Context) const;
504
505 /// Return the value type corresponding to the specified type.
506 /// If HandleUnknown is true, unknown types are returned as Other,
507 /// otherwise they are invalid.
508 /// NB: This includes pointer types, which require a DataLayout to convert
509 /// to a concrete value type.
510 LLVM_ABI static EVT getEVT(Type *Ty, bool HandleUnknown = false);
511
512 intptr_t getRawBits() const {
513 if (isSimple())
514 return V.SimpleTy;
515 else
516 return (intptr_t)(LLVMTy);
517 }
518
519 /// A meaningless but well-behaved order, useful for constructing
520 /// containers.
522 bool operator()(EVT L, EVT R) const {
523 if (L.V.SimpleTy == R.V.SimpleTy)
524 return L.LLVMTy < R.LLVMTy;
525 else
526 return L.V.SimpleTy < R.V.SimpleTy;
527 }
528 };
529
530 /// Returns an APFloat semantics tag appropriate for the value type. If this
531 /// is a vector type, the element semantics are returned.
533
534 private:
535 // Methods for handling the Extended-type case in functions above.
536 // These are all out-of-line to prevent users of this header file
537 // from having a dependency on Type.h.
538 LLVM_ABI EVT changeExtendedTypeToInteger() const;
539 LLVM_ABI EVT changeExtendedVectorElementType(EVT EltVT) const;
540 LLVM_ABI EVT changeExtendedVectorElementTypeToInteger() const;
541 LLVM_ABI static EVT getExtendedIntegerVT(LLVMContext &C, unsigned BitWidth);
542 LLVM_ABI static EVT getExtendedVectorVT(LLVMContext &C, EVT VT,
543 unsigned NumElements,
544 bool IsScalable);
545 LLVM_ABI static EVT getExtendedVectorVT(LLVMContext &Context, EVT VT,
546 ElementCount EC);
547 LLVM_ABI bool isExtendedFloatingPoint() const LLVM_READONLY;
548 LLVM_ABI bool isExtendedInteger() const LLVM_READONLY;
549 LLVM_ABI bool isExtendedScalarInteger() const LLVM_READONLY;
550 LLVM_ABI bool isExtendedVector() const LLVM_READONLY;
551 LLVM_ABI bool isExtended16BitVector() const LLVM_READONLY;
552 LLVM_ABI bool isExtended32BitVector() const LLVM_READONLY;
553 LLVM_ABI bool isExtended64BitVector() const LLVM_READONLY;
554 LLVM_ABI bool isExtended128BitVector() const LLVM_READONLY;
555 LLVM_ABI bool isExtended256BitVector() const LLVM_READONLY;
556 LLVM_ABI bool isExtended512BitVector() const LLVM_READONLY;
557 LLVM_ABI bool isExtended1024BitVector() const LLVM_READONLY;
558 LLVM_ABI bool isExtended2048BitVector() const LLVM_READONLY;
559 LLVM_ABI bool isExtendedFixedLengthVector() const LLVM_READONLY;
560 LLVM_ABI bool isExtendedScalableVector() const LLVM_READONLY;
561 LLVM_ABI EVT getExtendedVectorElementType() const;
562 LLVM_ABI unsigned getExtendedVectorNumElements() const LLVM_READONLY;
563 LLVM_ABI ElementCount getExtendedVectorElementCount() const LLVM_READONLY;
564 LLVM_ABI TypeSize getExtendedSizeInBits() const LLVM_READONLY;
565 };
566
567 inline raw_ostream &operator<<(raw_ostream &OS, const EVT &V) {
568 V.print(OS);
569 return OS;
570 }
571} // end namespace llvm
572
573#endif // LLVM_CODEGEN_VALUETYPES_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
always inline
#define LLVM_ABI
Definition Compiler.h:213
#define LLVM_READONLY
Definition Compiler.h:322
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Machine Value Type.
static MVT getFloatingPointVT(unsigned BitWidth)
@ INVALID_SIMPLE_VALUE_TYPE
SimpleValueType SimpleTy
MVT changeVectorElementType(MVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
MVT changeTypeToInteger()
Return the type converted to an equivalently sized integer or vector with integer element type.
static MVT getVectorVT(MVT VT, unsigned NumElements)
static MVT getIntegerVT(unsigned BitWidth)
MVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition TypeSize.h:181
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:216
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
constexpr bool isZero() const
Definition TypeSize.h:154
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:223
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:355
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
Definition bit.h:295
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
Definition Error.cpp:177
constexpr unsigned BitWidth
A meaningless but well-behaved order, useful for constructing containers.
Definition ValueTypes.h:521
bool operator()(EVT L, EVT R) const
Definition ValueTypes.h:522
Extended Value Type.
Definition ValueTypes.h:35
EVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
Definition ValueTypes.h:94
constexpr EVT()=default
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:395
EVT getPow2VectorType(LLVMContext &Context) const
Widens the length of the given vector EVT up to the nearest power of 2 and returns that type.
Definition ValueTypes.h:477
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:137
constexpr EVT(MVT::SimpleValueType SVT)
Definition ValueTypes.h:42
intptr_t getRawBits() const
Definition ValueTypes.h:512
bool knownBitsLE(EVT VT) const
Return true if we know at compile time this has fewer than or the same bits as VT.
Definition ValueTypes.h:279
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:74
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:121
uint64_t getScalarStoreSize() const
Definition ValueTypes.h:402
bool isOverloaded() const
Return true if this is an overloaded type for TableGen.
Definition ValueTypes.h:237
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:284
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:300
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:147
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
EVT getDoubleNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:463
bool is32BitVector() const
Return true if this is a 32-bit vector type.
Definition ValueTypes.h:197
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
bool isByteSized() const
Return true if the bit size is a multiple of 8.
Definition ValueTypes.h:243
bool isCheriCapability() const
Return true if this is a capability type.
Definition ValueTypes.h:232
EVT changeElementType(EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:113
bool is1024BitVector() const
Return true if this is a 1024-bit vector type.
Definition ValueTypes.h:222
bool knownBitsGT(EVT VT) const
Return true if we know at compile time this has more bits than VT.
Definition ValueTypes.h:262
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:359
unsigned getRISCVVectorTupleNumFields() const
Given a RISCV vector tuple type, return the num_fields.
Definition ValueTypes.h:364
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:385
EVT getHalfSizedIntegerVT(LLVMContext &Context) const
Finds the smallest simple value type that is greater than or equal to half the width of this EVT.
Definition ValueTypes.h:430
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
Definition ValueTypes.h:470
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
Definition ValueTypes.h:412
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
LLVM_ABI void dump() const
Support for debugging, callable in GDB: VT.dump()
constexpr EVT(MVT S)
Definition ValueTypes.h:43
bool is128BitVector() const
Return true if this is a 128-bit vector type.
Definition ValueTypes.h:207
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool is2048BitVector() const
Return true if this is a 2048-bit vector type.
Definition ValueTypes.h:227
bool isRISCVVectorTuple() const
Return true if this is a vector value type.
Definition ValueTypes.h:179
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:381
EVT widenIntegerVectorElementType(LLVMContext &Context) const
Return a VT for an integer vector type with the size of the elements doubled.
Definition ValueTypes.h:444
bool knownBitsLT(EVT VT) const
Return true if we know at compile time this has fewer bits than VT.
Definition ValueTypes.h:273
bool isScalableVT() const
Return true if the type is a scalable type.
Definition ValueTypes.h:187
bool is512BitVector() const
Return true if this is a 512-bit vector type.
Definition ValueTypes.h:217
bool isFixedLengthVector() const
Definition ValueTypes.h:181
LLVM_ABI std::string getEVTString() const
This function returns value type as a string, e.g. "i32".
static EVT getFloatingPointVT(unsigned BitWidth)
Returns the EVT that represents a floating-point type with the given number of bits.
Definition ValueTypes.h:59
bool operator!=(EVT VT) const
Definition ValueTypes.h:48
EVT getRoundIntegerType(LLVMContext &Context) const
Rounds the bit-width of the given integer EVT up to the nearest power of two (and at least to eight),...
Definition ValueTypes.h:419
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
bool is16BitVector() const
Return true if this is a 16-bit vector type.
Definition ValueTypes.h:192
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:292
bool is256BitVector() const
Return true if this is a 256-bit vector type.
Definition ValueTypes.h:212
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:256
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isRound() const
Return true if the size is a power-of-two number of bytes.
Definition ValueTypes.h:248
static EVT getVectorVT(LLVMContext &Context, EVT VT, ElementCount EC)
Returns the EVT that represents a vector EC.Min elements in length, where each element is of type VT.
Definition ValueTypes.h:84
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:174
bool knownBitsGE(EVT VT) const
Return true if we know at compile time this has more than or the same bits as VT.
Definition ValueTypes.h:268
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:142
void print(raw_ostream &OS) const
Implement operator<<.
Definition ValueTypes.h:496
bool isScalableTargetExtVT() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:163
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
EVT changeVectorElementType(EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:102
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:336
bool operator==(EVT VT) const
Definition ValueTypes.h:45
bool isZeroSized() const
Test if the given EVT has zero size, this will fail if called on a scalable type.
Definition ValueTypes.h:132
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:308
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:453
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
bool is64BitVector() const
Return true if this is a 64-bit vector type.
Definition ValueTypes.h:202