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 18 #include "llvm/Support/Compiler.h" 19 #include "llvm/Support/MachineValueType.h" 20 #include "llvm/Support/MathExtras.h" 21 #include "llvm/Support/TypeSize.h" 22 #include "llvm/Support/WithColor.h" 23 #include <cassert> 24 #include <cstdint> 25 #include <string> 26 27 namespace llvm { 28 29 class LLVMContext; 30 class Type; 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: 37 MVT V = MVT::INVALID_SIMPLE_VALUE_TYPE; 38 Type *LLVMTy = nullptr; 39 40 public: 41 constexpr EVT() = default; EVTEVT42 constexpr EVT(MVT::SimpleValueType SVT) : V(SVT) {} EVTEVT43 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. getFloatingPointVTEVT59 static EVT getFloatingPointVT(unsigned BitWidth) { 60 return MVT::getFloatingPointVT(BitWidth); 61 } 62 63 /// Returns the EVT that represents an integer with the given number of 64 /// bits. getIntegerVTEVT65 static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth) { 66 MVT M = MVT::getIntegerVT(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. getVectorVTEVT84 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. changeVectorElementTypeToIntegerEVT94 EVT changeVectorElementTypeToInteger() const { 95 if (isSimple()) 96 return getSimpleVT().changeVectorElementTypeToInteger(); 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. changeVectorElementTypeEVT102 EVT changeVectorElementType(EVT EltVT) const { 103 if (isSimple()) { 104 assert(EltVT.isSimple() && 105 "Can't change simple vector VT to have extended element VT"); 106 return getSimpleVT().changeVectorElementType(EltVT.getSimpleVT()); 107 } 108 return changeExtendedVectorElementType(EltVT); 109 } 110 111 /// Return the type converted to an equivalently sized integer or vector 112 /// with integer element type. Similar to changeVectorElementTypeToInteger, 113 /// but also handles scalars. changeTypeToIntegerEVT114 EVT changeTypeToInteger() { 115 if (isVector()) 116 return changeVectorElementTypeToInteger(); 117 118 if (isSimple()) 119 return getSimpleVT().changeTypeToInteger(); 120 return changeExtendedTypeToInteger(); 121 } 122 123 /// Test if the given EVT is simple (as opposed to being extended). isSimpleEVT124 bool isSimple() const { 125 return V.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE; 126 } 127 128 /// Test if the given EVT is extended (as opposed to being simple). isExtendedEVT129 bool isExtended() const { 130 return !isSimple(); 131 } 132 133 /// Return true if this is a FP or a vector FP type. isFloatingPointEVT134 bool isFloatingPoint() const { 135 return isSimple() ? V.isFloatingPoint() : isExtendedFloatingPoint(); 136 } 137 138 /// Return true if this is an integer or a vector integer type. isIntegerEVT139 bool isInteger() const { 140 return isSimple() ? V.isInteger() : isExtendedInteger(); 141 } 142 143 /// Return true if this is an integer, but not a vector. isScalarIntegerEVT144 bool isScalarInteger() const { 145 return isSimple() ? V.isScalarInteger() : isExtendedScalarInteger(); 146 } 147 148 /// Return true if this is a vector value type. isVectorEVT149 bool isVector() const { 150 return isSimple() ? V.isVector() : isExtendedVector(); 151 } 152 153 /// Return true if this is a vector type where the runtime 154 /// length is machine dependent isScalableVectorEVT155 bool isScalableVector() const { 156 return isSimple() ? V.isScalableVector() : isExtendedScalableVector(); 157 } 158 isFixedLengthVectorEVT159 bool isFixedLengthVector() const { 160 return isSimple() ? V.isFixedLengthVector() 161 : isExtendedFixedLengthVector(); 162 } 163 164 /// Return true if this is a 16-bit vector type. is16BitVectorEVT165 bool is16BitVector() const { 166 return isSimple() ? V.is16BitVector() : isExtended16BitVector(); 167 } 168 169 /// Return true if this is a 32-bit vector type. is32BitVectorEVT170 bool is32BitVector() const { 171 return isSimple() ? V.is32BitVector() : isExtended32BitVector(); 172 } 173 174 /// Return true if this is a 64-bit vector type. is64BitVectorEVT175 bool is64BitVector() const { 176 return isSimple() ? V.is64BitVector() : isExtended64BitVector(); 177 } 178 179 /// Return true if this is a 128-bit vector type. is128BitVectorEVT180 bool is128BitVector() const { 181 return isSimple() ? V.is128BitVector() : isExtended128BitVector(); 182 } 183 184 /// Return true if this is a 256-bit vector type. is256BitVectorEVT185 bool is256BitVector() const { 186 return isSimple() ? V.is256BitVector() : isExtended256BitVector(); 187 } 188 189 /// Return true if this is a 512-bit vector type. is512BitVectorEVT190 bool is512BitVector() const { 191 return isSimple() ? V.is512BitVector() : isExtended512BitVector(); 192 } 193 194 /// Return true if this is a 1024-bit vector type. is1024BitVectorEVT195 bool is1024BitVector() const { 196 return isSimple() ? V.is1024BitVector() : isExtended1024BitVector(); 197 } 198 199 /// Return true if this is a 2048-bit vector type. is2048BitVectorEVT200 bool is2048BitVector() const { 201 return isSimple() ? V.is2048BitVector() : isExtended2048BitVector(); 202 } 203 204 /// Return true if this is an overloaded type for TableGen. isOverloadedEVT205 bool isOverloaded() const { 206 return (V==MVT::iAny || V==MVT::fAny || V==MVT::vAny || V==MVT::iPTRAny); 207 } 208 209 /// Return true if the bit size is a multiple of 8. isByteSizedEVT210 bool isByteSized() const { return getSizeInBits().isKnownMultipleOf(8); } 211 212 /// Return true if the size is a power-of-two number of bytes. isRoundEVT213 bool isRound() const { 214 if (isScalableVector()) 215 return false; 216 unsigned BitSize = getSizeInBits(); 217 return BitSize >= 8 && !(BitSize & (BitSize - 1)); 218 } 219 220 /// Return true if this has the same number of bits as VT. bitsEqEVT221 bool bitsEq(EVT VT) const { 222 if (EVT::operator==(VT)) return true; 223 return getSizeInBits() == VT.getSizeInBits(); 224 } 225 226 /// Return true if we know at compile time this has more bits than VT. knownBitsGTEVT227 bool knownBitsGT(EVT VT) const { 228 return TypeSize::isKnownGT(getSizeInBits(), VT.getSizeInBits()); 229 } 230 231 /// Return true if we know at compile time this has more than or the same 232 /// bits as VT. knownBitsGEEVT233 bool knownBitsGE(EVT VT) const { 234 return TypeSize::isKnownGE(getSizeInBits(), VT.getSizeInBits()); 235 } 236 237 /// Return true if we know at compile time this has fewer bits than VT. knownBitsLTEVT238 bool knownBitsLT(EVT VT) const { 239 return TypeSize::isKnownLT(getSizeInBits(), VT.getSizeInBits()); 240 } 241 242 /// Return true if we know at compile time this has fewer than or the same 243 /// bits as VT. knownBitsLEEVT244 bool knownBitsLE(EVT VT) const { 245 return TypeSize::isKnownLE(getSizeInBits(), VT.getSizeInBits()); 246 } 247 248 /// Return true if this has more bits than VT. bitsGTEVT249 bool bitsGT(EVT VT) const { 250 if (EVT::operator==(VT)) return false; 251 assert(isScalableVector() == VT.isScalableVector() && 252 "Comparison between scalable and fixed types"); 253 return knownBitsGT(VT); 254 } 255 256 /// Return true if this has no less bits than VT. bitsGEEVT257 bool bitsGE(EVT VT) const { 258 if (EVT::operator==(VT)) return true; 259 assert(isScalableVector() == VT.isScalableVector() && 260 "Comparison between scalable and fixed types"); 261 return knownBitsGE(VT); 262 } 263 264 /// Return true if this has less bits than VT. bitsLTEVT265 bool bitsLT(EVT VT) const { 266 if (EVT::operator==(VT)) return false; 267 assert(isScalableVector() == VT.isScalableVector() && 268 "Comparison between scalable and fixed types"); 269 return knownBitsLT(VT); 270 } 271 272 /// Return true if this has no more bits than VT. bitsLEEVT273 bool bitsLE(EVT VT) const { 274 if (EVT::operator==(VT)) return true; 275 assert(isScalableVector() == VT.isScalableVector() && 276 "Comparison between scalable and fixed types"); 277 return knownBitsLE(VT); 278 } 279 280 /// Return the SimpleValueType held in the specified simple EVT. getSimpleVTEVT281 MVT getSimpleVT() const { 282 assert(isSimple() && "Expected a SimpleValueType!"); 283 return V; 284 } 285 286 /// If this is a vector type, return the element type, otherwise return 287 /// this. getScalarTypeEVT288 EVT getScalarType() const { 289 return isVector() ? getVectorElementType() : *this; 290 } 291 292 /// Given a vector type, return the type of each element. getVectorElementTypeEVT293 EVT getVectorElementType() const { 294 assert(isVector() && "Invalid vector type!"); 295 if (isSimple()) 296 return V.getVectorElementType(); 297 return getExtendedVectorElementType(); 298 } 299 300 /// Given a vector type, return the number of elements it contains. getVectorNumElementsEVT301 unsigned getVectorNumElements() const { 302 assert(isVector() && "Invalid vector type!"); 303 304 if (isScalableVector()) 305 llvm::reportInvalidSizeRequest( 306 "Possible incorrect use of EVT::getVectorNumElements() for " 307 "scalable vector. Scalable flag may be dropped, use " 308 "EVT::getVectorElementCount() instead"); 309 310 return isSimple() ? V.getVectorNumElements() 311 : getExtendedVectorNumElements(); 312 } 313 314 // Given a (possibly scalable) vector type, return the ElementCount getVectorElementCountEVT315 ElementCount getVectorElementCount() const { 316 assert((isVector()) && "Invalid vector type!"); 317 if (isSimple()) 318 return V.getVectorElementCount(); 319 320 return getExtendedVectorElementCount(); 321 } 322 323 /// Given a vector type, return the minimum number of elements it contains. getVectorMinNumElementsEVT324 unsigned getVectorMinNumElements() const { 325 return getVectorElementCount().getKnownMinValue(); 326 } 327 328 /// Return the size of the specified value type in bits. 329 /// 330 /// If the value type is a scalable vector type, the scalable property will 331 /// be set and the runtime size will be a positive integer multiple of the 332 /// base size. getSizeInBitsEVT333 TypeSize getSizeInBits() const { 334 if (isSimple()) 335 return V.getSizeInBits(); 336 return getExtendedSizeInBits(); 337 } 338 339 /// Return the size of the specified fixed width value type in bits. The 340 /// function will assert if the type is scalable. getFixedSizeInBitsEVT341 uint64_t getFixedSizeInBits() const { 342 return getSizeInBits().getFixedSize(); 343 } 344 getScalarSizeInBitsEVT345 uint64_t getScalarSizeInBits() const { 346 return getScalarType().getSizeInBits().getFixedSize(); 347 } 348 349 /// Return the number of bytes overwritten by a store of the specified value 350 /// type. 351 /// 352 /// If the value type is a scalable vector type, the scalable property will 353 /// be set and the runtime size will be a positive integer multiple of the 354 /// base size. getStoreSizeEVT355 TypeSize getStoreSize() const { 356 TypeSize BaseSize = getSizeInBits(); 357 return {(BaseSize.getKnownMinSize() + 7) / 8, BaseSize.isScalable()}; 358 } 359 360 /// Return the number of bits overwritten by a store of the specified value 361 /// type. 362 /// 363 /// If the value type is a scalable vector type, the scalable property will 364 /// be set and the runtime size will be a positive integer multiple of the 365 /// base size. getStoreSizeInBitsEVT366 TypeSize getStoreSizeInBits() const { 367 return getStoreSize() * 8; 368 } 369 370 /// Rounds the bit-width of the given integer EVT up to the nearest power of 371 /// two (and at least to eight), and returns the integer EVT with that 372 /// number of bits. getRoundIntegerTypeEVT373 EVT getRoundIntegerType(LLVMContext &Context) const { 374 assert(isInteger() && !isVector() && "Invalid integer type!"); 375 unsigned BitWidth = getSizeInBits(); 376 if (BitWidth <= 8) 377 return EVT(MVT::i8); 378 return getIntegerVT(Context, 1 << Log2_32_Ceil(BitWidth)); 379 } 380 381 /// Finds the smallest simple value type that is greater than or equal to 382 /// half the width of this EVT. If no simple value type can be found, an 383 /// extended integer value type of half the size (rounded up) is returned. getHalfSizedIntegerVTEVT384 EVT getHalfSizedIntegerVT(LLVMContext &Context) const { 385 assert(isInteger() && !isVector() && "Invalid integer type!"); 386 unsigned EVTSize = getSizeInBits(); 387 for (unsigned IntVT = MVT::FIRST_INTEGER_VALUETYPE; 388 IntVT <= MVT::LAST_INTEGER_VALUETYPE; ++IntVT) { 389 EVT HalfVT = EVT((MVT::SimpleValueType)IntVT); 390 if (HalfVT.getSizeInBits() * 2 >= EVTSize) 391 return HalfVT; 392 } 393 return getIntegerVT(Context, (EVTSize + 1) / 2); 394 } 395 396 /// Return a VT for an integer vector type with the size of the 397 /// elements doubled. The typed returned may be an extended type. widenIntegerVectorElementTypeEVT398 EVT widenIntegerVectorElementType(LLVMContext &Context) const { 399 EVT EltVT = getVectorElementType(); 400 EltVT = EVT::getIntegerVT(Context, 2 * EltVT.getSizeInBits()); 401 return EVT::getVectorVT(Context, EltVT, getVectorElementCount()); 402 } 403 404 // Return a VT for a vector type with the same element type but 405 // half the number of elements. The type returned may be an 406 // extended type. getHalfNumVectorElementsVTEVT407 EVT getHalfNumVectorElementsVT(LLVMContext &Context) const { 408 EVT EltVT = getVectorElementType(); 409 auto EltCnt = getVectorElementCount(); 410 assert(EltCnt.isKnownEven() && "Splitting vector, but not in half!"); 411 return EVT::getVectorVT(Context, EltVT, EltCnt.divideCoefficientBy(2)); 412 } 413 414 // Return a VT for a vector type with the same element type but 415 // double the number of elements. The type returned may be an 416 // extended type. getDoubleNumVectorElementsVTEVT417 EVT getDoubleNumVectorElementsVT(LLVMContext &Context) const { 418 EVT EltVT = getVectorElementType(); 419 auto EltCnt = getVectorElementCount(); 420 return EVT::getVectorVT(Context, EltVT, EltCnt * 2); 421 } 422 423 /// Returns true if the given vector is a power of 2. isPow2VectorTypeEVT424 bool isPow2VectorType() const { 425 unsigned NElts = getVectorMinNumElements(); 426 return !(NElts & (NElts - 1)); 427 } 428 429 /// Widens the length of the given vector EVT up to the nearest power of 2 430 /// and returns that type. getPow2VectorTypeEVT431 EVT getPow2VectorType(LLVMContext &Context) const { 432 if (!isPow2VectorType()) { 433 ElementCount NElts = getVectorElementCount(); 434 unsigned NewMinCount = 1 << Log2_32_Ceil(NElts.getKnownMinValue()); 435 NElts = ElementCount::get(NewMinCount, NElts.isScalable()); 436 return EVT::getVectorVT(Context, getVectorElementType(), NElts); 437 } 438 else { 439 return *this; 440 } 441 } 442 443 /// This function returns value type as a string, e.g. "i32". 444 std::string getEVTString() const; 445 446 /// This method returns an LLVM type corresponding to the specified EVT. 447 /// For integer types, this returns an unsigned type. Note that this will 448 /// abort for types that cannot be represented. 449 Type *getTypeForEVT(LLVMContext &Context) const; 450 451 /// Return the value type corresponding to the specified type. 452 /// This returns all pointers as iPTR. If HandleUnknown is true, unknown 453 /// types are returned as Other, otherwise they are invalid. 454 static EVT getEVT(Type *Ty, bool HandleUnknown = false); 455 getRawBitsEVT456 intptr_t getRawBits() const { 457 if (isSimple()) 458 return V.SimpleTy; 459 else 460 return (intptr_t)(LLVMTy); 461 } 462 463 /// A meaningless but well-behaved order, useful for constructing 464 /// containers. 465 struct compareRawBits { operatorEVT::compareRawBits466 bool operator()(EVT L, EVT R) const { 467 if (L.V.SimpleTy == R.V.SimpleTy) 468 return L.LLVMTy < R.LLVMTy; 469 else 470 return L.V.SimpleTy < R.V.SimpleTy; 471 } 472 }; 473 474 private: 475 // Methods for handling the Extended-type case in functions above. 476 // These are all out-of-line to prevent users of this header file 477 // from having a dependency on Type.h. 478 EVT changeExtendedTypeToInteger() const; 479 EVT changeExtendedVectorElementType(EVT EltVT) const; 480 EVT changeExtendedVectorElementTypeToInteger() const; 481 static EVT getExtendedIntegerVT(LLVMContext &C, unsigned BitWidth); 482 static EVT getExtendedVectorVT(LLVMContext &C, EVT VT, unsigned NumElements, 483 bool IsScalable); 484 static EVT getExtendedVectorVT(LLVMContext &Context, EVT VT, 485 ElementCount EC); 486 bool isExtendedFloatingPoint() const LLVM_READONLY; 487 bool isExtendedInteger() const LLVM_READONLY; 488 bool isExtendedScalarInteger() const LLVM_READONLY; 489 bool isExtendedVector() const LLVM_READONLY; 490 bool isExtended16BitVector() const LLVM_READONLY; 491 bool isExtended32BitVector() const LLVM_READONLY; 492 bool isExtended64BitVector() const LLVM_READONLY; 493 bool isExtended128BitVector() const LLVM_READONLY; 494 bool isExtended256BitVector() const LLVM_READONLY; 495 bool isExtended512BitVector() const LLVM_READONLY; 496 bool isExtended1024BitVector() const LLVM_READONLY; 497 bool isExtended2048BitVector() const LLVM_READONLY; 498 bool isExtendedFixedLengthVector() const LLVM_READONLY; 499 bool isExtendedScalableVector() const LLVM_READONLY; 500 EVT getExtendedVectorElementType() const; 501 unsigned getExtendedVectorNumElements() const LLVM_READONLY; 502 ElementCount getExtendedVectorElementCount() const LLVM_READONLY; 503 TypeSize getExtendedSizeInBits() const LLVM_READONLY; 504 }; 505 506 } // end namespace llvm 507 508 #endif // LLVM_CODEGEN_VALUETYPES_H 509