26#ifndef LLVM_CODEGEN_LOWLEVELTYPE_H
27#define LLVM_CODEGEN_LOWLEVELTYPE_H
43 return LLT{
false,
false,
true,
50 assert(SizeInBits > 0 &&
"invalid pointer size");
51 return LLT{
true,
false,
false,
57 assert(!EC.isScalar() &&
"invalid number of vector elements");
58 return LLT{
false,
true,
false,
59 EC, ScalarSizeInBits, 0};
64 assert(!EC.isScalar() &&
"invalid number of vector elements");
93 unsigned ScalarSizeInBits) {
106 unsigned ScalarSizeInBits) {
117 return EC.isScalar() ? ScalarTy :
LLT::vector(EC, ScalarTy);
121 assert(ScalarSize <= std::numeric_limits<unsigned>::max() &&
122 "Not enough bits in LLT to represent size");
137 constexpr bool isValid()
const {
return IsScalar || RawData != 0; }
139 constexpr bool isScalar()
const {
return IsScalar; }
142 return isValid() && IsPointer && !IsVector;
152 "Possible incorrect use of LLT::getNumElements() for "
153 "scalable vector. Scalable flag may be dropped, use "
154 "LLT::getElementCount() instead");
162 return IsPointer ? getFieldValue(PointerVectorScalableFieldInfo)
163 : getFieldValue(VectorScalableFieldInfo);
167 assert(IsVector &&
"cannot get number of elements on scalar/aggregate");
169 ? getFieldValue(PointerVectorElementsFieldInfo)
170 : getFieldValue(VectorElementsFieldInfo),
205 "invalid to directly change element size for pointers");
222 "cannot divide scalar of size zero");
251 return getFieldValue(ScalarSizeFieldInfo);
254 return getFieldValue(VectorSizeFieldInfo);
256 return getFieldValue(PointerVectorSizeFieldInfo);
258 assert(IsPointer &&
"unexpected LLT");
259 return getFieldValue(PointerSizeFieldInfo);
263 assert(RawData != 0 &&
"Invalid Type");
264 assert(IsPointer &&
"cannot get address space of non-pointer type");
266 return getFieldValue(PointerAddressSpaceFieldInfo);
268 return getFieldValue(PointerVectorAddressSpaceFieldInfo);
273 assert(
isVector() &&
"cannot get element type of scalar/aggregate");
282#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
287 return IsPointer ==
RHS.IsPointer && IsVector ==
RHS.IsVector &&
288 IsScalar ==
RHS.IsScalar &&
RHS.RawData == RawData;
307 typedef int BitFieldInfo[2];
315 static const constexpr BitFieldInfo ScalarSizeFieldInfo{32, 0};
319 static const constexpr BitFieldInfo PointerSizeFieldInfo{16, 0};
320 static const constexpr BitFieldInfo PointerAddressSpaceFieldInfo{
321 24, PointerSizeFieldInfo[0] + PointerSizeFieldInfo[1]};
322 static_assert((PointerAddressSpaceFieldInfo[0] +
323 PointerAddressSpaceFieldInfo[1]) <= 61,
324 "Insufficient bits to encode all data");
329 static const constexpr BitFieldInfo VectorElementsFieldInfo{16, 0};
330 static const constexpr BitFieldInfo VectorSizeFieldInfo{
331 32, VectorElementsFieldInfo[0] + VectorElementsFieldInfo[1]};
332 static const constexpr BitFieldInfo VectorScalableFieldInfo{
333 1, VectorSizeFieldInfo[0] + VectorSizeFieldInfo[1]};
334 static_assert((VectorSizeFieldInfo[0] + VectorSizeFieldInfo[1]) <= 61,
335 "Insufficient bits to encode all data");
341 static const constexpr BitFieldInfo PointerVectorElementsFieldInfo{16, 0};
342 static const constexpr BitFieldInfo PointerVectorSizeFieldInfo{
344 PointerVectorElementsFieldInfo[1] + PointerVectorElementsFieldInfo[0]};
345 static const constexpr BitFieldInfo PointerVectorAddressSpaceFieldInfo{
346 24, PointerVectorSizeFieldInfo[1] + PointerVectorSizeFieldInfo[0]};
347 static const constexpr BitFieldInfo PointerVectorScalableFieldInfo{
348 1, PointerVectorAddressSpaceFieldInfo[0] +
349 PointerVectorAddressSpaceFieldInfo[1]};
350 static_assert((PointerVectorAddressSpaceFieldInfo[0] +
351 PointerVectorAddressSpaceFieldInfo[1]) <= 61,
352 "Insufficient bits to encode all data");
359 static constexpr uint64_t getMask(
const BitFieldInfo FieldInfo) {
360 const int FieldSizeInBits = FieldInfo[0];
361 return (((
uint64_t)1) << FieldSizeInBits) - 1;
365 assert(Val <= Mask &&
"Value too large for field");
366 return (Val & Mask) << Shift;
369 const BitFieldInfo FieldInfo) {
370 return maskAndShift(Val, getMask(FieldInfo), FieldInfo[1]);
373 constexpr uint64_t getFieldValue(
const BitFieldInfo FieldInfo)
const {
374 return getMask(FieldInfo) & (RawData >> FieldInfo[1]);
377 constexpr void init(
bool IsPointer,
bool IsVector,
bool IsScalar,
378 ElementCount EC,
uint64_t SizeInBits,
380 assert(SizeInBits <= std::numeric_limits<unsigned>::max() &&
381 "Not enough bits in LLT to represent size");
383 this->IsVector = IsVector;
384 this->IsScalar = IsScalar;
386 RawData = maskAndShift(SizeInBits, ScalarSizeFieldInfo);
388 assert(
EC.isVector() &&
"invalid number of vector elements");
391 maskAndShift(
EC.getKnownMinValue(), VectorElementsFieldInfo) |
392 maskAndShift(SizeInBits, VectorSizeFieldInfo) |
393 maskAndShift(
EC.isScalable() ? 1 : 0, VectorScalableFieldInfo);
396 maskAndShift(
EC.getKnownMinValue(),
397 PointerVectorElementsFieldInfo) |
398 maskAndShift(SizeInBits, PointerVectorSizeFieldInfo) |
399 maskAndShift(
AddressSpace, PointerVectorAddressSpaceFieldInfo) |
400 maskAndShift(
EC.isScalable() ? 1 : 0,
401 PointerVectorScalableFieldInfo);
402 }
else if (IsPointer)
403 RawData = maskAndShift(SizeInBits, PointerSizeFieldInfo) |
404 maskAndShift(
AddressSpace, PointerAddressSpaceFieldInfo);
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file defines DenseMapInfo traits for DenseMap.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static constexpr ElementCount getScalable(ScalarTy MinVal)
static constexpr ElementCount getFixed(ScalarTy MinVal)
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
static constexpr LLT float64()
Get a 64-bit IEEE double value.
void print(raw_ostream &OS) const
static constexpr LLT scalarOrVector(ElementCount EC, uint64_t ScalarSize)
constexpr unsigned getScalarSizeInBits() const
constexpr LLT(bool isPointer, bool isVector, bool isScalar, ElementCount EC, uint64_t SizeInBits, unsigned AddressSpace)
constexpr bool isScalar() const
static constexpr LLT scalable_vector(unsigned MinNumElements, unsigned ScalarSizeInBits)
Get a low-level scalable vector of some number of elements and element width.
constexpr bool operator==(const LLT &RHS) const
constexpr LLT changeElementType(LLT NewEltTy) const
If this type is a vector, return a vector with the same number of elements but the new element type.
constexpr LLT multiplyElements(int Factor) const
Produce a vector type that is Factor times bigger, preserving the element type.
static constexpr LLT vector(ElementCount EC, unsigned ScalarSizeInBits)
Get a low-level vector of some number of elements and element width.
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
constexpr bool isValid() const
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
constexpr bool operator!=(const LLT &RHS) const
constexpr bool isVector() const
static constexpr LLT pointer(unsigned AddressSpace, unsigned SizeInBits)
Get a low-level pointer in the given address space.
constexpr bool isScalable() const
Returns true if the LLT is a scalable vector.
constexpr uint64_t getUniqueRAWLLTData() const
constexpr bool isByteSized() const
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
constexpr bool isPointer() const
constexpr LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
static constexpr LLT vector(ElementCount EC, LLT ScalarTy)
Get a low-level vector of some number of elements and element type.
constexpr ElementCount getElementCount() const
constexpr LLT changeElementSize(unsigned NewEltSize) const
If this type is a vector, return a vector with the same number of elements but the new element size.
static constexpr LLT fixed_vector(unsigned NumElements, LLT ScalarTy)
Get a low-level fixed-width vector of some number of elements and element type.
static constexpr LLT float16()
Get a 16-bit IEEE half value.
constexpr unsigned getAddressSpace() const
static constexpr LLT fixed_vector(unsigned NumElements, unsigned ScalarSizeInBits)
Get a low-level fixed-width vector of some number of elements and element width.
constexpr LLT changeElementCount(ElementCount EC) const
Return a vector or scalar with the same element type and the new element count.
LLVM_DUMP_METHOD void dump() const
constexpr LLT getScalarType() const
constexpr TypeSize getSizeInBytes() const
Returns the total size of the type in bytes, i.e.
static constexpr LLT scalable_vector(unsigned MinNumElements, LLT ScalarTy)
Get a low-level scalable vector of some number of elements and element type.
static constexpr LLT scalarOrVector(ElementCount EC, LLT ScalarTy)
static constexpr LLT float32()
Get a 32-bit IEEE float value.
constexpr LLT divide(int Factor) const
Return a type that is Factor times smaller.
static constexpr TypeSize Fixed(ScalarTy ExactSize)
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...
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
void reportInvalidSizeRequest(const char *Msg)
Reports a diagnostic message to indicate an invalid size request has been done on a scalable vector.
@ Invalid
Denotes invalid value.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
static LLT getTombstoneKey()
static bool isEqual(const LLT &LHS, const LLT &RHS)
static unsigned getHashValue(const LLT &Ty)
An information struct used to provide DenseMap with the various necessary components for a given valu...