16#ifndef LLVM_CODEGEN_BASICTTIIMPL_H
17#define LLVM_CODEGEN_BASICTTIIMPL_H
90 const T *thisT()
const {
return static_cast<const T *
>(
this); }
100 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
104 Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, VTy,
124 Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, VTy,
126 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
139 "Can only extract subvectors from vectors");
142 (Index + NumSubElts) <=
144 "SK_ExtractSubvector index out of range");
150 for (
int i = 0; i != NumSubElts; ++i) {
152 thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
153 CostKind, i + Index,
nullptr,
nullptr);
154 Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, SubVTy,
167 "Can only insert subvectors into vectors");
170 (Index + NumSubElts) <=
172 "SK_InsertSubvector index out of range");
178 for (
int i = 0; i != NumSubElts; ++i) {
179 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, SubVTy,
182 thisT()->getVectorInstrCost(Instruction::InsertElement, VTy,
CostKind,
183 i + Index,
nullptr,
nullptr);
190 return static_cast<const T *
>(
this)->getST();
195 return static_cast<const T *
>(
this)->getTLI();
217 bool IsGatherScatter,
225 unsigned VF = VT->getNumElements();
240 VF * thisT()->getMemoryOpCost(Opcode, VT->getElementType(), Alignment,
246 Opcode == Instruction::Store,
CostKind);
260 VF * (thisT()->getCFInstrCost(Instruction::CondBr,
CostKind) +
261 thisT()->getCFInstrCost(Instruction::PHI,
CostKind));
264 return AddrExtractCost + MemoryOpCost + PackingCost + ConditionalCost;
272 static bool isSplatMask(
ArrayRef<int> Mask,
unsigned NumSrcElts,
int &Index) {
274 bool IsCompared =
false;
278 return P.index() != Mask.size() - 1 || IsCompared;
279 if (
static_cast<unsigned>(
P.value()) >= NumSrcElts * 2)
282 SplatIdx =
P.value();
283 return P.index() != Mask.size() - 1;
286 return SplatIdx ==
P.value();
305 std::optional<InstructionCost> getMultipleResultIntrinsicVectorLibCallCost(
307 std::optional<unsigned> CallRetElementIndex = {})
const {
315 EVT VT = getTLI()->getValueType(
DL, Ty);
317 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
319 switch (ICA.
getID()) {
320 case Intrinsic::modf:
321 LC = RTLIB::getMODF(VT);
323 case Intrinsic::sincospi:
324 LC = RTLIB::getSINCOSPI(VT);
326 case Intrinsic::sincos:
327 LC = RTLIB::getSINCOS(VT);
334 RTLIB::LibcallImpl LibcallImpl = getTLI()->getLibcallImpl(LC);
335 if (LibcallImpl == RTLIB::Unsupported)
348 VecTy,
CostKind, {}, 0,
nullptr, {});
354 if (Idx == CallRetElementIndex)
356 Cost += thisT()->getMemoryOpCost(
357 Instruction::Load, VectorTy,
391 unsigned *
Fast)
const override {
393 return getTLI()->allowsMisalignedMemoryAccesses(
398 const Function *Callee)
const override {
410 ~InlineIgnoreFeatures;
413 ~InlineIgnoreFeatures;
415 if ((CallerBits & InlineMustMatchFeatures) !=
416 (CalleeBits & InlineMustMatchFeatures))
421 return (CallerBits & CalleeBits) == CalleeBits;
447 return getTLI()->getTargetMachine().isNoopAddrSpaceCast(
DL, FromAS, ToAS);
451 return getTLI()->getTargetMachine().getAssumedAddrSpace(V);
454 std::pair<const Value *, unsigned>
456 return getTLI()->getTargetMachine().getPredicatedAddrSpace(V);
460 Value *NewV)
const override {
465 return getTLI()->isLegalAddImmediate(imm);
469 return getTLI()->isLegalAddScalableImmediate(
Imm);
473 return getTLI()->isLegalICmpImmediate(imm);
477 bool HasBaseReg, int64_t Scale,
unsigned AddrSpace,
479 int64_t ScalableOffset = 0)
const override {
486 return getTLI()->isLegalAddressingMode(
DL, AM, Ty, AddrSpace,
I);
490 return getTLI()->getPreferredLargeGEPBaseOffset(MinOffset, MaxOffset);
495 unsigned AddrSpace)
const override {
496 auto &&IsSupportedByTarget = [
this, ScalarMemTy, ScalarValTy, Alignment,
497 AddrSpace](
unsigned VF) {
499 EVT VT = getTLI()->getValueType(
DL, SrcTy);
500 if (getTLI()->isOperationLegal(
ISD::STORE, VT) ||
507 getTLI()->getTypeToTransformTo(ScalarMemTy->
getContext(), VT);
508 return getTLI()->isTruncStoreLegal(LegalizedVT, ValVT, Alignment,
511 while (VF > 2 && IsSupportedByTarget(VF))
517 EVT VT = getTLI()->getValueType(
DL, Ty,
true);
518 return getTLI()->isIndexedLoadLegal(getISDIndexedMode(M), VT);
522 EVT VT = getTLI()->getValueType(
DL, Ty,
true);
523 return getTLI()->isIndexedStoreLegal(getISDIndexedMode(M), VT);
546 unsigned AddrSpace)
const override {
559 return getTLI()->isTruncateFree(Ty1, Ty2);
563 return getTLI()->isProfitableToHoist(
I);
566 bool useAA()
const override {
return getST()->useAA(); }
569 EVT VT = getTLI()->getValueType(
DL, Ty,
true);
570 return getTLI()->isTypeLegal(VT);
574 EVT ETy = getTLI()->getValueType(
DL, Ty);
575 return getTLI()->getNumRegisters(Ty->getContext(), ETy);
581 Type *AccessType)
const override {
595 unsigned N =
SI.getNumCases();
603 if (
N < 1 || (!IsJTAllowed &&
DL.getIndexSizeInBits(0u) <
N))
606 APInt MaxCaseVal =
SI.case_begin()->getCaseValue()->getValue();
607 APInt MinCaseVal = MaxCaseVal;
608 for (
auto CI :
SI.cases()) {
609 const APInt &CaseVal = CI.getCaseValue()->getValue();
610 if (CaseVal.
sgt(MaxCaseVal))
611 MaxCaseVal = CaseVal;
612 if (CaseVal.
slt(MinCaseVal))
613 MinCaseVal = CaseVal;
617 if (
N <=
DL.getIndexSizeInBits(0u)) {
619 for (
auto I :
SI.cases()) {
630 if (
N < 2 ||
N < TLI->getMinimumJumpTableEntries())
633 (MaxCaseVal - MinCaseVal)
634 .getLimitedValue(std::numeric_limits<uint64_t>::max() - 1) + 1;
637 JumpTableSize =
Range;
695 const Function &Fn)
const override {
699 case Instruction::SDiv:
700 case Instruction::SRem:
701 case Instruction::UDiv:
702 case Instruction::URem: {
754 else if (ST->getSchedModel().LoopMicroOpBufferSize > 0)
755 MaxOps = ST->getSchedModel().LoopMicroOpBufferSize;
772 <<
"advising against unrolling the loop because it "
822 std::optional<Instruction *>
827 std::optional<Value *>
830 bool &KnownBitsComputed)
const override {
839 SimplifyAndSetOp)
const override {
841 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
846 return getST()->getMispredictionPenalty();
849 std::optional<unsigned>
851 return std::optional<unsigned>(
855 std::optional<unsigned>
857 std::optional<unsigned> TargetResult =
858 getST()->getCacheAssociativity(
static_cast<unsigned>(Level));
867 return getST()->getCacheLineSize();
871 return getST()->getPrefetchDistance();
875 unsigned NumStridedMemAccesses,
876 unsigned NumPrefetches,
877 bool HasCall)
const override {
878 return getST()->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
879 NumPrefetches, HasCall);
883 return getST()->getMaxPrefetchIterationsAhead();
887 return getST()->enableWritePrefetching();
891 return getST()->shouldPrefetchAddressSpace(AS);
913 bool Insert,
bool Extract,
925 (VL.empty() || VL.size() == Ty->getNumElements()) &&
926 "Vector size mismatch");
930 for (
int i = 0, e = Ty->getNumElements(); i < e; ++i) {
931 if (!DemandedElts[i])
934 Value *InsertedVal = VL.empty() ? nullptr : VL[i];
936 thisT()->getVectorInstrCost(Instruction::InsertElement, Ty,
937 CostKind, i,
nullptr, InsertedVal, VIC);
940 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
941 CostKind, i,
nullptr,
nullptr, VIC);
949 unsigned ScalarOpdIdx)
const override {
954 int OpdIdx)
const override {
960 int RetIdx)
const override {
975 return thisT()->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
987 for (
Type *Ty : Tys) {
989 if (!Ty->isIntOrIntVectorTy() && !Ty->isFPOrFPVectorTy() &&
990 !Ty->isPtrOrPtrVectorTy())
1014 filterConstantAndDuplicatedOperands(Args, Tys),
CostKind);
1026 auto [It, Inserted] = TypeLegalizationCostCache.try_emplace(Ty);
1028 It->second = computeTypeLegalizationCost(Ty);
1033 std::pair<InstructionCost, MVT> computeTypeLegalizationCost(
Type *Ty)
const {
1059 if (MTy == LK.second)
1069 mutable DenseMap<Type *, std::pair<InstructionCost, MVT>>
1070 TypeLegalizationCostCache;
1074 bool HasUnorderedReductions)
const override {
1083 const Instruction *CtxI =
nullptr)
const override {
1085 const TargetLoweringBase *TLI = getTLI();
1086 int ISD = TLI->InstructionOpcodeToISD(Opcode);
1087 assert(ISD &&
"Invalid opcode");
1102 if (TLI->isOperationLegalOrPromote(ISD,
LT.second)) {
1105 return LT.first * OpCost;
1108 if (!TLI->isOperationExpand(ISD,
LT.second)) {
1111 return LT.first * 2 * OpCost;
1123 unsigned DivOpc = IsSigned ? Instruction::SDiv : Instruction::UDiv;
1125 DivOpc, Ty,
CostKind, Opd1Info, Opd2Info);
1127 thisT()->getArithmeticInstrCost(Instruction::Mul, Ty,
CostKind);
1129 thisT()->getArithmeticInstrCost(Instruction::Sub, Ty,
CostKind);
1130 return DivCost + MulCost + SubCost;
1162 int NumDstElts = Mask.size();
1163 int NumSrcElts = SrcTy->getElementCount().getKnownMinValue();
1170 if (isSplatMask(Mask, NumSrcElts, Index))
1173 (Index + NumDstElts) <= NumSrcElts) {
1180 if (
all_of(Mask, [NumSrcElts](
int M) {
return M < NumSrcElts; }))
1185 Mask, NumSrcElts, NumSubElts, Index)) {
1186 if (Index + NumSubElts > NumSrcElts)
1221 return getBroadcastShuffleOverhead(FVT,
CostKind);
1230 return getPermuteShuffleOverhead(FVT,
CostKind);
1233 return getExtractSubvectorOverhead(SrcTy,
CostKind, Index,
1236 return getInsertSubvectorOverhead(DstTy,
CostKind, Index,
1255 TypeSize SrcSize = SrcLT.second.getSizeInBits();
1256 TypeSize DstSize = DstLT.second.getSizeInBits();
1257 bool IntOrPtrSrc = Src->isIntegerTy() || Src->isPointerTy();
1258 bool IntOrPtrDst = Dst->isIntegerTy() || Dst->isPointerTy();
1263 case Instruction::Trunc:
1268 case Instruction::BitCast:
1271 if (SrcLT.first == DstLT.first && IntOrPtrSrc == IntOrPtrDst &&
1275 case Instruction::FPExt:
1276 if (
I && getTLI()->isExtFree(
I))
1279 case Instruction::ZExt:
1280 if (TLI->
isZExtFree(SrcLT.second, DstLT.second))
1283 case Instruction::SExt:
1284 if (
I && getTLI()->isExtFree(
I))
1296 if (DstLT.first == SrcLT.first &&
1298 LI->getPointerAddressSpace(), LType,
false))
1301 switch (
II->getIntrinsicID()) {
1302 case Intrinsic::masked_load: {
1303 Type *PtrType =
II->getArgOperand(0)->getType();
1306 if (DstLT.first == SrcLT.first &&
1308 ExtVT, LoadVT,
II->getParamAlign(0).valueOrOne(),
1321 case Instruction::AddrSpaceCast:
1323 Dst->getPointerAddressSpace()))
1332 if (SrcLT.first == DstLT.first &&
1337 if (!SrcVTy && !DstVTy) {
1348 if (DstVTy && SrcVTy) {
1350 if (SrcLT.first == DstLT.first && SrcSize == DstSize) {
1353 if (Opcode == Instruction::ZExt)
1357 if (Opcode == Instruction::SExt)
1358 return SrcLT.first * 2;
1364 return SrcLT.first * 1;
1377 if ((SplitSrc || SplitDst) && SrcVTy->getElementCount().isKnownEven() &&
1378 DstVTy->getElementCount().isKnownEven()) {
1381 const T *TTI = thisT();
1384 (!SplitSrc || !SplitDst) ? TTI->getVectorSplitCost() : 0;
1386 (2 * TTI->getCastInstrCost(Opcode, SplitDstTy, SplitSrcTy, CCH,
1398 Opcode, Dst->getScalarType(), Src->getScalarType(), CCH,
CostKind,
I);
1411 if (Opcode == Instruction::BitCast) {
1428 return thisT()->getVectorInstrCost(Instruction::ExtractElement, VecTy,
1429 CostKind, Index,
nullptr,
nullptr) +
1445 const Instruction *
I =
nullptr)
const override {
1446 const TargetLoweringBase *TLI = getTLI();
1447 int ISD = TLI->InstructionOpcodeToISD(Opcode);
1448 assert(ISD &&
"Invalid opcode");
1450 if (getTLI()->getValueType(
DL, ValTy,
true) == MVT::Other)
1452 Op1Info, Op2Info,
I);
1456 assert(CondTy &&
"CondTy must exist");
1457 if (CondTy->isVectorTy())
1463 !TLI->isOperationExpand(ISD,
LT.second)) {
1466 return LT.first * 1;
1478 Opcode, ValVTy->getScalarType(), CondTy->
getScalarType(), VecPred,
1494 unsigned Index,
const Value *Op0,
const Value *Op1,
1507 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1519 Value *Op0 =
nullptr;
1520 Value *Op1 =
nullptr;
1522 Op0 = IE->getOperand(0);
1523 Op1 = IE->getOperand(1);
1528 return thisT()->getVectorInstrCost(
I.getOpcode(), Val,
CostKind, Index, Op0,
1535 unsigned Index)
const override {
1536 unsigned NewIndex = -1;
1538 assert(Index < FVTy->getNumElements() &&
1539 "Unexpected index from end of vector");
1540 NewIndex = FVTy->getNumElements() - 1 - Index;
1542 return thisT()->getVectorInstrCost(Opcode, Val,
CostKind, NewIndex,
nullptr,
1548 const APInt &DemandedDstElts,
1551 "Unexpected size of DemandedDstElts.");
1569 Cost += thisT()->getScalarizationOverhead(SrcVT, DemandedSrcElts,
1572 Cost += thisT()->getScalarizationOverhead(ReplicatedVT, DemandedDstElts,
1584 assert(!Src->isVoidTy() &&
"Invalid type");
1586 if (getTLI()->getValueType(
DL, Src,
true) == MVT::Other)
1605 LT.second.getSizeInBits())) {
1611 if (Opcode == Instruction::Store)
1623 Opcode == Instruction::Store,
CostKind);
1633 bool UseMaskForCond =
false,
bool UseMaskForGaps =
false)
const override {
1641 unsigned NumElts = VT->getNumElements();
1642 assert(Factor > 1 && NumElts % Factor == 0 &&
"Invalid interleave factor");
1644 unsigned NumSubElts = NumElts / Factor;
1649 if (UseMaskForCond || UseMaskForGaps) {
1650 unsigned IID = Opcode == Instruction::Load ? Intrinsic::masked_load
1651 : Intrinsic::masked_store;
1652 Cost = thisT()->getMemIntrinsicInstrCost(
1662 unsigned VecTySize = thisT()->getDataLayout().getTypeStoreSize(VecTy);
1679 if (
Cost.isValid() && VecTySize > VecTyLTSize) {
1682 unsigned NumLegalInsts =
divideCeil(VecTySize, VecTyLTSize);
1686 unsigned NumEltsPerLegalInst =
divideCeil(NumElts, NumLegalInsts);
1689 BitVector UsedInsts(NumLegalInsts,
false);
1690 for (
unsigned Index : Indices)
1691 for (
unsigned Elt = 0; Elt < NumSubElts; ++Elt)
1692 UsedInsts.
set((Index + Elt * Factor) / NumEltsPerLegalInst);
1701 "Interleaved memory op has too many members");
1707 for (
unsigned Index : Indices) {
1708 assert(Index < Factor &&
"Invalid index for interleaved memory op");
1709 for (
unsigned Elm = 0; Elm < NumSubElts; Elm++)
1710 DemandedLoadStoreElts.
setBit(Index + Elm * Factor);
1713 if (Opcode == Instruction::Load) {
1723 SubVT, DemandedAllSubElts,
1725 Cost += Indices.
size() * InsSubCost;
1726 Cost += thisT()->getScalarizationOverhead(VT, DemandedLoadStoreElts,
1744 SubVT, DemandedAllSubElts,
1746 Cost += ExtSubCost * Indices.
size();
1747 Cost += thisT()->getScalarizationOverhead(VT, DemandedLoadStoreElts,
1752 if (!UseMaskForCond)
1757 Cost += thisT()->getReplicationShuffleCost(
1758 I8Type, Factor, NumSubElts,
1759 UseMaskForGaps ? DemandedLoadStoreElts : DemandedAllResultElts,
1767 if (UseMaskForGaps) {
1769 Cost += thisT()->getArithmeticInstrCost(BinaryOperator::And, MaskVT,
1795 std::optional<unsigned> FOp =
1798 if (ICA.
getID() == Intrinsic::vp_load) {
1801 Alignment = VPI->getPointerAlignment().valueOrOne();
1805 AS = PtrTy->getAddressSpace();
1806 return thisT()->getMemoryOpCost(*FOp, ICA.
getReturnType(), Alignment,
1809 if (ICA.
getID() == Intrinsic::vp_store) {
1812 Alignment = VPI->getPointerAlignment().valueOrOne();
1816 AS = PtrTy->getAddressSpace();
1817 return thisT()->getMemoryOpCost(*FOp, ICA.
getArgTypes()[0], Alignment,
1820 if (ICA.
getID() == Intrinsic::vp_udiv ||
1821 ICA.
getID() == Intrinsic::vp_sdiv ||
1822 ICA.
getID() == Intrinsic::vp_urem ||
1823 ICA.
getID() == Intrinsic::vp_srem) {
1824 return thisT()->getArithmeticInstrCost(*FOp, ICA.
getReturnType(),
1828 if (ICA.
getID() == Intrinsic::vp_load_ff) {
1833 Alignment = VPI->getPointerAlignment().valueOrOne();
1834 return thisT()->getMemIntrinsicInstrCost(
1838 if (ICA.
getID() == Intrinsic::vp_scatter) {
1848 Alignment = VPI->getPointerAlignment().valueOrOne();
1850 return thisT()->getMemIntrinsicInstrCost(
1853 VarMask, Alignment,
nullptr),
1856 if (ICA.
getID() == Intrinsic::vp_gather) {
1866 Alignment = VPI->getPointerAlignment().valueOrOne();
1868 return thisT()->getMemIntrinsicInstrCost(
1871 VarMask, Alignment,
nullptr),
1875 if (ICA.
getID() == Intrinsic::vp_merge) {
1886 std::optional<Intrinsic::ID> FID =
1890 if (ICA.
getID() == Intrinsic::experimental_vp_reverse)
1891 FID = Intrinsic::vector_reverse;
1897 "Expected VPIntrinsic to have Mask and Vector Length args and "
1909 *FID != Intrinsic::vector_reduce_fadd &&
1910 *FID != Intrinsic::vector_reduce_fmul) {
1918 return thisT()->getIntrinsicInstrCost(NewICA,
CostKind);
1937 case Intrinsic::powi:
1939 bool ShouldOptForSize =
I->getParent()->getParent()->hasOptSize();
1940 if (getTLI()->isBeneficialToExpandPowI(RHSC->getSExtValue(),
1941 ShouldOptForSize)) {
1945 unsigned ActiveBits =
Exponent.getActiveBits();
1946 unsigned PopCount =
Exponent.popcount();
1948 thisT()->getArithmeticInstrCost(
1949 Instruction::FMul, RetTy,
CostKind);
1950 if (RHSC->isNegative())
1951 Cost += thisT()->getArithmeticInstrCost(Instruction::FDiv, RetTy,
1957 case Intrinsic::cttz:
1959 if (RetVF.
isScalar() && getTLI()->isCheapToSpeculateCttz(RetTy))
1963 case Intrinsic::ctlz:
1965 if (RetVF.
isScalar() && getTLI()->isCheapToSpeculateCtlz(RetTy))
1969 case Intrinsic::memcpy:
1970 return thisT()->getMemcpyCost(ICA.
getInst());
1972 case Intrinsic::masked_scatter: {
1973 const Value *Mask = Args[2];
1975 Align Alignment =
I->getParamAlign(1).valueOrOne();
1976 return thisT()->getMemIntrinsicInstrCost(
1982 case Intrinsic::masked_gather: {
1983 const Value *Mask = Args[1];
1985 Align Alignment =
I->getParamAlign(0).valueOrOne();
1986 return thisT()->getMemIntrinsicInstrCost(
1988 VarMask, Alignment,
I),
1991 case Intrinsic::masked_compressstore: {
1993 const Value *Mask = Args[2];
1994 Align Alignment =
I->getParamAlign(1).valueOrOne();
1995 return thisT()->getMemIntrinsicInstrCost(
2000 case Intrinsic::masked_expandload: {
2001 const Value *Mask = Args[1];
2002 Align Alignment =
I->getParamAlign(0).valueOrOne();
2003 return thisT()->getMemIntrinsicInstrCost(
2008 case Intrinsic::experimental_vp_strided_store: {
2010 const Value *Ptr = Args[1];
2011 const Value *Stride = Args[2];
2012 const Value *Mask = Args[3];
2013 const Value *EVL = Args[4];
2017 I->getParamAlign(1).value_or(thisT()->
DL.getABITypeAlign(EltTy));
2018 return thisT()->getMemIntrinsicInstrCost(
2020 Alignment,
I, Stride),
2023 case Intrinsic::experimental_vp_strided_load: {
2024 const Value *Ptr = Args[0];
2025 const Value *Stride = Args[1];
2026 const Value *Mask = Args[2];
2027 const Value *EVL = Args[3];
2031 I->getParamAlign(0).value_or(thisT()->
DL.getABITypeAlign(EltTy));
2032 return thisT()->getMemIntrinsicInstrCost(
2037 case Intrinsic::stepvector: {
2043 case Intrinsic::vector_extract: {
2049 return thisT()->getShuffleCost(
2054 case Intrinsic::vector_insert: {
2060 return thisT()->getShuffleCost(
2065 case Intrinsic::vector_splice_left:
2066 case Intrinsic::vector_splice_right: {
2070 unsigned Index = COffset->getZExtValue();
2071 return thisT()->getShuffleCost(
2074 IID == Intrinsic::vector_splice_left ? Index : -Index,
2077 case Intrinsic::vector_reduce_add:
2078 case Intrinsic::vector_reduce_mul:
2079 case Intrinsic::vector_reduce_and:
2080 case Intrinsic::vector_reduce_or:
2081 case Intrinsic::vector_reduce_xor:
2082 case Intrinsic::vector_reduce_smax:
2083 case Intrinsic::vector_reduce_smin:
2084 case Intrinsic::vector_reduce_fmax:
2085 case Intrinsic::vector_reduce_fmin:
2086 case Intrinsic::vector_reduce_fmaximum:
2087 case Intrinsic::vector_reduce_fminimum:
2088 case Intrinsic::vector_reduce_fmaximumnum:
2089 case Intrinsic::vector_reduce_fminimumnum:
2090 case Intrinsic::vector_reduce_umax:
2091 case Intrinsic::vector_reduce_umin: {
2095 case Intrinsic::vector_reduce_fadd:
2096 case Intrinsic::vector_reduce_fmul: {
2098 IID, RetTy, {Args[0]->getType(), Args[1]->getType()}, FMF,
I, 1);
2101 case Intrinsic::fshl:
2102 case Intrinsic::fshr: {
2103 const Value *
X = Args[0];
2104 const Value *
Y = Args[1];
2105 const Value *Z = Args[2];
2114 thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy,
CostKind);
2115 Cost += thisT()->getArithmeticInstrCost(
2116 BinaryOperator::Shl, RetTy,
CostKind, OpInfoX,
2118 Cost += thisT()->getArithmeticInstrCost(
2119 BinaryOperator::LShr, RetTy,
CostKind, OpInfoY,
2123 Cost += thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy,
2128 Cost += thisT()->getArithmeticInstrCost(
2130 : BinaryOperator::URem,
2132 {TTI::OK_UniformConstantValue, TTI::OP_None});
2136 Cost += thisT()->getCmpSelInstrCost(
2139 thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
2145 case Intrinsic::experimental_cttz_elts: {
2158 unsigned EltWidth = getTLI()->getBitWidthForCttzElements(
2160 ZeroIsPoison, &VScaleRange);
2170 thisT()->getIntrinsicInstrCost(StepVecAttrs,
CostKind);
2173 thisT()->getArithmeticInstrCost(Instruction::Sub, NewVecTy,
CostKind);
2174 Cost += thisT()->getCastInstrCost(Instruction::SExt, NewVecTy,
2178 thisT()->getArithmeticInstrCost(Instruction::And, NewVecTy,
CostKind);
2181 NewEltTy, NewVecTy, FMF,
I, 1);
2182 Cost += thisT()->getTypeBasedIntrinsicInstrCost(ReducAttrs,
CostKind);
2184 thisT()->getArithmeticInstrCost(Instruction::Sub, NewEltTy,
CostKind);
2188 case Intrinsic::get_active_lane_mask:
2189 case Intrinsic::experimental_vector_match:
2190 case Intrinsic::experimental_vector_histogram_add:
2191 case Intrinsic::experimental_vector_histogram_uadd_sat:
2192 case Intrinsic::experimental_vector_histogram_umax:
2193 case Intrinsic::experimental_vector_histogram_umin:
2194 case Intrinsic::masked_udiv:
2195 case Intrinsic::masked_sdiv:
2196 case Intrinsic::masked_urem:
2197 case Intrinsic::masked_srem:
2198 return thisT()->getTypeBasedIntrinsicInstrCost(ICA,
CostKind);
2199 case Intrinsic::modf:
2200 case Intrinsic::sincos:
2201 case Intrinsic::sincospi: {
2202 std::optional<unsigned> CallRetElementIndex;
2205 if (ICA.
getID() == Intrinsic::modf)
2206 CallRetElementIndex = 0;
2208 if (
auto Cost = getMultipleResultIntrinsicVectorLibCallCost(
2209 ICA,
CostKind, CallRetElementIndex))
2214 case Intrinsic::loop_dependence_war_mask:
2215 case Intrinsic::loop_dependence_raw_mask: {
2233 bool IsReadAfterWrite = IID == Intrinsic::loop_dependence_raw_mask;
2236 thisT()->getArithmeticInstrCost(Instruction::Sub, AddrTy,
CostKind);
2237 if (IsReadAfterWrite) {
2239 Cost += thisT()->getIntrinsicInstrCost(AbsAttrs,
CostKind);
2244 Cost += thisT()->getArithmeticInstrCost(Instruction::SDiv, AddrTy,
2250 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, CondTy, AddrTy,
2252 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, AddrTy,
2256 {AddrTy, AddrTy}, FMF);
2257 Cost += thisT()->getIntrinsicInstrCost(Attrs,
CostKind);
2267 ScalarizationCost = 0;
2276 filterConstantAndDuplicatedOperands(Args, ICA.
getArgTypes()),
2282 return thisT()->getTypeBasedIntrinsicInstrCost(Attrs,
CostKind);
2303 unsigned VecTyIndex = 0;
2304 if (IID == Intrinsic::vector_reduce_fadd ||
2305 IID == Intrinsic::vector_reduce_fmul)
2307 assert(Tys.
size() > VecTyIndex &&
"Unexpected IntrinsicCostAttributes");
2324 SkipScalarizationCost ? ScalarizationCostPassed : 0;
2325 unsigned ScalarCalls = 1;
2326 Type *ScalarRetTy = RetTy;
2328 if (!SkipScalarizationCost)
2331 ScalarCalls = std::max(ScalarCalls,
2336 for (
Type *Ty : Tys) {
2338 if (!SkipScalarizationCost)
2341 ScalarCalls = std::max(ScalarCalls,
2343 Ty = Ty->getScalarType();
2347 if (ScalarCalls == 1)
2352 thisT()->getIntrinsicInstrCost(ScalarAttrs,
CostKind);
2354 return ScalarCalls * ScalarCost + ScalarizationCost;
2358 case Intrinsic::sqrt:
2361 case Intrinsic::sin:
2364 case Intrinsic::cos:
2367 case Intrinsic::sincos:
2370 case Intrinsic::sincospi:
2373 case Intrinsic::modf:
2376 case Intrinsic::tan:
2379 case Intrinsic::asin:
2382 case Intrinsic::acos:
2385 case Intrinsic::atan:
2388 case Intrinsic::atan2:
2391 case Intrinsic::sinh:
2394 case Intrinsic::cosh:
2397 case Intrinsic::tanh:
2400 case Intrinsic::exp:
2403 case Intrinsic::exp2:
2406 case Intrinsic::exp10:
2409 case Intrinsic::log:
2412 case Intrinsic::log10:
2415 case Intrinsic::log2:
2418 case Intrinsic::ldexp:
2421 case Intrinsic::fabs:
2424 case Intrinsic::canonicalize:
2427 case Intrinsic::minnum:
2430 case Intrinsic::maxnum:
2433 case Intrinsic::minimum:
2436 case Intrinsic::maximum:
2439 case Intrinsic::minimumnum:
2442 case Intrinsic::maximumnum:
2445 case Intrinsic::copysign:
2448 case Intrinsic::floor:
2451 case Intrinsic::ceil:
2454 case Intrinsic::trunc:
2457 case Intrinsic::nearbyint:
2460 case Intrinsic::rint:
2463 case Intrinsic::lrint:
2466 case Intrinsic::llrint:
2469 case Intrinsic::round:
2472 case Intrinsic::roundeven:
2475 case Intrinsic::lround:
2478 case Intrinsic::llround:
2481 case Intrinsic::pow:
2484 case Intrinsic::fma:
2487 case Intrinsic::fmuladd:
2490 case Intrinsic::experimental_constrained_fmuladd:
2494 case Intrinsic::lifetime_start:
2495 case Intrinsic::lifetime_end:
2496 case Intrinsic::sideeffect:
2497 case Intrinsic::pseudoprobe:
2498 case Intrinsic::arithmetic_fence:
2500 case Intrinsic::masked_store: {
2502 Align TyAlign = thisT()->DL.getABITypeAlign(Ty);
2503 return thisT()->getMemIntrinsicInstrCost(
2506 case Intrinsic::masked_load: {
2508 Align TyAlign = thisT()->DL.getABITypeAlign(Ty);
2509 return thisT()->getMemIntrinsicInstrCost(
2512 case Intrinsic::speculative_load: {
2514 Align Alignment =
I ?
I->getParamAlign(0).valueOrOne() :
Align(1);
2515 unsigned AS = Tys[0]->getPointerAddressSpace();
2516 return thisT()->getMemIntrinsicInstrCost(
2519 case Intrinsic::experimental_vp_strided_store: {
2521 Align Alignment = thisT()->DL.getABITypeAlign(Ty->getElementType());
2522 return thisT()->getMemIntrinsicInstrCost(
2528 case Intrinsic::experimental_vp_strided_load: {
2530 Align Alignment = thisT()->DL.getABITypeAlign(Ty->getElementType());
2531 return thisT()->getMemIntrinsicInstrCost(
2537 case Intrinsic::vector_reduce_add:
2538 case Intrinsic::vector_reduce_mul:
2539 case Intrinsic::vector_reduce_and:
2540 case Intrinsic::vector_reduce_or:
2541 case Intrinsic::vector_reduce_xor:
2542 return thisT()->getArithmeticReductionCost(
2545 case Intrinsic::vector_reduce_fadd:
2546 case Intrinsic::vector_reduce_fmul:
2547 return thisT()->getArithmeticReductionCost(
2549 case Intrinsic::vector_reduce_smax:
2550 case Intrinsic::vector_reduce_smin:
2551 case Intrinsic::vector_reduce_umax:
2552 case Intrinsic::vector_reduce_umin:
2553 case Intrinsic::vector_reduce_fmax:
2554 case Intrinsic::vector_reduce_fmin:
2555 case Intrinsic::vector_reduce_fmaximum:
2556 case Intrinsic::vector_reduce_fminimum:
2557 case Intrinsic::vector_reduce_fmaximumnum:
2558 case Intrinsic::vector_reduce_fminimumnum:
2561 case Intrinsic::experimental_vector_match: {
2564 unsigned SearchSize = NeedleTy->getNumElements();
2569 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, NeedleTy,
2571 Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, SearchTy,
2575 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, SearchTy, RetTy,
2578 thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy,
CostKind);
2581 thisT()->getArithmeticInstrCost(BinaryOperator::And, RetTy,
CostKind);
2584 case Intrinsic::vector_reverse:
2588 case Intrinsic::experimental_vector_histogram_add:
2589 case Intrinsic::experimental_vector_histogram_uadd_sat:
2590 case Intrinsic::experimental_vector_histogram_umax:
2591 case Intrinsic::experimental_vector_histogram_umin: {
2599 Align Alignment = thisT()->DL.getABITypeAlign(EltTy);
2601 Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, PtrsTy,
2603 Cost += thisT()->getMemoryOpCost(Instruction::Load, EltTy, Alignment, 0,
2608 case Intrinsic::experimental_vector_histogram_add:
2610 thisT()->getArithmeticInstrCost(Instruction::Add, EltTy,
CostKind);
2612 case Intrinsic::experimental_vector_histogram_uadd_sat: {
2617 case Intrinsic::experimental_vector_histogram_umax: {
2622 case Intrinsic::experimental_vector_histogram_umin: {
2628 Cost += thisT()->getMemoryOpCost(Instruction::Store, EltTy, Alignment, 0,
2633 case Intrinsic::get_active_lane_mask: {
2635 EVT ResVT = getTLI()->getValueType(
DL, RetTy,
true);
2636 EVT ArgVT = getTLI()->getValueType(
DL, ArgTy,
true);
2640 if (!getTLI()->shouldExpandGetActiveLaneMask(ResVT, ArgVT))
2649 thisT()->getTypeBasedIntrinsicInstrCost(Attrs,
CostKind);
2650 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, ExpRetTy, RetTy,
2654 case Intrinsic::experimental_memset_pattern:
2659 case Intrinsic::abs:
2662 case Intrinsic::fshl:
2665 case Intrinsic::fshr:
2668 case Intrinsic::smax:
2671 case Intrinsic::smin:
2674 case Intrinsic::umax:
2677 case Intrinsic::umin:
2680 case Intrinsic::sadd_sat:
2683 case Intrinsic::ssub_sat:
2686 case Intrinsic::uadd_sat:
2689 case Intrinsic::usub_sat:
2692 case Intrinsic::smul_fix:
2695 case Intrinsic::umul_fix:
2698 case Intrinsic::sadd_with_overflow:
2701 case Intrinsic::ssub_with_overflow:
2704 case Intrinsic::uadd_with_overflow:
2707 case Intrinsic::usub_with_overflow:
2710 case Intrinsic::smul_with_overflow:
2713 case Intrinsic::umul_with_overflow:
2716 case Intrinsic::fptosi_sat:
2717 case Intrinsic::fptoui_sat: {
2723 if (!SrcLT.first.isValid() || !RetLT.first.isValid())
2729 case Intrinsic::ctpop:
2735 case Intrinsic::ctlz:
2738 case Intrinsic::cttz:
2741 case Intrinsic::bswap:
2744 case Intrinsic::bitreverse:
2747 case Intrinsic::ucmp:
2750 case Intrinsic::scmp:
2753 case Intrinsic::clmul:
2756 case Intrinsic::smulh:
2759 case Intrinsic::umulh:
2762 case Intrinsic::masked_udiv:
2763 case Intrinsic::masked_sdiv:
2764 case Intrinsic::masked_urem:
2765 case Intrinsic::masked_srem: {
2766 unsigned UnmaskedOpc;
2768 case Intrinsic::masked_udiv:
2770 UnmaskedOpc = Instruction::UDiv;
2772 case Intrinsic::masked_sdiv:
2774 UnmaskedOpc = Instruction::SDiv;
2776 case Intrinsic::masked_urem:
2778 UnmaskedOpc = Instruction::URem;
2780 case Intrinsic::masked_srem:
2782 UnmaskedOpc = Instruction::SRem;
2788 thisT()->getArithmeticInstrCost(UnmaskedOpc, RetTy,
CostKind);
2792 if (!getTLI()->isOperationLegalOrCustom(
ISD, LT)) {
2795 Cost += thisT()->getCmpSelInstrCost(
2805 Type *LegalizeTy = ST ? ST->getContainedType(0) : RetTy;
2811 if (IID == Intrinsic::fabs && LT.second.isFloatingPoint() &&
2821 return (LT.first * 2);
2823 return (LT.first * 1);
2827 return (LT.first * 2);
2831 case Intrinsic::fmuladd: {
2835 return thisT()->getArithmeticInstrCost(BinaryOperator::FMul, RetTy,
2837 thisT()->getArithmeticInstrCost(BinaryOperator::FAdd, RetTy,
2840 case Intrinsic::experimental_constrained_fmuladd: {
2842 Intrinsic::experimental_constrained_fmul, RetTy, Tys);
2844 Intrinsic::experimental_constrained_fadd, RetTy, Tys);
2845 return thisT()->getIntrinsicInstrCost(FMulAttrs,
CostKind) +
2846 thisT()->getIntrinsicInstrCost(FAddAttrs,
CostKind);
2848 case Intrinsic::smin:
2849 case Intrinsic::smax:
2850 case Intrinsic::umin:
2851 case Intrinsic::umax: {
2854 bool IsUnsigned = IID == Intrinsic::umax || IID == Intrinsic::umin;
2858 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
2860 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
2864 case Intrinsic::sadd_with_overflow:
2865 case Intrinsic::ssub_with_overflow: {
2868 unsigned Opcode = IID == Intrinsic::sadd_with_overflow
2869 ? BinaryOperator::Add
2870 : BinaryOperator::Sub;
2877 Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy,
CostKind);
2879 2 * thisT()->getCmpSelInstrCost(Instruction::ICmp, SumTy, OverflowTy,
2881 Cost += thisT()->getArithmeticInstrCost(BinaryOperator::Xor, OverflowTy,
2885 case Intrinsic::uadd_with_overflow:
2886 case Intrinsic::usub_with_overflow: {
2889 unsigned Opcode = IID == Intrinsic::uadd_with_overflow
2890 ? BinaryOperator::Add
2891 : BinaryOperator::Sub;
2897 Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy,
CostKind);
2898 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, SumTy,
2902 case Intrinsic::smul_with_overflow:
2903 case Intrinsic::umul_with_overflow: {
2908 bool IsSigned = IID == Intrinsic::smul_with_overflow;
2910 unsigned ExtOp = IsSigned ? Instruction::SExt : Instruction::ZExt;
2914 Cost += 2 * thisT()->getCastInstrCost(ExtOp, ExtTy, MulTy, CCH,
CostKind);
2916 thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy,
CostKind);
2917 Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, MulTy, ExtTy,
2919 Cost += thisT()->getArithmeticInstrCost(
2924 Cost += thisT()->getArithmeticInstrCost(
2925 Instruction::AShr, MulTy,
CostKind,
2929 Cost += thisT()->getCmpSelInstrCost(
2933 case Intrinsic::sadd_sat:
2934 case Intrinsic::ssub_sat: {
2940 ? Intrinsic::sadd_with_overflow
2941 : Intrinsic::ssub_with_overflow;
2948 nullptr, ScalarizationCostPassed);
2949 Cost += thisT()->getIntrinsicInstrCost(Attrs,
CostKind);
2950 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
2952 Cost += 2 * thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy,
2956 case Intrinsic::uadd_sat:
2957 case Intrinsic::usub_sat: {
2962 ? Intrinsic::uadd_with_overflow
2963 : Intrinsic::usub_with_overflow;
2967 nullptr, ScalarizationCostPassed);
2968 Cost += thisT()->getIntrinsicInstrCost(Attrs,
CostKind);
2970 thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
2974 case Intrinsic::smul_fix:
2975 case Intrinsic::umul_fix: {
2980 IID == Intrinsic::smul_fix ? Instruction::SExt : Instruction::ZExt;
2984 Cost += 2 * thisT()->getCastInstrCost(ExtOp, ExtTy, RetTy, CCH,
CostKind);
2986 thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy,
CostKind);
2987 Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, RetTy, ExtTy,
2989 Cost += thisT()->getArithmeticInstrCost(
2992 Cost += thisT()->getArithmeticInstrCost(
2995 Cost += thisT()->getArithmeticInstrCost(Instruction::Or, RetTy,
CostKind);
2998 case Intrinsic::abs: {
3003 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
3005 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
3008 Cost += thisT()->getArithmeticInstrCost(
3009 BinaryOperator::Sub, RetTy,
CostKind,
3013 case Intrinsic::fshl:
3014 case Intrinsic::fshr: {
3020 thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy,
CostKind);
3022 thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy,
CostKind);
3024 thisT()->getArithmeticInstrCost(BinaryOperator::Shl, RetTy,
CostKind);
3025 Cost += thisT()->getArithmeticInstrCost(BinaryOperator::LShr, RetTy,
3030 Cost += thisT()->getArithmeticInstrCost(
3032 : BinaryOperator::URem,
3033 RetTy,
CostKind, {TTI::OK_AnyValue, TTI::OP_None},
3034 {TTI::OK_UniformConstantValue, TTI::OP_None});
3036 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
3038 Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
3042 case Intrinsic::fptosi_sat:
3043 case Intrinsic::fptoui_sat: {
3046 Type *FromTy = Tys[0];
3047 bool IsSigned = IID == Intrinsic::fptosi_sat;
3052 Cost += thisT()->getIntrinsicInstrCost(Attrs1,
CostKind);
3055 Cost += thisT()->getIntrinsicInstrCost(Attrs2,
CostKind);
3056 Cost += thisT()->getCastInstrCost(
3057 IsSigned ? Instruction::FPToSI : Instruction::FPToUI, RetTy, FromTy,
3061 Cost += thisT()->getCmpSelInstrCost(
3063 Cost += thisT()->getCmpSelInstrCost(
3068 case Intrinsic::ucmp:
3069 case Intrinsic::scmp: {
3070 Type *CmpTy = Tys[0];
3073 thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, CmpTy, CondTy,
3076 thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, CmpTy, CondTy,
3083 Cost += 2 * thisT()->getCmpSelInstrCost(
3084 BinaryOperator::Select, RetTy, CondTy,
3089 2 * thisT()->getCastInstrCost(CastInst::ZExt, RetTy, CondTy,
3091 Cost += thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy,
3096 case Intrinsic::maximumnum:
3097 case Intrinsic::minimumnum: {
3112 thisT()->getIntrinsicInstrCost(FCanonicalizeAttrs,
CostKind);
3113 return LT.first + FCanonicalizeCost * 2;
3117 case Intrinsic::clmul: {
3122 thisT()->getArithmeticInstrCost(Instruction::And, RetTy,
CostKind);
3124 thisT()->getArithmeticInstrCost(Instruction::Or, RetTy,
CostKind);
3126 thisT()->getArithmeticInstrCost(Instruction::Xor, RetTy,
CostKind);
3128 thisT()->getArithmeticInstrCost(Instruction::Mul, RetTy,
CostKind);
3140 while (S < 32 &&
divideCeil(BW, S) > (1u << S))
3144 unsigned NaiveCost = 3 * BW;
3145 unsigned HolesCost = S * S + 3 * S + S * (S - 1) + (S - 1);
3147 if (HolesCost < NaiveCost &&
3150 return S * S * MulCost + 3 * S * AndCost + S * (S - 1) * XorCost +
3157 thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, RetTy,
3159 thisT()->getCmpSelInstrCost(Instruction::ICmp, RetTy, RetTy,
3161 InstructionCost PerBitCost = std::min(PerBitCostMul, PerBitCostBittest);
3162 return BW * PerBitCost;
3164 case Intrinsic::smulh:
3165 case Intrinsic::umulh: {
3168 bool IsSigned = IID == Intrinsic::smulh;
3169 unsigned ExtOp = IsSigned ? Instruction::SExt : Instruction::ZExt;
3172 2 * thisT()->getCastInstrCost(ExtOp, WideTy, RetTy,
3175 thisT()->getArithmeticInstrCost(Instruction::Mul, WideTy,
CostKind);
3176 Cost += thisT()->getArithmeticInstrCost(
3179 Cost += thisT()->getCastInstrCost(Instruction::Trunc, RetTy, WideTy,
3199 if (!SkipScalarizationCost) {
3200 ScalarizationCost = 0;
3201 for (
Type *RetVTy : RetVTys) {
3210 for (
Type *Ty : Tys) {
3211 if (Ty->isVectorTy())
3212 Ty = Ty->getScalarType();
3217 thisT()->getIntrinsicInstrCost(Attrs,
CostKind);
3218 for (
Type *Ty : Tys) {
3223 ScalarCalls = std::max(ScalarCalls,
3227 return ScalarCalls * ScalarCost + ScalarizationCost;
3231 return SingleCallCost;
3238 unsigned Id = MICA.
getID();
3244 case Intrinsic::experimental_vp_strided_load:
3245 case Intrinsic::experimental_vp_strided_store: {
3246 unsigned Opcode = Id == Intrinsic::experimental_vp_strided_load
3248 : Instruction::Store;
3252 return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment,
3255 case Intrinsic::masked_scatter:
3256 case Intrinsic::masked_gather:
3257 case Intrinsic::vp_scatter:
3258 case Intrinsic::vp_gather: {
3259 unsigned Opcode = (MICA.
getID() == Intrinsic::masked_gather ||
3260 MICA.
getID() == Intrinsic::vp_gather)
3262 : Instruction::Store;
3264 return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment,
3267 case Intrinsic::vp_load:
3268 case Intrinsic::vp_store:
3270 case Intrinsic::masked_load:
3271 case Intrinsic::masked_store: {
3273 Id == Intrinsic::masked_load ? Instruction::Load : Instruction::Store;
3275 return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment,
true,
false,
3278 case Intrinsic::masked_compressstore:
3279 case Intrinsic::masked_expandload: {
3280 unsigned Opcode = MICA.
getID() == Intrinsic::masked_expandload
3282 : Instruction::Store;
3285 return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment,
3289 case Intrinsic::vp_load_ff:
3291 case Intrinsic::speculative_load:
3293 return thisT()->getMemoryOpCost(Instruction::Load, DataTy, Alignment,
3319 if (!LT.first.isValid())
3324 FTp && LT.second.isFixedLengthVector() &&
3329 return divideCeil(FTp->getNumElements(), SubTp->getNumElements());
3331 return LT.first.getValue();
3368 Type *ScalarTy = Ty->getElementType();
3370 if ((Opcode == Instruction::Or || Opcode == Instruction::And) &&
3380 return thisT()->getCastInstrCost(Instruction::BitCast, ValTy, Ty,
3382 thisT()->getCmpSelInstrCost(Instruction::ICmp, ValTy,
3386 unsigned NumReduxLevels =
Log2_32(NumVecElts);
3389 std::pair<InstructionCost, MVT> LT = thisT()->getTypeLegalizationCost(Ty);
3390 unsigned LongVectorCount = 0;
3392 LT.second.isVector() ? LT.second.getVectorNumElements() : 1;
3393 while (NumVecElts > MVTLen) {
3396 ShuffleCost += thisT()->getShuffleCost(
3398 ArithCost += thisT()->getArithmeticInstrCost(Opcode, SubTy,
CostKind);
3403 NumReduxLevels -= LongVectorCount;
3415 NumReduxLevels * thisT()->getArithmeticInstrCost(Opcode, Ty,
CostKind);
3416 return ShuffleCost + ArithCost +
3417 thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
3451 return ExtractCost + ArithCost;
3456 std::optional<FastMathFlags> FMF,
3458 assert(Ty &&
"Unknown reduction vector type");
3474 Type *ScalarTy = Ty->getElementType();
3476 unsigned NumReduxLevels =
Log2_32(NumVecElts);
3479 std::pair<InstructionCost, MVT> LT = thisT()->getTypeLegalizationCost(Ty);
3480 unsigned LongVectorCount = 0;
3482 LT.second.isVector() ? LT.second.getVectorNumElements() : 1;
3483 while (NumVecElts > MVTLen) {
3487 ShuffleCost += thisT()->getShuffleCost(
3496 NumReduxLevels -= LongVectorCount;
3509 return ShuffleCost + MinMaxCost +
3510 thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
3516 VectorType *Ty, std::optional<FastMathFlags> FMF,
3519 FTy && IsUnsigned && Opcode == Instruction::Add &&
3527 return thisT()->getCastInstrCost(Instruction::BitCast, IntTy, FTy,
3529 thisT()->getIntrinsicInstrCost(ICA,
CostKind);
3535 thisT()->getArithmeticReductionCost(Opcode, ExtTy, FMF,
CostKind);
3537 IsUnsigned ? Instruction::ZExt : Instruction::SExt, ExtTy, Ty,
3540 return RedCost + ExtCost;
3550 assert((RedOpcode == Instruction::Add || RedOpcode == Instruction::Sub) &&
3551 "The reduction opcode is expected to be Add or Sub.");
3554 RedOpcode, ExtTy, std::nullopt,
CostKind);
3556 IsUnsigned ? Instruction::ZExt : Instruction::SExt, ExtTy, Ty,
3560 thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy,
CostKind);
3562 return RedCost + MulCost + 2 * ExtCost;
3566 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
3570 std::optional<FastMathFlags> FMF)
const override {
3573 unsigned Ratio = EltSizeAcc / EltSizeInA;
3575 EltSizeAcc % EltSizeInA != 0 || (BinOp && InputTypeA != InputTypeB))
3580 Type *AccumVectorType =
3596 return ExtendCostA + ReductionOpCost;
3604 return ExtendCostA + ExtendCostB + ReductionOpCost +
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static const Function * getCalledFunction(const Value *V)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
bool sgt(const APInt &RHS) const
Signed greater than comparison.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool slt(const APInt &RHS) const
Signed less than comparison.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
size_t size() const
Get the array size.
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
InstructionCost getFPOpCost(Type *Ty) const override
bool preferToKeepConstantsAttached(const Instruction &Inst, const Function &Fn) const override
InstructionCost getInterleavedMemoryOpCost(unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef< unsigned > Indices, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, bool UseMaskForCond=false, bool UseMaskForGaps=false) const override
InstructionCost getMinMaxReductionCost(Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF, TTI::TargetCostKind CostKind) const override
Try to calculate op costs for min/max reduction operations.
bool isIndexedLoadLegal(TTI::MemIndexedMode M, Type *Ty) const override
unsigned getCallerAllocaCost(const CallBase *CB, const AllocaInst *AI) const override
InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const override
bool shouldBuildLookupTables() const override
bool isNoopAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override
bool isProfitableToHoist(Instruction *I) const override
unsigned getNumberOfParts(Type *Tp) const override
unsigned getMinPrefetchStride(unsigned NumMemAccesses, unsigned NumStridedMemAccesses, unsigned NumPrefetches, bool HasCall) const override
bool useAA() const override
unsigned getPrefetchDistance() const override
TTI::ShuffleKind improveShuffleKindFromMask(TTI::ShuffleKind Kind, ArrayRef< int > Mask, VectorType *SrcTy, int &Index, VectorType *&SubTy) const
InstructionCost getOperandsScalarizationOverhead(ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
Estimate the overhead of scalarizing an instruction's operands.
bool isLegalAddScalableImmediate(int64_t Imm) const override
unsigned getAssumedAddrSpace(const Value *V) const override
std::optional< Value * > simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const override
bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace, Instruction *I=nullptr, int64_t ScalableOffset=0) const override
bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const override
bool areInlineCompatible(const Function *Caller, const Function *Callee) const override
bool isIndexedStoreLegal(TTI::MemIndexedMode M, Type *Ty) const override
bool haveFastSqrt(Type *Ty) const override
bool collectFlatAddressOperands(SmallVectorImpl< int > &OpIndexes, Intrinsic::ID IID) const override
unsigned getEstimatedNumberOfCaseClusters(const SwitchInst &SI, unsigned &JumpTableSize, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) const override
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy, Align Alignment, unsigned AddrSpace) const override
Value * rewriteIntrinsicWithAddressSpace(IntrinsicInst *II, Value *OldV, Value *NewV) const override
unsigned adjustInliningThreshold(const CallBase *CB) const override
unsigned getInliningThresholdMultiplier() const override
InstructionCost getScalarizationOverhead(VectorType *InTy, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
Estimate the overhead of scalarizing an instruction.
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, Value *Scalar, ArrayRef< std::tuple< Value *, User *, int > > ScalarUserAndIdx, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
int64_t getPreferredLargeGEPBaseOffset(int64_t MinOffset, int64_t MaxOffset)
bool shouldBuildRelLookupTables() const override
bool isTargetIntrinsicWithStructReturnOverloadAtField(Intrinsic::ID ID, int RetIdx) const override
InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Op2Info={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
InstructionCost getArithmeticInstrCost(unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, TTI::OperandValueInfo Opd1Info={TTI::OK_AnyValue, TTI::OP_None}, TTI::OperandValueInfo Opd2Info={TTI::OK_AnyValue, TTI::OP_None}, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr) const override
InstructionCost getVectorInstrCost(const Instruction &I, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, StackOffset BaseOffset, bool HasBaseReg, int64_t Scale, unsigned AddrSpace) const override
unsigned getEpilogueVectorizationMinVF() const override
InstructionCost getExtractWithExtendCost(unsigned Opcode, Type *Dst, VectorType *VecTy, unsigned Index, TTI::TargetCostKind CostKind) const override
InstructionCost getVectorSplitCost() const
bool isTruncateFree(Type *Ty1, Type *Ty2) const override
unsigned getFlatAddressSpace() const override
InstructionCost getCallInstrCost(Function *F, Type *RetTy, ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind) const override
Compute a cost of the given call instruction.
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE, TTI::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE) const override
InstructionCost getTreeReductionCost(unsigned Opcode, VectorType *Ty, TTI::TargetCostKind CostKind) const
Try to calculate arithmetic and shuffle op costs for reduction intrinsics.
~BasicTTIImplBase() override=default
std::pair< const Value *, unsigned > getPredicatedAddrSpace(const Value *V) const override
unsigned getMaxPrefetchIterationsAhead() const override
unsigned getMaxInterleaveFactor(ElementCount VF, bool HasUnorderedReductions) const override
void getPeelingPreferences(Loop *L, ScalarEvolution &SE, TTI::PeelingPreferences &PP) const override
InstructionCost getTypeBasedIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const
Get intrinsic cost based on argument types.
bool hasBranchDivergence(const Function *F=nullptr) const override
InstructionCost getOrderedReductionCost(unsigned Opcode, VectorType *Ty, TTI::TargetCostKind CostKind) const
Try to calculate the cost of performing strict (in-order) reductions, which involves doing a sequence...
std::optional< unsigned > getCacheAssociativity(TargetTransformInfo::CacheLevel Level) const override
bool shouldPrefetchAddressSpace(unsigned AS) const override
bool allowsMisalignedMemoryAccesses(LLVMContext &Context, unsigned BitWidth, unsigned AddressSpace, Align Alignment, unsigned *Fast) const override
unsigned getCacheLineSize() const override
std::optional< Instruction * > instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const override
bool shouldDropLSRSolutionIfLessProfitable() const override
int getInlinerVectorBonusPercent() const override
InstructionCost getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind) const override
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, TTI::TargetCostKind CostKind, ArrayRef< int > Mask, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CtxI=nullptr, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
InstructionCost getIndexedVectorInstrCostFromEnd(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) const override
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
std::pair< InstructionCost, MVT > getTypeLegalizationCost(Type *Ty) const
Estimate the cost of type-legalization and the legalized type.
InstructionCost getPartialReductionCost(unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType, ElementCount VF, TTI::PartialReductionExtendKind OpAExtend, TTI::PartialReductionExtendKind OpBExtend, std::optional< unsigned > BinOp, TTI::TargetCostKind CostKind, std::optional< FastMathFlags > FMF) const override
bool isLegalAddImmediate(int64_t imm) const override
InstructionCost getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts, TTI::TargetCostKind CostKind) const override
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const override
bool isProfitableLSRChainElement(Instruction *I) const override
bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override
bool isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID, int OpdIdx) const override
bool isTargetIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx) const override
std::optional< unsigned > getVScaleForTuning() const override
InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, std::optional< FastMathFlags > FMF, TTI::TargetCostKind CostKind) const override
InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind) const override
Get intrinsic cost based on arguments.
bool preferTailFoldingOverEpilogue(TailFoldingInfo *TFI) const override
std::optional< Value * > simplifyDemandedVectorEltsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp) const override
InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *, const SCEV *, TTI::TargetCostKind) const override
bool isFCmpOrdCheaperThanFCmpZero(Type *Ty) const override
InstructionCost getScalarizationOverhead(VectorType *RetTy, ArrayRef< const Value * > Args, ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind) const
Estimate the overhead of scalarizing the inputs and outputs of an instruction, with return type RetTy...
TailFoldingStyle getPreferredTailFoldingStyle() const override
std::optional< unsigned > getCacheSize(TargetTransformInfo::CacheLevel Level) const override
bool isLegalICmpImmediate(int64_t imm) const override
InstructionCost getGEPCost(Type *PointeeType, const Value *Ptr, ArrayRef< const Value * > Operands, TTI::TargetCostKind CostKind, Type *AccessType) const override
bool isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE, AssumptionCache &AC, TargetLibraryInfo *LibInfo, HardwareLoopInfo &HWLoopInfo) const override
unsigned getRegUsageForType(Type *Ty) const override
InstructionCost getMemIntrinsicInstrCost(const MemIntrinsicCostAttributes &MICA, TTI::TargetCostKind CostKind) const override
Get memory intrinsic cost based on arguments.
BasicTTIImplBase(const TargetMachine *TM, const DataLayout &DL)
InstructionCost getMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpInfo={TTI::OK_AnyValue, TTI::OP_None}, const Instruction *I=nullptr) const override
bool isTypeLegal(Type *Ty) const override
bool enableWritePrefetching() const override
bool isLSRCostLess(const TTI::LSRCost &C1, const TTI::LSRCost &C2) const override
InstructionCost getScalarizationOverhead(VectorType *InTy, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None) const
Helper wrapper for the DemandedElts variant of getScalarizationOverhead.
InstructionCost getBranchMispredictPenalty() const override
bool isNumRegsMajorCostOfLSR() const override
LLVM_ABI BasicTTIImpl(const TargetMachine *TM, const Function &F)
size_type count() const
Returns the number of bits which are set.
BitVector & set()
Set all bits in the bitvector.
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...
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLE
signed less or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID)
static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID)
This class represents a range of values.
A parsed version of the target data layout string in and methods for querying it.
constexpr bool isVector() const
One or more elements.
static constexpr ElementCount getFixed(ScalarTy MinVal)
constexpr bool isScalar() const
Exactly one element.
Convenience struct for specifying and reasoning about fast-math flags.
Container class for subtarget features.
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
AttributeList getAttributes() const
Return the attribute list for this Function.
The core instruction combiner logic.
static InstructionCost getInvalid(CostType Val=0)
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
FastMathFlags getFlags() const
const SmallVectorImpl< Type * > & getArgTypes() const
Type * getReturnType() const
bool skipScalarizationCost() const
const SmallVectorImpl< const Value * > & getArgs() const
InstructionCost getScalarizationCost() const
const IntrinsicInst * getInst() const
Intrinsic::ID getID() const
bool isTypeBasedOnly() const
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
Represents a single loop in the control flow graph.
const FeatureBitset & getFeatureBits() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Information for memory intrinsic cost model.
Align getAlignment() const
unsigned getAddressSpace() const
Type * getDataType() const
bool getVariableMask() const
Intrinsic::ID getID() const
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Analysis providing profile information.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
static LLVM_ABI bool isZeroEltSplatMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses all elements with the same value as the first element of exa...
static LLVM_ABI bool isSpliceMask(ArrayRef< int > Mask, int NumSrcElts, int &Index)
Return true if this shuffle mask is a splice mask, concatenating the two inputs together and then ext...
static LLVM_ABI bool isSelectMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses elements from its source vectors without lane crossings.
static LLVM_ABI bool isExtractSubvectorMask(ArrayRef< int > Mask, int NumSrcElts, int &Index)
Return true if this shuffle mask is an extract subvector mask.
static LLVM_ABI bool isReverseMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask swaps the order of elements from exactly one source vector.
static LLVM_ABI bool isTransposeMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask is a transpose mask.
static LLVM_ABI bool isInsertSubvectorMask(ArrayRef< int > Mask, int NumSrcElts, int &NumSubElts, int &Index)
Return true if this shuffle mask is an insert subvector mask.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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)
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Provides information about what library functions are available for the current target.
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
bool isOperationExpand(unsigned Op, EVT VT) const
Return true if the specified operation is illegal on this target or unlikely to be made legal with cu...
int InstructionOpcodeToISD(unsigned Opcode) const
Get the ISD node that corresponds to the Instruction class opcode.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
virtual bool preferSelectsOverBooleanArithmetic(EVT VT) const
Should we prefer selects to doing arithmetic on boolean types.
virtual bool isFreeAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DestAS) const
Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
@ TypeScalarizeScalableVector
virtual bool isSuitableForJumpTable(const SwitchInst *SI, uint64_t NumCases, uint64_t Range, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) const
Return true if lowering to a jump table is suitable for a set of case clusters which may contain NumC...
virtual bool areJTsAllowed(const Function *Fn) const
Return true if lowering to a jump table is allowed.
bool isOperationLegalOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal using promotion.
LegalizeAction getTruncStoreAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace) const
Return how this store with truncation should be treated: either it is legal, needs to be promoted to ...
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
bool isSuitableForBitTests(const DenseMap< const BasicBlock *, unsigned int > &DestCmps, const APInt &Low, const APInt &High, const DataLayout &DL) const
Return true if lowering to a bit test is suitable for a set of case clusters which contains NumDests ...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
LegalizeAction getLoadAction(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return how this load with extension should be treated: either it is legal, needs to be promoted to a ...
LegalizeKind getTypeConversion(LLVMContext &Context, EVT VT) const
Return pair that represents the legalization kind (first) that needs to happen to EVT (second) in ord...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal on this target.
virtual bool isFAbsFree(EVT VT) const
Return true if an fabs operation is free to the point where it is never worthwhile to replace it with...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
std::pair< LegalizeTypeAction, EVT > LegalizeKind
LegalizeKind holds the legalization kind that needs to happen to EVT in order to type-legalize it.
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
const Triple & getTargetTriple() const
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
CodeModel::Model getCodeModel() const
Returns the code model.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const FeatureBitset & getInlineMustMatchFeatures() const =0
Target features where all mismatches prevent inlining.
virtual const FeatureBitset & getInlineInverseFeatures() const =0
Target features where the callee may have an additional feature, instead of the caller.
virtual const FeatureBitset & getInlineIgnoreFeatures() const =0
Target features to ignore for inline compatibility check.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
LLVM_ABI bool isArch64Bit() const
Test whether the architecture is 64-bit.
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
static constexpr TypeSize getFixed(ScalarTy ExactSize)
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.
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVM_ABI Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
Value * getOperand(unsigned i) const
static LLVM_ABI std::optional< unsigned > getFunctionalOpcodeForVP(Intrinsic::ID ID)
static LLVM_ABI std::optional< Intrinsic::ID > getFunctionalIntrinsicIDForVP(Intrinsic::ID ID)
static LLVM_ABI bool isVPIntrinsic(Intrinsic::ID)
static LLVM_ABI bool isVPReduction(Intrinsic::ID ID)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
Base class of all SIMD vector types.
static VectorType * getHalfElementsVectorType(VectorType *VTy)
This static method returns a VectorType with half as many elements as the input type and the same ele...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Type * getElementType() const
constexpr ScalarTy getFixedValue() const
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
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.
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
@ BSWAP
Byte Swap and Counting operators.
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ FADD
Simple binary floating point operators.
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ CLMUL
Carry-less multiplication operations.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SSUBO
Same for subtraction.
@ BRIND
BRIND - Indirect branch.
@ BR_JT
BR_JT - Jumptable branch.
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SMULO
Same for multiplication.
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isTargetIntrinsic(ID IID)
isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.
DiagnosticInfoOptimizationBase::Argument NV
friend class Instruction
Iterator for Instructions in a `BasicBlock.
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.
LLVM_ABI Intrinsic::ID getMinMaxReductionIntrinsicOp(Intrinsic::ID RdxID)
Returns the min/max intrinsic used when expanding a min/max reduction.
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
@ 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,...
Type * toScalarizedTy(Type *Ty)
A helper for converting vectorized types to scalarized (non-vector) types.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
LLVM_ABI unsigned getArithmeticReductionInstruction(Intrinsic::ID RdxID)
Returns the arithmetic instruction opcode used when expanding a reduction.
bool isVectorizedTy(Type *Ty)
Returns true if Ty is a vector type or a struct of vector types where all vector types share the same...
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
auto dyn_cast_or_null(const Y &Val)
LLVM_ABI std::optional< unsigned > getPartialUnrollingThreshold()
Returns -partial-unrolling-threshold if specified.
constexpr bool has_single_bit(T Value) noexcept
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
ElementCount getVectorizedTypeVF(Type *Ty)
Returns the number of vector elements for a vectorized type.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
ArrayRef< Type * > getContainedTypes(Type *const &Ty)
Returns the types contained in Ty.
LLVM_ABI bool isVectorizedStructTy(StructType *StructTy)
Returns true if StructTy is an unpacked literal struct where all elements are vectors of matching ele...
This struct is a compact representation of a valid (non-zero power of two) alignment.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
ElementCount getVectorElementCount() const
static LLVM_ABI EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
Attributes of a target dependent hardware loop.
static LLVM_ABI bool hasVectorMaskArgument(RTLIB::LibcallImpl Impl)
Returns true if the function has a vector mask argument, which is assumed to be the last argument.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...