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