14#ifndef LLVM_ANALYSIS_TARGETTRANSFORMINFOIMPL_H
15#define LLVM_ANALYSIS_TARGETTRANSFORMINFOIMPL_H
58 Type *AccessType)
const {
82 return SI.getNumCases();
162 virtual std::pair<KnownBits, KnownBits>
166 "expected pointer or pointer vector type");
169 if (
DL.isNonIntegralAddressSpace(FromAS))
170 return std::pair(
KnownBits(
DL.getPointerSizeInBits(FromAS)),
176 CastI->getDestAddressSpace(), *CastI->getPointerOperand());
177 FromPtrBits = KB.second;
185 return {FromPtrBits, ToPtrBits};
191 unsigned ToASBitSize =
DL.getPointerSizeInBits(ToAS);
193 if (
DL.isNonIntegralAddressSpace(FromAS))
203 unsigned DstAS)
const {
204 return {
DL.getPointerSizeInBits(SrcAS), 0};
214 virtual std::pair<const Value *, unsigned>
216 return std::make_pair(
nullptr, -1);
226 assert(
F &&
"A concrete function must be provided to this routine.");
233 if (
F->isIntrinsic())
236 if (
F->hasLocalLinkage() || !
F->hasName())
243 if (Name ==
"copysign" || Name ==
"copysignf" || Name ==
"copysignl" ||
244 Name ==
"fabs" || Name ==
"fabsf" || Name ==
"fabsl" ||
245 Name ==
"fmin" || Name ==
"fminf" || Name ==
"fminl" ||
246 Name ==
"fmax" || Name ==
"fmaxf" || Name ==
"fmaxl" ||
247 Name ==
"sin" || Name ==
"sinf" || Name ==
"sinl" ||
248 Name ==
"cos" || Name ==
"cosf" || Name ==
"cosl" ||
249 Name ==
"tan" || Name ==
"tanf" || Name ==
"tanl" ||
250 Name ==
"asin" || Name ==
"asinf" || Name ==
"asinl" ||
251 Name ==
"acos" || Name ==
"acosf" || Name ==
"acosl" ||
252 Name ==
"atan" || Name ==
"atanf" || Name ==
"atanl" ||
253 Name ==
"atan2" || Name ==
"atan2f" || Name ==
"atan2l"||
254 Name ==
"sinh" || Name ==
"sinhf" || Name ==
"sinhl" ||
255 Name ==
"cosh" || Name ==
"coshf" || Name ==
"coshl" ||
256 Name ==
"tanh" || Name ==
"tanhf" || Name ==
"tanhl" ||
257 Name ==
"sqrt" || Name ==
"sqrtf" || Name ==
"sqrtl" ||
258 Name ==
"exp10" || Name ==
"exp10l" || Name ==
"exp10f")
262 if (Name ==
"pow" || Name ==
"powf" || Name ==
"powl" || Name ==
"exp2" ||
263 Name ==
"exp2l" || Name ==
"exp2f" || Name ==
"floor" ||
264 Name ==
"floorf" || Name ==
"ceil" || Name ==
"round" ||
265 Name ==
"ffs" || Name ==
"ffsl" || Name ==
"abs" || Name ==
"labs" ||
289 virtual std::optional<Instruction *>
294 virtual std::optional<Value *>
297 bool &KnownBitsComputed)
const {
305 SimplifyAndSetOp)
const {
323 const APInt &)
const {
328 int64_t BaseOffset,
bool HasBaseReg,
329 int64_t Scale,
unsigned AddrSpace,
331 int64_t ScalableOffset = 0)
const {
334 return !BaseGV && BaseOffset == 0 && (Scale == 0 || Scale == 1);
339 return std::tie(
C1.NumRegs,
C1.AddRecCost,
C1.NumIVMuls,
C1.NumBaseAdds,
340 C1.ScaleCost,
C1.ImmCost,
C1.SetupCost) <
386 unsigned DataSize =
DL.getTypeStoreSize(DataType);
393 unsigned DataSize =
DL.getTypeStoreSize(DataType);
411 Align Alignment)
const {
416 Align Alignment)
const {
421 Align Alignment)
const {
443 std::optional<Instruction::CastOps> CastHint)
const {
449 unsigned AddrSpace)
const {
454 Type *DataType)
const {
472 bool HasBaseReg, int64_t Scale,
473 unsigned AddrSpace)
const {
476 Scale, AddrSpace,
nullptr,
488 virtual bool useAA()
const {
return false; }
509 unsigned ScalarOpdIdx)
const {
584 unsigned *
Fast)
const {
640 Type *Ty =
nullptr)
const {
647 return "Generic::Unknown Register Class";
649 return "Generic::ScalarRC";
651 return "Generic::VectorRC";
687 virtual unsigned getMaximumVF(
unsigned ElemWidth,
unsigned Opcode)
const {
696 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
697 AllowPromotionWithoutCommonHeader =
false;
702 virtual std::optional<unsigned>
713 virtual std::optional<unsigned>
729 unsigned NumStridedMemAccesses,
730 unsigned NumPrefetches,
731 bool HasCall)
const {
739 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
747 bool HasUnorderedReductions)
const {
757 auto IsWidenableCondition = [](
const Value *
V) {
759 if (
II->getIntrinsicID() == Intrinsic::experimental_widenable_condition)
768 case Instruction::FDiv:
769 case Instruction::FRem:
770 case Instruction::SDiv:
771 case Instruction::SRem:
772 case Instruction::UDiv:
773 case Instruction::URem:
776 case Instruction::And:
777 case Instruction::Or:
778 if (
any_of(Args, IsWidenableCondition))
785 if (Ty->getScalarType()->isFloatingPointTy())
815 case Instruction::IntToPtr: {
816 unsigned SrcSize = Src->getScalarSizeInBits();
817 if (
DL.isLegalInteger(SrcSize) &&
818 SrcSize <=
DL.getPointerTypeSizeInBits(Dst))
822 case Instruction::PtrToAddr: {
823 unsigned DstSize = Dst->getScalarSizeInBits();
824 assert(DstSize ==
DL.getAddressSizeInBits(Src));
825 if (
DL.isLegalInteger(DstSize))
829 case Instruction::PtrToInt: {
830 unsigned DstSize = Dst->getScalarSizeInBits();
831 if (
DL.isLegalInteger(DstSize) &&
832 DstSize >=
DL.getPointerTypeSizeInBits(Src))
836 case Instruction::BitCast:
837 if (Dst == Src || (Dst->isPointerTy() && Src->isPointerTy()))
841 case Instruction::Trunc: {
890 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
905 unsigned Index)
const {
911 const APInt &DemandedDstElts,
922 if (Opcode == Instruction::InsertValue &&
938 bool UseMaskForCond,
bool UseMaskForGaps)
const {
945 switch (ICA.
getID()) {
948 case Intrinsic::allow_runtime_check:
949 case Intrinsic::allow_ubsan_check:
950 case Intrinsic::annotation:
951 case Intrinsic::assume:
952 case Intrinsic::sideeffect:
953 case Intrinsic::pseudoprobe:
954 case Intrinsic::arithmetic_fence:
955 case Intrinsic::invariant_start:
956 case Intrinsic::invariant_end:
957 case Intrinsic::launder_invariant_group:
958 case Intrinsic::is_constant:
959 case Intrinsic::lifetime_start:
960 case Intrinsic::lifetime_end:
961 case Intrinsic::experimental_noalias_scope_decl:
962 case Intrinsic::objectsize:
963 case Intrinsic::ptr_annotation:
964 case Intrinsic::var_annotation:
965 case Intrinsic::experimental_gc_result:
966 case Intrinsic::experimental_gc_relocate:
967 case Intrinsic::coro_alloc:
968 case Intrinsic::coro_begin:
969 case Intrinsic::coro_begin_custom_abi:
970 case Intrinsic::coro_dead:
971 case Intrinsic::coro_id:
972 case Intrinsic::coro_id_async:
973 case Intrinsic::coro_id_retcon:
974 case Intrinsic::coro_id_retcon_once:
975 case Intrinsic::coro_noop:
976 case Intrinsic::coro_free:
977 case Intrinsic::coro_end:
978 case Intrinsic::coro_frame:
979 case Intrinsic::coro_size:
980 case Intrinsic::coro_align:
981 case Intrinsic::coro_suspend:
982 case Intrinsic::coro_subfn_addr:
983 case Intrinsic::threadlocal_address:
984 case Intrinsic::experimental_widenable_condition:
985 case Intrinsic::ssa_copy:
988 case Intrinsic::bswap:
999 switch (MICA.
getID()) {
1000 case Intrinsic::masked_scatter:
1001 case Intrinsic::masked_gather:
1002 case Intrinsic::masked_load:
1003 case Intrinsic::masked_store:
1004 case Intrinsic::vp_scatter:
1005 case Intrinsic::vp_gather:
1006 case Intrinsic::masked_compressstore:
1007 case Intrinsic::masked_expandload:
1008 case Intrinsic::speculative_load:
1032 std::optional<FastMathFlags> FMF,
1045 VectorType *Ty, std::optional<FastMathFlags> FMF,
1077 bool CanCreate =
true)
const {
1083 unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1085 std::optional<uint32_t> AtomicElementSize)
const {
1086 return AtomicElementSize ?
Type::getIntNTy(Context, *AtomicElementSize * 8)
1092 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1094 std::optional<uint32_t> AtomicCpySize)
const {
1095 unsigned OpSizeInBytes = AtomicCpySize.value_or(1);
1097 for (
unsigned i = 0; i != RemainingBytes; i += OpSizeInBytes)
1103 return (Caller->getFnAttribute(
"target-cpu") ==
1104 Callee->getFnAttribute(
"target-cpu")) &&
1105 (Caller->getFnAttribute(
"target-features") ==
1106 Callee->getFnAttribute(
"target-features"));
1110 unsigned DefaultCallPenalty)
const {
1111 return DefaultCallPenalty;
1124 return (Caller->getFnAttribute(
"target-cpu") ==
1125 Callee->getFnAttribute(
"target-cpu")) &&
1126 (Caller->getFnAttribute(
"target-features") ==
1127 Callee->getFnAttribute(
"target-features"));
1148 unsigned AddrSpace)
const {
1154 unsigned AddrSpace)
const {
1167 GatherUseOps)
const {
1168 return TargetTransformInfo::VectorInstrContext::None;
1176 unsigned ChainSizeInBytes,
1182 unsigned ChainSizeInBytes,
1287 unsigned MaxRequiredSize =
1288 VT->getElementType()->getPrimitiveSizeInBits().getFixedValue();
1290 unsigned MinRequiredSize = 0;
1291 for (
unsigned i = 0, e = VT->getNumElements(); i < e; ++i) {
1292 if (
auto *IntElement =
1294 bool signedElement = IntElement->getValue().isNegative();
1296 unsigned ElementMinRequiredSize =
1297 IntElement->getValue().getSignificantBits() - 1;
1301 MinRequiredSize = std::max(MinRequiredSize, ElementMinRequiredSize);
1304 return MaxRequiredSize;
1307 return MinRequiredSize;
1311 isSigned = CI->getValue().isNegative();
1312 return CI->getValue().getSignificantBits() - 1;
1317 return Cast->getSrcTy()->getScalarSizeInBits() - 1;
1322 return Cast->getSrcTy()->getScalarSizeInBits();
1334 const SCEV *Ptr)
const {
1342 int64_t MergeDistance)
const {
1356template <
typename T>
1368 Type *AccessType)
const override {
1369 assert(PointeeType && Ptr &&
"can't get GEPCost of nullptr");
1371 bool HasBaseReg = (BaseGV ==
nullptr);
1373 auto PtrSizeBits =
DL.getPointerTypeSizeInBits(Ptr->
getType());
1374 APInt BaseOffset(PtrSizeBits, 0);
1378 Type *TargetType =
nullptr;
1386 TargetType = GTI.getIndexedType();
1393 if (
StructType *STy = GTI.getStructTypeOrNull()) {
1395 assert(ConstIdx &&
"Unexpected GEP index");
1397 BaseOffset +=
DL.getStructLayout(STy)->getElementOffset(
Field);
1401 if (TargetType->isScalableTy())
1403 int64_t ElementSize =
1404 GTI.getSequentialElementStride(
DL).getFixedValue();
1413 Scale = ElementSize;
1428 AccessType = TargetType;
1459 for (
const Value *
V : Ptrs) {
1463 if (Info.isSameBase() &&
V !=
Base) {
1464 if (
GEP->hasAllConstantIndices())
1467 Instruction::Add,
GEP->getType(), CostKind,
1468 {TTI::OK_AnyValue, TTI::OP_None}, {TTI::OK_AnyValue, TTI::OP_None},
1473 GEP->getSourceElementType(),
GEP->getPointerOperand(), Indices,
1474 CostKind, AccessTy);
1485 auto *TargetTTI =
static_cast<const T *
>(
this);
1490 if (
const Function *
F = CB->getCalledFunction()) {
1491 if (!TargetTTI->isLoweredToCall(
F))
1500 Type *Ty = U->getType();
1506 case Instruction::Call: {
1510 return TargetTTI->getIntrinsicInstrCost(CostAttrs, CostKind);
1512 case Instruction::UncondBr:
1513 case Instruction::CondBr:
1514 case Instruction::Ret:
1515 case Instruction::PHI:
1516 case Instruction::Switch:
1517 return TargetTTI->getCFInstrCost(Opcode, CostKind,
I);
1518 case Instruction::Freeze:
1520 case Instruction::ExtractValue:
1521 case Instruction::InsertValue:
1522 return TargetTTI->getInsertExtractValueCost(Opcode, CostKind);
1523 case Instruction::Alloca:
1527 case Instruction::GetElementPtr: {
1529 Type *AccessType =
nullptr;
1532 if (
GEP->hasOneUser() &&
I)
1533 AccessType =
I->user_back()->getAccessType();
1535 return TargetTTI->getGEPCost(
GEP->getSourceElementType(),
1537 CostKind, AccessType);
1539 case Instruction::Add:
1540 case Instruction::FAdd:
1541 case Instruction::Sub:
1542 case Instruction::FSub:
1543 case Instruction::Mul:
1544 case Instruction::FMul:
1545 case Instruction::UDiv:
1546 case Instruction::SDiv:
1547 case Instruction::FDiv:
1548 case Instruction::URem:
1549 case Instruction::SRem:
1550 case Instruction::FRem:
1551 case Instruction::Shl:
1552 case Instruction::LShr:
1553 case Instruction::AShr:
1554 case Instruction::And:
1555 case Instruction::Or:
1556 case Instruction::Xor:
1557 case Instruction::FNeg: {
1560 if (Opcode != Instruction::FNeg)
1562 return TargetTTI->getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
1565 case Instruction::IntToPtr:
1566 case Instruction::PtrToAddr:
1567 case Instruction::PtrToInt:
1568 case Instruction::SIToFP:
1569 case Instruction::UIToFP:
1570 case Instruction::FPToUI:
1571 case Instruction::FPToSI:
1572 case Instruction::Trunc:
1573 case Instruction::FPTrunc:
1574 case Instruction::BitCast:
1575 case Instruction::FPExt:
1576 case Instruction::SExt:
1577 case Instruction::ZExt:
1578 case Instruction::AddrSpaceCast: {
1580 return TargetTTI->getCastInstrCost(
1583 case Instruction::Store: {
1587 return TargetTTI->getMemoryOpCost(Opcode, ValTy,
SI->getAlign(),
1588 SI->getPointerAddressSpace(), CostKind,
1591 case Instruction::Load: {
1593 Type *LoadType = U->getType();
1604 LoadType = TI->getDestTy();
1606 return TargetTTI->getMemoryOpCost(Opcode, LoadType, LI->getAlign(),
1608 {TTI::OK_AnyValue, TTI::OP_None},
I);
1610 case Instruction::Select: {
1611 const Value *Op0, *Op1;
1622 return TargetTTI->getArithmeticInstrCost(
1624 CostKind, Op1Info, Op2Info,
Operands,
I);
1629 return TargetTTI->getCmpSelInstrCost(Opcode, U->getType(), CondTy,
1631 CostKind, Op1Info, Op2Info,
I);
1633 case Instruction::ICmp:
1634 case Instruction::FCmp: {
1639 return TargetTTI->getCmpSelInstrCost(Opcode, ValTy, U->getType(),
1642 CostKind, Op1Info, Op2Info,
I);
1644 case Instruction::InsertElement: {
1650 if (CI->getValue().getActiveBits() <= 32)
1651 Idx = CI->getZExtValue();
1652 return TargetTTI->getVectorInstrCost(*IE, Ty, CostKind, Idx,
1655 case Instruction::ShuffleVector: {
1663 int NumSubElts, SubIndex;
1666 if (
all_of(Mask, [](
int M) {
return M < 0; }))
1670 if (Shuffle->changesLength()) {
1672 if (Shuffle->increasesLength() && Shuffle->isIdentityWithPadding())
1675 if (Shuffle->isExtractSubvectorMask(SubIndex))
1677 VecSrcTy, CostKind, Mask, SubIndex,
1680 if (Shuffle->isInsertSubvectorMask(NumSubElts, SubIndex))
1681 return TargetTTI->getShuffleCost(
1687 int ReplicationFactor, VF;
1688 if (Shuffle->isReplicationMask(ReplicationFactor, VF)) {
1692 DemandedDstElts.
setBit(
I.index());
1694 return TargetTTI->getReplicationShuffleCost(
1695 VecSrcTy->getElementType(), ReplicationFactor, VF,
1696 DemandedDstElts, CostKind);
1700 NumSubElts = VecSrcTy->getElementCount().getKnownMinValue();
1706 if (Shuffle->increasesLength()) {
1707 for (
int &M : AdjustMask)
1708 M = M >= NumSubElts ? (M + (Mask.size() - NumSubElts)) : M;
1710 return TargetTTI->getShuffleCost(
1712 VecTy, CostKind, AdjustMask, 0,
nullptr,
Operands, Shuffle);
1723 VecSrcTy, VecSrcTy, CostKind, AdjustMask, 0,
nullptr,
Operands,
1727 std::iota(ExtractMask.
begin(), ExtractMask.
end(), 0);
1728 return ShuffleCost + TargetTTI->getShuffleCost(
1730 CostKind, ExtractMask, 0, VecTy, {}, Shuffle);
1733 if (Shuffle->isIdentity())
1736 if (Shuffle->isReverse())
1738 CostKind, Mask, 0,
nullptr,
Operands,
1741 if (Shuffle->isTranspose())
1743 CostKind, Mask, 0,
nullptr,
Operands,
1746 if (Shuffle->isZeroEltSplat())
1748 CostKind, Mask, 0,
nullptr,
Operands,
1751 if (Shuffle->isSingleSource())
1753 VecSrcTy, CostKind, Mask, 0,
nullptr,
1756 if (Shuffle->isInsertSubvectorMask(NumSubElts, SubIndex))
1757 return TargetTTI->getShuffleCost(
1762 if (Shuffle->isSelect())
1763 return TargetTTI->getShuffleCost(
TTI::SK_Select, VecTy, VecSrcTy,
1764 CostKind, Mask, 0,
nullptr,
Operands,
1767 if (Shuffle->isSplice(SubIndex))
1768 return TargetTTI->getShuffleCost(
TTI::SK_Splice, VecTy, VecSrcTy,
1769 CostKind, Mask, SubIndex,
nullptr,
1773 CostKind, Mask, 0,
nullptr,
Operands,
1776 case Instruction::ExtractElement: {
1782 if (CI->getValue().getActiveBits() <= 32)
1783 Idx = CI->getZExtValue();
1785 return TargetTTI->getVectorInstrCost(*EEI, DstTy, CostKind, Idx);
1794 auto *TargetTTI =
static_cast<const T *
>(
this);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
static bool isSigned(unsigned Opcode)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static SymbolRef::Type getType(const Symbol *Sym)
static void computeKnownBits(const Value *V, const APInt &DemandedElts, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth)
Determine which bits of V are known to be either zero or one and return them in the Known bit set.
Class for arbitrary precision integers.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
unsigned getBitWidth() const
Return the number of bits in the APInt.
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
int64_t getSExtValue() const
Get sign extended value.
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
A cache of @llvm.assume calls within a function.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Conditional Branch instruction.
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
const APInt & getValue() const
Return the constant as an APInt value reference.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Convenience struct for specifying and reasoning about fast-math flags.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
This instruction compares its operands according to the predicate given to the constructor.
The core instruction combiner logic.
static InstructionCost getInvalid(CostType Val=0)
Type * getReturnType() const
Intrinsic::ID getID() const
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Represents a single loop in the control flow graph.
Information for memory intrinsic cost model.
Intrinsic::ID getID() const
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Analysis providing profile information.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
This node represents a polynomial recurrence on the trip count of the specified loop.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
const APInt & getAPInt() const
This class represents an analyzed expression in the program.
The main scalar evolution driver.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackOffset holds a fixed and a scalable offset in bytes.
static StackOffset getScalable(int64_t Scalable)
static StackOffset getFixed(int64_t Fixed)
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Class to represent struct types.
Provides information about what library functions are available for the current target.
This class represents a truncation of integer types.
static constexpr TypeSize get(ScalarTy Quantity, bool Scalable)
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Base class of all SIMD vector types.
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
LogicalOp_match< LHS, RHS, Instruction::And > m_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R either in the form of L & R or L ?
bool match(Val *V, const Pattern &P)
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Constant()
Match an arbitrary Constant and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
LogicalOp_match< LHS, RHS, Instruction::Or > m_LogicalOr(const LHS &L, const RHS &R)
Matches L || R either in the form of L | R or L ?
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
constexpr int PoisonMaskElem
RecurKind
These are the kinds of recurrences that we support.
@ Fast
Assign the register banks as fast as possible (default).
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
@ DataWithoutLaneMask
Same as Data, but avoids using the get.active.lane.mask intrinsic to calculate the mask and instead i...
ValueUniformity
Enum describing how values behave with respect to uniformity and divergence, to answer the question: ...
@ Default
The result value is uniform if and only if all operands are uniform.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Attributes of a target dependent hardware loop.
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Information about a load/store intrinsic defined by the target.