16#ifndef LLVM_CODEGEN_BASICTTIIMPL_H 
   17#define LLVM_CODEGEN_BASICTTIIMPL_H 
   88  const T *thisT()
 const { 
return static_cast<const T *
>(
this); }
 
   98    Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
 
  102      Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, VTy,
 
  122      Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, VTy,
 
  124      Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
 
  137           "Can only extract subvectors from vectors");
 
  140            (Index + NumSubElts) <=
 
  142           "SK_ExtractSubvector index out of range");
 
  148    for (
int i = 0; i != NumSubElts; ++i) {
 
  150          thisT()->getVectorInstrCost(Instruction::ExtractElement, VTy,
 
  151                                      CostKind, i + Index, 
nullptr, 
nullptr);
 
  152      Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, SubVTy,
 
  165           "Can only insert subvectors into vectors");
 
  168            (Index + NumSubElts) <=
 
  170           "SK_InsertSubvector index out of range");
 
  176    for (
int i = 0; i != NumSubElts; ++i) {
 
  177      Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, SubVTy,
 
  180          thisT()->getVectorInstrCost(Instruction::InsertElement, VTy, 
CostKind,
 
  181                                      i + Index, 
nullptr, 
nullptr);
 
  188    return static_cast<const T *
>(
this)->getST();
 
  193    return static_cast<const T *
>(
this)->getTLI();
 
  215                                              bool IsGatherScatter,
 
  223    unsigned VF = VT->getNumElements();
 
  238        VF * thisT()->getMemoryOpCost(Opcode, VT->getElementType(), Alignment,
 
  244                                 Opcode == Instruction::Store, 
CostKind);
 
  258          VF * (thisT()->getCFInstrCost(Instruction::Br, 
CostKind) +
 
  259                thisT()->getCFInstrCost(Instruction::PHI, 
CostKind));
 
  262    return AddrExtractCost + MemoryOpCost + PackingCost + ConditionalCost;
 
  270  static bool isSplatMask(
ArrayRef<int> Mask, 
unsigned NumSrcElts, 
int &Index) {
 
  272    bool IsCompared = 
false;
 
  276            return P.index() != Mask.size() - 1 || IsCompared;
 
  277          if (
static_cast<unsigned>(
P.value()) >= NumSrcElts * 2)
 
  280            SplatIdx = 
P.value();
 
  281            return P.index() != Mask.size() - 1;
 
  284          return SplatIdx == 
P.value();
 
  303  std::optional<InstructionCost> getMultipleResultIntrinsicVectorLibCallCost(
 
  306      std::optional<unsigned> CallRetElementIndex = {}) 
const {
 
  315    const char *LCName = getTLI()->getLibcallName(LC);
 
  323    for (
bool Masked : {
false, 
true}) {
 
  324      if ((VD = LibInfo->getVectorMappingInfo(LCName, VF, 
Masked)))
 
  336                                      VecTy, {}, 
CostKind, 0, 
nullptr, {});
 
  342      if (Idx == CallRetElementIndex)
 
  344      Cost += thisT()->getMemoryOpCost(
 
  345          Instruction::Load, VectorTy,
 
  378                                      unsigned *
Fast)
 const override {
 
  380    return getTLI()->allowsMisalignedMemoryAccesses(
 
 
  385                           const Function *Callee)
 const override {
 
  389        TM.getSubtargetImpl(*Caller)->getFeatureBits();
 
  391        TM.getSubtargetImpl(*Callee)->getFeatureBits();
 
  395    return (CallerBits & CalleeBits) == CalleeBits;
 
 
  425    return getTLI()->getTargetMachine().isNoopAddrSpaceCast(FromAS, ToAS);
 
 
  429    return getTLI()->getTargetMachine().getAssumedAddrSpace(V);
 
 
  433    return getTLI()->getTargetMachine().Options.ThreadModel ==
 
 
  437  std::pair<const Value *, unsigned>
 
  439    return getTLI()->getTargetMachine().getPredicatedAddrSpace(V);
 
 
  443                                          Value *NewV)
 const override {
 
 
  448    return getTLI()->isLegalAddImmediate(imm);
 
 
  452    return getTLI()->isLegalAddScalableImmediate(Imm);
 
 
  456    return getTLI()->isLegalICmpImmediate(imm);
 
 
  460                             bool HasBaseReg, int64_t Scale, 
unsigned AddrSpace,
 
  462                             int64_t ScalableOffset = 0)
 const override {
 
  469    return getTLI()->isLegalAddressingMode(
DL, AM, Ty, AddrSpace, 
I);
 
 
  473    return getTLI()->getPreferredLargeGEPBaseOffset(MinOffset, MaxOffset);
 
 
  477                             Type *ScalarValTy)
 const override {
 
  478    auto &&IsSupportedByTarget = [
this, ScalarMemTy, ScalarValTy](
unsigned VF) {
 
  480      EVT VT = getTLI()->getValueType(
DL, SrcTy);
 
  481      if (getTLI()->isOperationLegal(ISD::STORE, VT) ||
 
  482          getTLI()->isOperationCustom(ISD::STORE, VT))
 
  488          getTLI()->getTypeToTransformTo(ScalarMemTy->
getContext(), VT);
 
  489      return getTLI()->isTruncStoreLegal(LegalizedVT, ValVT);
 
  491    while (VF > 2 && IsSupportedByTarget(VF))
 
 
  497    EVT VT = getTLI()->getValueType(
DL, Ty, 
true);
 
  498    return getTLI()->isIndexedLoadLegal(getISDIndexedMode(M), VT);
 
 
  502    EVT VT = getTLI()->getValueType(
DL, Ty, 
true);
 
  503    return getTLI()->isIndexedStoreLegal(getISDIndexedMode(M), VT);
 
 
  526                                       unsigned AddrSpace)
 const override {
 
 
  539    return getTLI()->isTruncateFree(Ty1, Ty2);
 
 
  543    return getTLI()->isProfitableToHoist(
I);
 
 
  546  bool useAA()
 const override { 
return getST()->useAA(); }
 
  549    EVT VT = getTLI()->getValueType(
DL, Ty, 
true);
 
  550    return getTLI()->isTypeLegal(VT);
 
 
  554    EVT ETy = getTLI()->getValueType(
DL, Ty);
 
  555    return getTLI()->getNumRegisters(Ty->getContext(), ETy);
 
 
  574    unsigned N = 
SI.getNumCases();
 
  582    if (
N < 1 || (!IsJTAllowed && 
DL.getIndexSizeInBits(0u) < 
N))
 
  585    APInt MaxCaseVal = 
SI.case_begin()->getCaseValue()->getValue();
 
  586    APInt MinCaseVal = MaxCaseVal;
 
  587    for (
auto CI : 
SI.cases()) {
 
  588      const APInt &CaseVal = CI.getCaseValue()->getValue();
 
  589      if (CaseVal.
sgt(MaxCaseVal))
 
  590        MaxCaseVal = CaseVal;
 
  591      if (CaseVal.
slt(MinCaseVal))
 
  592        MinCaseVal = CaseVal;
 
  596    if (
N <= 
DL.getIndexSizeInBits(0u)) {
 
  598      for (
auto I : 
SI.cases()) {
 
  609      if (
N < 2 || 
N < TLI->getMinimumJumpTableEntries())
 
  612          (MaxCaseVal - MinCaseVal)
 
  613              .getLimitedValue(std::numeric_limits<uint64_t>::max() - 1) + 1;
 
  616        JumpTableSize = 
Range;
 
 
  632    if (!TM.isPositionIndependent())
 
  642    const Triple &TargetTriple = TM.getTargetTriple();
 
 
  674                                     const Function &Fn)
 const override {
 
  678    case Instruction::SDiv:
 
  679    case Instruction::SRem:
 
  680    case Instruction::UDiv:
 
  681    case Instruction::URem: {
 
 
  733    else if (ST->getSchedModel().LoopMicroOpBufferSize > 0)
 
  734      MaxOps = ST->getSchedModel().LoopMicroOpBufferSize;
 
  751                     << 
"advising against unrolling the loop because it " 
 
  802  std::optional<Instruction *>
 
  807  std::optional<Value *>
 
  810                                   bool &KnownBitsComputed)
 const override {
 
 
  819          SimplifyAndSetOp)
 const override {
 
  821        IC, 
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
 
 
  825  std::optional<unsigned>
 
  827    return std::optional<unsigned>(
 
 
  831  std::optional<unsigned>
 
  833    std::optional<unsigned> TargetResult =
 
  834        getST()->getCacheAssociativity(
static_cast<unsigned>(Level));
 
 
  843    return getST()->getCacheLineSize();
 
 
  847    return getST()->getPrefetchDistance();
 
 
  851                                unsigned NumStridedMemAccesses,
 
  852                                unsigned NumPrefetches,
 
  853                                bool HasCall)
 const override {
 
  854    return getST()->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
 
  855                                         NumPrefetches, HasCall);
 
 
  859    return getST()->getMaxPrefetchIterationsAhead();
 
 
  863    return getST()->enableWritePrefetching();
 
 
  867    return getST()->shouldPrefetchAddressSpace(AS);
 
 
  880  std::optional<unsigned> 
getMaxVScale()
 const override { 
return std::nullopt; }
 
  890      VectorType *InTy, 
const APInt &DemandedElts, 
bool Insert, 
bool Extract,
 
  900           (VL.empty() || VL.size() == Ty->getNumElements()) &&
 
  901           "Vector size mismatch");
 
  905    for (
int i = 0, e = Ty->getNumElements(); i < e; ++i) {
 
  906      if (!DemandedElts[i])
 
  909        Value *InsertedVal = VL.empty() ? nullptr : VL[i];
 
  910        Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, Ty,
 
  914        Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
 
 
  927                                     unsigned ScalarOpdIdx)
 const override {
 
 
  932                                              int OpdIdx)
 const override {
 
 
  938                                                   int RetIdx)
 const override {
 
 
  951    return thisT()->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
 
 
  961    for (
Type *Ty : Tys) {
 
  963      if (!Ty->isIntOrIntVectorTy() && !Ty->isFPOrFPVectorTy() &&
 
  964          !Ty->isPtrOrPtrVectorTy())
 
 
  987          filterConstantAndDuplicatedOperands(Args, Tys), 
CostKind);
 
 
 1000    EVT MTy = getTLI()->getValueType(
DL, Ty);
 
 1024      if (MTy == LK.second)
 
 
 1039      const Instruction *CxtI = 
nullptr) 
const override {
 
 1041    const TargetLoweringBase *TLI = getTLI();
 
 1042    int ISD = TLI->InstructionOpcodeToISD(Opcode);
 
 1043    assert(ISD && 
"Invalid opcode");
 
 1058    if (TLI->isOperationLegalOrPromote(ISD, 
LT.second)) {
 
 1061      return LT.first * OpCost;
 
 1064    if (!TLI->isOperationExpand(ISD, 
LT.second)) {
 
 1067      return LT.first * 2 * OpCost;
 
 1079        unsigned DivOpc = IsSigned ? Instruction::SDiv : Instruction::UDiv;
 
 1081            DivOpc, Ty, 
CostKind, Opd1Info, Opd2Info);
 
 1083            thisT()->getArithmeticInstrCost(Instruction::Mul, Ty, 
CostKind);
 
 1085            thisT()->getArithmeticInstrCost(Instruction::Sub, Ty, 
CostKind);
 
 1086        return DivCost + MulCost + SubCost;
 
 
 1118    int NumDstElts = Mask.size();
 
 1119    int NumSrcElts = SrcTy->getElementCount().getKnownMinValue();
 
 1126      if (isSplatMask(Mask, NumSrcElts, Index))
 
 1129          (Index + NumDstElts) <= NumSrcElts) {
 
 1136      if (
all_of(Mask, [NumSrcElts](
int M) { 
return M < NumSrcElts; }))
 
 1141                                Mask, NumSrcElts, NumSubElts, Index)) {
 
 1142        if (Index + NumSubElts > NumSrcElts)
 
 
 1171                 const Instruction *CxtI = 
nullptr) 
const override {
 
 1175        return getBroadcastShuffleOverhead(FVT, 
CostKind);
 
 1184        return getPermuteShuffleOverhead(FVT, 
CostKind);
 
 1187      return getExtractSubvectorOverhead(SrcTy, 
CostKind, Index,
 
 1190      return getInsertSubvectorOverhead(DstTy, 
CostKind, Index,
 
 
 1209    TypeSize SrcSize = SrcLT.second.getSizeInBits();
 
 1210    TypeSize DstSize = DstLT.second.getSizeInBits();
 
 1211    bool IntOrPtrSrc = Src->isIntegerTy() || Src->isPointerTy();
 
 1212    bool IntOrPtrDst = Dst->isIntegerTy() || Dst->isPointerTy();
 
 1217    case Instruction::Trunc:
 
 1222    case Instruction::BitCast:
 
 1225      if (SrcLT.first == DstLT.first && IntOrPtrSrc == IntOrPtrDst &&
 
 1229    case Instruction::FPExt:
 
 1230      if (
I && getTLI()->isExtFree(
I))
 
 1233    case Instruction::ZExt:
 
 1234      if (TLI->
isZExtFree(SrcLT.second, DstLT.second))
 
 1237    case Instruction::SExt:
 
 1238      if (
I && getTLI()->isExtFree(
I))
 
 1248        if (DstLT.first == SrcLT.first &&
 
 1253    case Instruction::AddrSpaceCast:
 
 1255                                   Dst->getPointerAddressSpace()))
 
 1264    if (SrcLT.first == DstLT.first &&
 
 1269    if (!SrcVTy && !DstVTy) {
 
 1280    if (DstVTy && SrcVTy) {
 
 1282      if (SrcLT.first == DstLT.first && SrcSize == DstSize) {
 
 1285        if (Opcode == Instruction::ZExt)
 
 1289        if (Opcode == Instruction::SExt)
 
 1290          return SrcLT.first * 2;
 
 1296          return SrcLT.first * 1;
 
 1309      if ((SplitSrc || SplitDst) && SrcVTy->getElementCount().isVector() &&
 
 1310          DstVTy->getElementCount().isVector()) {
 
 1313        const T *TTI = thisT();
 
 1316            (!SplitSrc || !SplitDst) ? TTI->getVectorSplitCost() : 0;
 
 1318               (2 * TTI->getCastInstrCost(Opcode, SplitDstTy, SplitSrcTy, CCH,
 
 1330          Opcode, Dst->getScalarType(), Src->getScalarType(), CCH, 
CostKind, 
I);
 
 1343    if (Opcode == Instruction::BitCast) {
 
 
 1360    return thisT()->getVectorInstrCost(Instruction::ExtractElement, VecTy,
 
 1361                                       CostKind, Index, 
nullptr, 
nullptr) +
 
 
 1377      const Instruction *
I = 
nullptr) 
const override {
 
 1378    const TargetLoweringBase *TLI = getTLI();
 
 1379    int ISD = TLI->InstructionOpcodeToISD(Opcode);
 
 1380    assert(ISD && 
"Invalid opcode");
 
 1384                                       Op1Info, Op2Info, 
I);
 
 1388      assert(CondTy && 
"CondTy must exist");
 
 1395        !TLI->isOperationExpand(ISD, 
LT.second)) {
 
 1398      return LT.first * 1;
 
 1410          Opcode, ValVTy->getScalarType(), CondTy->
getScalarType(), VecPred,
 
 
 1426                                     unsigned Index, 
const Value *Op0,
 
 1427                                     const Value *Op1)
 const override {
 
 
 1437                                     unsigned Index, 
Value *Scalar,
 
 1438                                     ArrayRef<std::tuple<Value *, User *, int>>
 
 1439                                         ScalarUserAndIdx)
 const override {
 
 1440    return thisT()->getVectorInstrCost(Opcode, Val, 
CostKind, Index, 
nullptr,
 
 
 1446                                     unsigned Index)
 const override {
 
 1447    Value *Op0 = 
nullptr;
 
 1448    Value *Op1 = 
nullptr;
 
 1450      Op0 = IE->getOperand(0);
 
 1451      Op1 = IE->getOperand(1);
 
 1453    return thisT()->getVectorInstrCost(
I.getOpcode(), Val, 
CostKind, Index, Op0,
 
 
 1460                                   unsigned Index)
 const override {
 
 1461    unsigned NewIndex = -1;
 
 1464             "Unexpected index from end of vector");
 
 1465      NewIndex = FVTy->getNumElements() - 1 - Index;
 
 1467    return thisT()->getVectorInstrCost(Opcode, Val, 
CostKind, NewIndex, 
nullptr,
 
 
 1473                            const APInt &DemandedDstElts,
 
 1476           "Unexpected size of DemandedDstElts.");
 
 1494    Cost += thisT()->getScalarizationOverhead(SrcVT, DemandedSrcElts,
 
 1497    Cost += thisT()->getScalarizationOverhead(ReplicatedVT, DemandedDstElts,
 
 
 1509    assert(!Src->isVoidTy() && 
"Invalid type");
 
 1526                            LT.second.getSizeInBits())) {
 
 1532      if (Opcode == Instruction::Store)
 
 1542            Opcode == Instruction::Store, 
CostKind);
 
 
 1554    return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment, 
true, 
false,
 
 
 1560                         bool VariableMask, 
Align Alignment,
 
 1563    return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment, VariableMask,
 
 
 1569                                bool VariableMask, 
Align Alignment,
 
 1574    return getCommonMaskedMemoryOpCost(Opcode, DataTy, Alignment, VariableMask,
 
 
 1579                                         const Value *
Ptr, 
bool VariableMask,
 
 1586    return thisT()->getGatherScatterOpCost(Opcode, DataTy, 
Ptr, VariableMask,
 
 
 1593      bool UseMaskForCond = 
false, 
bool UseMaskForGaps = 
false)
 const override {
 
 1601    unsigned NumElts = VT->getNumElements();
 
 1602    assert(Factor > 1 && NumElts % Factor == 0 && 
"Invalid interleave factor");
 
 1604    unsigned NumSubElts = NumElts / Factor;
 
 1609    if (UseMaskForCond || UseMaskForGaps)
 
 1610      Cost = thisT()->getMaskedMemoryOpCost(Opcode, VecTy, Alignment,
 
 1619    unsigned VecTySize = thisT()->getDataLayout().getTypeStoreSize(VecTy);
 
 1636    if (
Cost.isValid() && VecTySize > VecTyLTSize) {
 
 1639      unsigned NumLegalInsts = 
divideCeil(VecTySize, VecTyLTSize);
 
 1643      unsigned NumEltsPerLegalInst = 
divideCeil(NumElts, NumLegalInsts);
 
 1646      BitVector UsedInsts(NumLegalInsts, 
false);
 
 1647      for (
unsigned Index : Indices)
 
 1648        for (
unsigned Elt = 0; Elt < NumSubElts; ++Elt)
 
 1649          UsedInsts.
set((Index + Elt * Factor) / NumEltsPerLegalInst);
 
 1658           "Interleaved memory op has too many members");
 
 1664    for (
unsigned Index : Indices) {
 
 1665      assert(Index < Factor && 
"Invalid index for interleaved memory op");
 
 1666      for (
unsigned Elm = 0; Elm < NumSubElts; Elm++)
 
 1667        DemandedLoadStoreElts.
setBit(Index + Elm * Factor);
 
 1670    if (Opcode == Instruction::Load) {
 
 1680          SubVT, DemandedAllSubElts,
 
 1682      Cost += Indices.
size() * InsSubCost;
 
 1683      Cost += thisT()->getScalarizationOverhead(VT, DemandedLoadStoreElts,
 
 1701          SubVT, DemandedAllSubElts,
 
 1703      Cost += ExtSubCost * Indices.
size();
 
 1704      Cost += thisT()->getScalarizationOverhead(VT, DemandedLoadStoreElts,
 
 1709    if (!UseMaskForCond)
 
 1714    Cost += thisT()->getReplicationShuffleCost(
 
 1715        I8Type, Factor, NumSubElts,
 
 1716        UseMaskForGaps ? DemandedLoadStoreElts : DemandedAllResultElts,
 
 1724    if (UseMaskForGaps) {
 
 1726      Cost += thisT()->getArithmeticInstrCost(BinaryOperator::And, MaskVT,
 
 
 1752      std::optional<unsigned> FOp =
 
 1755        if (ICA.
getID() == Intrinsic::vp_load) {
 
 1758            Alignment = VPI->getPointerAlignment().valueOrOne();
 
 1762              AS = PtrTy->getAddressSpace();
 
 1763          return thisT()->getMemoryOpCost(*FOp, ICA.
getReturnType(), Alignment,
 
 1766        if (ICA.
getID() == Intrinsic::vp_store) {
 
 1769            Alignment = VPI->getPointerAlignment().valueOrOne();
 
 1773              AS = PtrTy->getAddressSpace();
 
 1774          return thisT()->getMemoryOpCost(*FOp, ICA.
getArgTypes()[0], Alignment,
 
 1778            ICA.
getID() == Intrinsic::vp_fneg) {
 
 1779          return thisT()->getArithmeticInstrCost(*FOp, ICA.
getReturnType(),
 
 1783          return thisT()->getCastInstrCost(
 
 1792            return thisT()->getCmpSelInstrCost(*FOp, ICA.
getArgTypes()[0],
 
 1799      if (ICA.
getID() == Intrinsic::vp_scatter) {
 
 1809          Alignment = VPI->getPointerAlignment().valueOrOne();
 
 1811        return thisT()->getGatherScatterOpCost(
 
 1815      if (ICA.
getID() == Intrinsic::vp_gather) {
 
 1825          Alignment = VPI->getPointerAlignment().valueOrOne();
 
 1827        return thisT()->getGatherScatterOpCost(
 
 1832      if (ICA.
getID() == Intrinsic::vp_select ||
 
 1833          ICA.
getID() == Intrinsic::vp_merge) {
 
 1844      std::optional<Intrinsic::ID> FID =
 
 1848      if (ICA.
getID() == Intrinsic::experimental_vp_reverse)
 
 1849        FID = Intrinsic::vector_reverse;
 
 1855               "Expected VPIntrinsic to have Mask and Vector Length args and " 
 1867            *FID != Intrinsic::vector_reduce_fadd &&
 
 1868            *FID != Intrinsic::vector_reduce_fmul) {
 
 1876        return thisT()->getIntrinsicInstrCost(NewICA, 
CostKind);
 
 1895    case Intrinsic::powi:
 
 1897        bool ShouldOptForSize = 
I->getParent()->getParent()->hasOptSize();
 
 1898        if (getTLI()->isBeneficialToExpandPowI(RHSC->getSExtValue(),
 
 1899                                               ShouldOptForSize)) {
 
 1903          unsigned ActiveBits = 
Exponent.getActiveBits();
 
 1904          unsigned PopCount = 
Exponent.popcount();
 
 1906                                 thisT()->getArithmeticInstrCost(
 
 1907                                     Instruction::FMul, RetTy, 
CostKind);
 
 1908          if (RHSC->isNegative())
 
 1909            Cost += thisT()->getArithmeticInstrCost(Instruction::FDiv, RetTy,
 
 1915    case Intrinsic::cttz:
 
 1917      if (RetVF.
isScalar() && getTLI()->isCheapToSpeculateCttz(RetTy))
 
 1921    case Intrinsic::ctlz:
 
 1923      if (RetVF.
isScalar() && getTLI()->isCheapToSpeculateCtlz(RetTy))
 
 1927    case Intrinsic::memcpy:
 
 1928      return thisT()->getMemcpyCost(ICA.
getInst());
 
 1930    case Intrinsic::masked_scatter: {
 
 1931      const Value *Mask = Args[2];
 
 1933      Align Alignment = 
I->getParamAlign(1).valueOrOne();
 
 1934      return thisT()->getGatherScatterOpCost(Instruction::Store,
 
 1938    case Intrinsic::masked_gather: {
 
 1939      const Value *Mask = Args[1];
 
 1941      Align Alignment = 
I->getParamAlign(0).valueOrOne();
 
 1942      return thisT()->getGatherScatterOpCost(Instruction::Load, RetTy, Args[0],
 
 1945    case Intrinsic::masked_compressstore: {
 
 1947      const Value *Mask = Args[2];
 
 1948      Align Alignment = 
I->getParamAlign(1).valueOrOne();
 
 1949      return thisT()->getExpandCompressMemoryOpCost(
 
 1953    case Intrinsic::masked_expandload: {
 
 1954      const Value *Mask = Args[1];
 
 1955      Align Alignment = 
I->getParamAlign(0).valueOrOne();
 
 1956      return thisT()->getExpandCompressMemoryOpCost(Instruction::Load, RetTy,
 
 1960    case Intrinsic::experimental_vp_strided_store: {
 
 1963      const Value *Mask = Args[3];
 
 1964      const Value *EVL = Args[4];
 
 1968          I->getParamAlign(1).value_or(thisT()->
DL.getABITypeAlign(EltTy));
 
 1969      return thisT()->getStridedMemoryOpCost(Instruction::Store,
 
 1970                                             Data->getType(), 
Ptr, VarMask,
 
 1973    case Intrinsic::experimental_vp_strided_load: {
 
 1975      const Value *Mask = Args[2];
 
 1976      const Value *EVL = Args[3];
 
 1980          I->getParamAlign(0).value_or(thisT()->
DL.getABITypeAlign(EltTy));
 
 1981      return thisT()->getStridedMemoryOpCost(Instruction::Load, RetTy, 
Ptr,
 
 1984    case Intrinsic::stepvector: {
 
 1990    case Intrinsic::vector_extract: {
 
 2001    case Intrinsic::vector_insert: {
 
 2007      return thisT()->getShuffleCost(
 
 2012    case Intrinsic::vector_splice: {
 
 2018    case Intrinsic::vector_reduce_add:
 
 2019    case Intrinsic::vector_reduce_mul:
 
 2020    case Intrinsic::vector_reduce_and:
 
 2021    case Intrinsic::vector_reduce_or:
 
 2022    case Intrinsic::vector_reduce_xor:
 
 2023    case Intrinsic::vector_reduce_smax:
 
 2024    case Intrinsic::vector_reduce_smin:
 
 2025    case Intrinsic::vector_reduce_fmax:
 
 2026    case Intrinsic::vector_reduce_fmin:
 
 2027    case Intrinsic::vector_reduce_fmaximum:
 
 2028    case Intrinsic::vector_reduce_fminimum:
 
 2029    case Intrinsic::vector_reduce_umax:
 
 2030    case Intrinsic::vector_reduce_umin: {
 
 2034    case Intrinsic::vector_reduce_fadd:
 
 2035    case Intrinsic::vector_reduce_fmul: {
 
 2037          IID, RetTy, {Args[0]->getType(), Args[1]->getType()}, FMF, 
I, 1);
 
 2040    case Intrinsic::fshl:
 
 2041    case Intrinsic::fshr: {
 
 2042      const Value *
X = Args[0];
 
 2043      const Value *
Y = Args[1];
 
 2044      const Value *Z = Args[2];
 
 2053          thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy, 
CostKind);
 
 2055          thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy, 
CostKind);
 
 2056      Cost += thisT()->getArithmeticInstrCost(
 
 2057          BinaryOperator::Shl, RetTy, 
CostKind, OpInfoX,
 
 2059      Cost += thisT()->getArithmeticInstrCost(
 
 2060          BinaryOperator::LShr, RetTy, 
CostKind, OpInfoY,
 
 2066        Cost += thisT()->getArithmeticInstrCost(
 
 2068                                                        : BinaryOperator::URem,
 
 2070            {TTI::OK_UniformConstantValue, TTI::OP_None});
 
 2075            thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
 
 2078            thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
 
 2083    case Intrinsic::experimental_cttz_elts: {
 
 2088      if (!getTLI()->shouldExpandCttzElements(ArgType))
 
 2101      unsigned EltWidth = getTLI()->getBitWidthForCttzElements(
 
 2112          thisT()->getIntrinsicInstrCost(StepVecAttrs, 
CostKind);
 
 2115          thisT()->getArithmeticInstrCost(Instruction::Sub, NewVecTy, 
CostKind);
 
 2116      Cost += thisT()->getCastInstrCost(Instruction::SExt, NewVecTy,
 
 2120          thisT()->getArithmeticInstrCost(Instruction::And, NewVecTy, 
CostKind);
 
 2123                                         NewEltTy, NewVecTy, FMF, 
I, 1);
 
 2124      Cost += thisT()->getTypeBasedIntrinsicInstrCost(ReducAttrs, 
CostKind);
 
 2126          thisT()->getArithmeticInstrCost(Instruction::Sub, NewEltTy, 
CostKind);
 
 2130    case Intrinsic::get_active_lane_mask:
 
 2131    case Intrinsic::experimental_vector_match:
 
 2132    case Intrinsic::experimental_vector_histogram_add:
 
 2133    case Intrinsic::experimental_vector_histogram_uadd_sat:
 
 2134    case Intrinsic::experimental_vector_histogram_umax:
 
 2135    case Intrinsic::experimental_vector_histogram_umin:
 
 2136      return thisT()->getTypeBasedIntrinsicInstrCost(ICA, 
CostKind);
 
 2137    case Intrinsic::modf:
 
 2138    case Intrinsic::sincos:
 
 2139    case Intrinsic::sincospi: {
 
 2141      EVT VT = getTLI()->getValueType(
DL, Ty);
 
 2143      RTLIB::Libcall LC = [&] {
 
 2144        switch (ICA.
getID()) {
 
 2145        case Intrinsic::modf:
 
 2147        case Intrinsic::sincos:
 
 2149        case Intrinsic::sincospi:
 
 2156      std::optional<unsigned> CallRetElementIndex;
 
 2159      if (ICA.
getID() == Intrinsic::modf)
 
 2160        CallRetElementIndex = 0;
 
 2162      if (
auto Cost = getMultipleResultIntrinsicVectorLibCallCost(
 
 2163              ICA, 
CostKind, LC, CallRetElementIndex))
 
 2175      ScalarizationCost = 0;
 
 2184          filterConstantAndDuplicatedOperands(Args, ICA.
getArgTypes()),
 
 2190    return thisT()->getTypeBasedIntrinsicInstrCost(Attrs, 
CostKind);
 
 
 2211      unsigned VecTyIndex = 0;
 
 2212      if (IID == Intrinsic::vector_reduce_fadd ||
 
 2213          IID == Intrinsic::vector_reduce_fmul)
 
 2215      assert(Tys.
size() > VecTyIndex && 
"Unexpected IntrinsicCostAttributes");
 
 2232          SkipScalarizationCost ? ScalarizationCostPassed : 0;
 
 2233      unsigned ScalarCalls = 1;
 
 2234      Type *ScalarRetTy = RetTy;
 
 2236        if (!SkipScalarizationCost)
 
 2239        ScalarCalls = std::max(ScalarCalls,
 
 2244      for (
Type *Ty : Tys) {
 
 2246          if (!SkipScalarizationCost)
 
 2249          ScalarCalls = std::max(ScalarCalls,
 
 2251          Ty = Ty->getScalarType();
 
 2255      if (ScalarCalls == 1)
 
 2260          thisT()->getIntrinsicInstrCost(ScalarAttrs, 
CostKind);
 
 2262      return ScalarCalls * ScalarCost + ScalarizationCost;
 
 2266    case Intrinsic::sqrt:
 
 2269    case Intrinsic::sin:
 
 2272    case Intrinsic::cos:
 
 2275    case Intrinsic::sincos:
 
 2278    case Intrinsic::sincospi:
 
 2279      ISD = ISD::FSINCOSPI;
 
 2281    case Intrinsic::modf:
 
 2284    case Intrinsic::tan:
 
 2287    case Intrinsic::asin:
 
 2290    case Intrinsic::acos:
 
 2293    case Intrinsic::atan:
 
 2296    case Intrinsic::atan2:
 
 2299    case Intrinsic::sinh:
 
 2302    case Intrinsic::cosh:
 
 2305    case Intrinsic::tanh:
 
 2308    case Intrinsic::exp:
 
 2311    case Intrinsic::exp2:
 
 2314    case Intrinsic::exp10:
 
 2317    case Intrinsic::log:
 
 2320    case Intrinsic::log10:
 
 2323    case Intrinsic::log2:
 
 2326    case Intrinsic::ldexp:
 
 2329    case Intrinsic::fabs:
 
 2332    case Intrinsic::canonicalize:
 
 2335    case Intrinsic::minnum:
 
 2338    case Intrinsic::maxnum:
 
 2341    case Intrinsic::minimum:
 
 2342      ISD = ISD::FMINIMUM;
 
 2344    case Intrinsic::maximum:
 
 2345      ISD = ISD::FMAXIMUM;
 
 2347    case Intrinsic::minimumnum:
 
 2348      ISD = ISD::FMINIMUMNUM;
 
 2350    case Intrinsic::maximumnum:
 
 2351      ISD = ISD::FMAXIMUMNUM;
 
 2353    case Intrinsic::copysign:
 
 2356    case Intrinsic::floor:
 
 2359    case Intrinsic::ceil:
 
 2362    case Intrinsic::trunc:
 
 2365    case Intrinsic::nearbyint:
 
 2366      ISD = ISD::FNEARBYINT;
 
 2368    case Intrinsic::rint:
 
 2371    case Intrinsic::lrint:
 
 2374    case Intrinsic::llrint:
 
 2377    case Intrinsic::round:
 
 2380    case Intrinsic::roundeven:
 
 2381      ISD = ISD::FROUNDEVEN;
 
 2383    case Intrinsic::lround:
 
 2386    case Intrinsic::llround:
 
 2389    case Intrinsic::pow:
 
 2392    case Intrinsic::fma:
 
 2395    case Intrinsic::fmuladd:
 
 2398    case Intrinsic::experimental_constrained_fmuladd:
 
 2402    case Intrinsic::lifetime_start:
 
 2403    case Intrinsic::lifetime_end:
 
 2404    case Intrinsic::sideeffect:
 
 2405    case Intrinsic::pseudoprobe:
 
 2406    case Intrinsic::arithmetic_fence:
 
 2408    case Intrinsic::masked_store: {
 
 2410      Align TyAlign = thisT()->DL.getABITypeAlign(Ty);
 
 2411      return thisT()->getMaskedMemoryOpCost(Instruction::Store, Ty, TyAlign, 0,
 
 2414    case Intrinsic::masked_load: {
 
 2416      Align TyAlign = thisT()->DL.getABITypeAlign(Ty);
 
 2417      return thisT()->getMaskedMemoryOpCost(Instruction::Load, Ty, TyAlign, 0,
 
 2420    case Intrinsic::experimental_vp_strided_store: {
 
 2422      Align Alignment = thisT()->DL.getABITypeAlign(Ty->getElementType());
 
 2423      return thisT()->getStridedMemoryOpCost(
 
 2424          Instruction::Store, Ty, 
nullptr, 
true,
 
 2427    case Intrinsic::experimental_vp_strided_load: {
 
 2429      Align Alignment = thisT()->DL.getABITypeAlign(Ty->getElementType());
 
 2430      return thisT()->getStridedMemoryOpCost(
 
 2431          Instruction::Load, Ty, 
nullptr, 
true,
 
 2434    case Intrinsic::vector_reduce_add:
 
 2435    case Intrinsic::vector_reduce_mul:
 
 2436    case Intrinsic::vector_reduce_and:
 
 2437    case Intrinsic::vector_reduce_or:
 
 2438    case Intrinsic::vector_reduce_xor:
 
 2439      return thisT()->getArithmeticReductionCost(
 
 2442    case Intrinsic::vector_reduce_fadd:
 
 2443    case Intrinsic::vector_reduce_fmul:
 
 2444      return thisT()->getArithmeticReductionCost(
 
 2446    case Intrinsic::vector_reduce_smax:
 
 2447    case Intrinsic::vector_reduce_smin:
 
 2448    case Intrinsic::vector_reduce_umax:
 
 2449    case Intrinsic::vector_reduce_umin:
 
 2450    case Intrinsic::vector_reduce_fmax:
 
 2451    case Intrinsic::vector_reduce_fmin:
 
 2452    case Intrinsic::vector_reduce_fmaximum:
 
 2453    case Intrinsic::vector_reduce_fminimum:
 
 2456    case Intrinsic::experimental_vector_match: {
 
 2459      unsigned SearchSize = NeedleTy->getNumElements();
 
 2463      EVT SearchVT = getTLI()->getValueType(
DL, SearchTy);
 
 2464      if (!getTLI()->shouldExpandVectorMatch(SearchVT, SearchSize))
 
 2470      Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, NeedleTy,
 
 2472      Cost += thisT()->getVectorInstrCost(Instruction::InsertElement, SearchTy,
 
 2476      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, SearchTy, RetTy,
 
 2479          thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy, 
CostKind);
 
 2482          thisT()->getArithmeticInstrCost(BinaryOperator::And, RetTy, 
CostKind);
 
 2485    case Intrinsic::vector_reverse:
 
 2489    case Intrinsic::experimental_vector_histogram_add:
 
 2490    case Intrinsic::experimental_vector_histogram_uadd_sat:
 
 2491    case Intrinsic::experimental_vector_histogram_umax:
 
 2492    case Intrinsic::experimental_vector_histogram_umin: {
 
 2500      Align Alignment = thisT()->DL.getABITypeAlign(EltTy);
 
 2502      Cost += thisT()->getVectorInstrCost(Instruction::ExtractElement, PtrsTy,
 
 2504      Cost += thisT()->getMemoryOpCost(Instruction::Load, EltTy, Alignment, 0,
 
 2509      case Intrinsic::experimental_vector_histogram_add:
 
 2511            thisT()->getArithmeticInstrCost(Instruction::Add, EltTy, 
CostKind);
 
 2513      case Intrinsic::experimental_vector_histogram_uadd_sat: {
 
 2515        Cost += thisT()->getIntrinsicInstrCost(UAddSat, 
CostKind);
 
 2518      case Intrinsic::experimental_vector_histogram_umax: {
 
 2523      case Intrinsic::experimental_vector_histogram_umin: {
 
 2529      Cost += thisT()->getMemoryOpCost(Instruction::Store, EltTy, Alignment, 0,
 
 2534    case Intrinsic::get_active_lane_mask: {
 
 2536      EVT ResVT = getTLI()->getValueType(
DL, RetTy, 
true);
 
 2537      EVT ArgVT = getTLI()->getValueType(
DL, ArgTy, 
true);
 
 2541      if (!getTLI()->shouldExpandGetActiveLaneMask(ResVT, ArgVT))
 
 2550          thisT()->getTypeBasedIntrinsicInstrCost(Attrs, 
CostKind);
 
 2551      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, ExpRetTy, RetTy,
 
 2555    case Intrinsic::experimental_memset_pattern:
 
 2560    case Intrinsic::abs:
 
 2563    case Intrinsic::fshl:
 
 2566    case Intrinsic::fshr:
 
 2569    case Intrinsic::smax:
 
 2572    case Intrinsic::smin:
 
 2575    case Intrinsic::umax:
 
 2578    case Intrinsic::umin:
 
 2581    case Intrinsic::sadd_sat:
 
 2584    case Intrinsic::ssub_sat:
 
 2587    case Intrinsic::uadd_sat:
 
 2590    case Intrinsic::usub_sat:
 
 2593    case Intrinsic::smul_fix:
 
 2596    case Intrinsic::umul_fix:
 
 2599    case Intrinsic::sadd_with_overflow:
 
 2602    case Intrinsic::ssub_with_overflow:
 
 2605    case Intrinsic::uadd_with_overflow:
 
 2608    case Intrinsic::usub_with_overflow:
 
 2611    case Intrinsic::smul_with_overflow:
 
 2614    case Intrinsic::umul_with_overflow:
 
 2617    case Intrinsic::fptosi_sat:
 
 2618    case Intrinsic::fptoui_sat: {
 
 2624      if (!SrcLT.first.isValid() || !RetLT.first.isValid())
 
 2630    case Intrinsic::ctpop:
 
 2636    case Intrinsic::ctlz:
 
 2639    case Intrinsic::cttz:
 
 2642    case Intrinsic::bswap:
 
 2645    case Intrinsic::bitreverse:
 
 2648    case Intrinsic::ucmp:
 
 2651    case Intrinsic::scmp:
 
 2657    Type *LegalizeTy = ST ? ST->getContainedType(0) : RetTy;
 
 2663      if (IID == Intrinsic::fabs && LT.second.isFloatingPoint() &&
 
 2673        return (LT.first * 2);
 
 2675        return (LT.first * 1);
 
 2679      return (LT.first * 2);
 
 2683    case Intrinsic::fmuladd: {
 
 2687      return thisT()->getArithmeticInstrCost(BinaryOperator::FMul, RetTy,
 
 2689             thisT()->getArithmeticInstrCost(BinaryOperator::FAdd, RetTy,
 
 2692    case Intrinsic::experimental_constrained_fmuladd: {
 
 2694        Intrinsic::experimental_constrained_fmul, RetTy, Tys);
 
 2696        Intrinsic::experimental_constrained_fadd, RetTy, Tys);
 
 2697      return thisT()->getIntrinsicInstrCost(FMulAttrs, 
CostKind) +
 
 2698             thisT()->getIntrinsicInstrCost(FAddAttrs, 
CostKind);
 
 2700    case Intrinsic::smin:
 
 2701    case Intrinsic::smax:
 
 2702    case Intrinsic::umin:
 
 2703    case Intrinsic::umax: {
 
 2706      bool IsUnsigned = IID == Intrinsic::umax || IID == Intrinsic::umin;
 
 2710      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
 
 2712      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
 
 2716    case Intrinsic::sadd_with_overflow:
 
 2717    case Intrinsic::ssub_with_overflow: {
 
 2720      unsigned Opcode = IID == Intrinsic::sadd_with_overflow
 
 2721                            ? BinaryOperator::Add
 
 2722                            : BinaryOperator::Sub;
 
 2729      Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy, 
CostKind);
 
 2731          2 * thisT()->getCmpSelInstrCost(Instruction::ICmp, SumTy, OverflowTy,
 
 2733      Cost += thisT()->getArithmeticInstrCost(BinaryOperator::Xor, OverflowTy,
 
 2737    case Intrinsic::uadd_with_overflow:
 
 2738    case Intrinsic::usub_with_overflow: {
 
 2741      unsigned Opcode = IID == Intrinsic::uadd_with_overflow
 
 2742                            ? BinaryOperator::Add
 
 2743                            : BinaryOperator::Sub;
 
 2749      Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy, 
CostKind);
 
 2750      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, SumTy,
 
 2754    case Intrinsic::smul_with_overflow:
 
 2755    case Intrinsic::umul_with_overflow: {
 
 2760      bool IsSigned = IID == Intrinsic::smul_with_overflow;
 
 2762      unsigned ExtOp = IsSigned ? Instruction::SExt : Instruction::ZExt;
 
 2766      Cost += 2 * thisT()->getCastInstrCost(ExtOp, ExtTy, MulTy, CCH, 
CostKind);
 
 2768          thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy, 
CostKind);
 
 2769      Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, MulTy, ExtTy,
 
 2771      Cost += thisT()->getArithmeticInstrCost(
 
 2776        Cost += thisT()->getArithmeticInstrCost(
 
 2777            Instruction::AShr, MulTy, 
CostKind,
 
 2781      Cost += thisT()->getCmpSelInstrCost(
 
 2785    case Intrinsic::sadd_sat:
 
 2786    case Intrinsic::ssub_sat: {
 
 2792                                     ? Intrinsic::sadd_with_overflow
 
 2793                                     : Intrinsic::ssub_with_overflow;
 
 2800                                    nullptr, ScalarizationCostPassed);
 
 2801      Cost += thisT()->getIntrinsicInstrCost(Attrs, 
CostKind);
 
 2802      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
 
 2804      Cost += 2 * thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy,
 
 2808    case Intrinsic::uadd_sat:
 
 2809    case Intrinsic::usub_sat: {
 
 2814                                     ? Intrinsic::uadd_with_overflow
 
 2815                                     : Intrinsic::usub_with_overflow;
 
 2819                                    nullptr, ScalarizationCostPassed);
 
 2820      Cost += thisT()->getIntrinsicInstrCost(Attrs, 
CostKind);
 
 2822          thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
 
 2826    case Intrinsic::smul_fix:
 
 2827    case Intrinsic::umul_fix: {
 
 2832          IID == Intrinsic::smul_fix ? Instruction::SExt : Instruction::ZExt;
 
 2836      Cost += 2 * thisT()->getCastInstrCost(ExtOp, ExtTy, RetTy, CCH, 
CostKind);
 
 2838          thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy, 
CostKind);
 
 2839      Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, RetTy, ExtTy,
 
 2841      Cost += thisT()->getArithmeticInstrCost(
 
 2844      Cost += thisT()->getArithmeticInstrCost(
 
 2847      Cost += thisT()->getArithmeticInstrCost(Instruction::Or, RetTy, 
CostKind);
 
 2850    case Intrinsic::abs: {
 
 2855      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
 
 2857      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
 
 2860      Cost += thisT()->getArithmeticInstrCost(
 
 2861          BinaryOperator::Sub, RetTy, 
CostKind,
 
 2865    case Intrinsic::fshl:
 
 2866    case Intrinsic::fshr: {
 
 2872          thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy, 
CostKind);
 
 2874          thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy, 
CostKind);
 
 2876          thisT()->getArithmeticInstrCost(BinaryOperator::Shl, RetTy, 
CostKind);
 
 2877      Cost += thisT()->getArithmeticInstrCost(BinaryOperator::LShr, RetTy,
 
 2882      Cost += thisT()->getArithmeticInstrCost(
 
 2884                                                      : BinaryOperator::URem,
 
 2885          RetTy, 
CostKind, {TTI::OK_AnyValue, TTI::OP_None},
 
 2886          {TTI::OK_UniformConstantValue, TTI::OP_None});
 
 2888      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
 
 2890      Cost += thisT()->getCmpSelInstrCost(BinaryOperator::Select, RetTy, CondTy,
 
 2894    case Intrinsic::fptosi_sat:
 
 2895    case Intrinsic::fptoui_sat: {
 
 2898      Type *FromTy = Tys[0];
 
 2899      bool IsSigned = IID == Intrinsic::fptosi_sat;
 
 2904      Cost += thisT()->getIntrinsicInstrCost(Attrs1, 
CostKind);
 
 2907      Cost += thisT()->getIntrinsicInstrCost(Attrs2, 
CostKind);
 
 2908      Cost += thisT()->getCastInstrCost(
 
 2909          IsSigned ? Instruction::FPToSI : Instruction::FPToUI, RetTy, FromTy,
 
 2913        Cost += thisT()->getCmpSelInstrCost(
 
 2915        Cost += thisT()->getCmpSelInstrCost(
 
 2920    case Intrinsic::ucmp:
 
 2921    case Intrinsic::scmp: {
 
 2922      Type *CmpTy = Tys[0];
 
 2925          thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, CmpTy, CondTy,
 
 2928          thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, CmpTy, CondTy,
 
 2935        Cost += 2 * thisT()->getCmpSelInstrCost(
 
 2936                        BinaryOperator::Select, RetTy, CondTy,
 
 2941            2 * thisT()->getCastInstrCost(CastInst::ZExt, RetTy, CondTy,
 
 2943        Cost += thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy,
 
 2948    case Intrinsic::maximumnum:
 
 2949    case Intrinsic::minimumnum: {
 
 2959          IID == Intrinsic::maximumnum ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
 
 2964            thisT()->getIntrinsicInstrCost(FCanonicalizeAttrs, 
CostKind);
 
 2965        return LT.first + FCanonicalizeCost * 2;
 
 2985      if (!SkipScalarizationCost) {
 
 2986        ScalarizationCost = 0;
 
 2987        for (
Type *RetVTy : RetVTys) {
 
 2996      for (
Type *Ty : Tys) {
 
 2997        if (Ty->isVectorTy())
 
 2998          Ty = Ty->getScalarType();
 
 3003          thisT()->getIntrinsicInstrCost(Attrs, 
CostKind);
 
 3004      for (
Type *Ty : Tys) {
 
 3009          ScalarCalls = std::max(ScalarCalls,
 
 3013      return ScalarCalls * ScalarCost + ScalarizationCost;
 
 3017    return SingleCallCost;
 
 
 3039    if (!LT.first.isValid())
 
 3044        Tp && LT.second.isFixedLengthVector() &&
 
 3049        return divideCeil(FTp->getNumElements(), SubTp->getNumElements());
 
 3051    return LT.first.getValue();
 
 
 3088    Type *ScalarTy = Ty->getElementType();
 
 3090    if ((Opcode == Instruction::Or || Opcode == Instruction::And) &&
 
 3100      return thisT()->getCastInstrCost(Instruction::BitCast, ValTy, Ty,
 
 3102             thisT()->getCmpSelInstrCost(Instruction::ICmp, ValTy,
 
 3106    unsigned NumReduxLevels = 
Log2_32(NumVecElts);
 
 3109    std::pair<InstructionCost, MVT> LT = thisT()->getTypeLegalizationCost(Ty);
 
 3110    unsigned LongVectorCount = 0;
 
 3112        LT.second.isVector() ? LT.second.getVectorNumElements() : 1;
 
 3113    while (NumVecElts > MVTLen) {
 
 3116      ShuffleCost += thisT()->getShuffleCost(
 
 3118      ArithCost += thisT()->getArithmeticInstrCost(Opcode, SubTy, 
CostKind);
 
 3123    NumReduxLevels -= LongVectorCount;
 
 3135        NumReduxLevels * thisT()->getArithmeticInstrCost(Opcode, Ty, 
CostKind);
 
 3136    return ShuffleCost + ArithCost +
 
 3137           thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
 
 
 3171    return ExtractCost + ArithCost;
 
 
 3176                             std::optional<FastMathFlags> FMF,
 
 3178    assert(Ty && 
"Unknown reduction vector type");
 
 
 3194    Type *ScalarTy = Ty->getElementType();
 
 3196    unsigned NumReduxLevels = 
Log2_32(NumVecElts);
 
 3199    std::pair<InstructionCost, MVT> LT = thisT()->getTypeLegalizationCost(Ty);
 
 3200    unsigned LongVectorCount = 0;
 
 3202        LT.second.isVector() ? LT.second.getVectorNumElements() : 1;
 
 3203    while (NumVecElts > MVTLen) {
 
 3207      ShuffleCost += thisT()->getShuffleCost(
 
 3216    NumReduxLevels -= LongVectorCount;
 
 3229    return ShuffleCost + MinMaxCost +
 
 3230           thisT()->getVectorInstrCost(Instruction::ExtractElement, Ty,
 
 
 3236                           VectorType *Ty, std::optional<FastMathFlags> FMF,
 
 3239        FTy && IsUnsigned && Opcode == Instruction::Add &&
 
 3247      return thisT()->getCastInstrCost(Instruction::BitCast, IntTy, FTy,
 
 3249             thisT()->getIntrinsicInstrCost(ICA, 
CostKind);
 
 3255        thisT()->getArithmeticReductionCost(Opcode, ExtTy, FMF, 
CostKind);
 
 3257        IsUnsigned ? Instruction::ZExt : Instruction::SExt, ExtTy, Ty,
 
 3260    return RedCost + ExtCost;
 
 
 3270    assert((RedOpcode == Instruction::Add || RedOpcode == Instruction::Sub) &&
 
 3271           "The reduction opcode is expected to be Add or Sub.");
 
 3274        RedOpcode, ExtTy, std::nullopt, 
CostKind);
 
 3276        IsUnsigned ? Instruction::ZExt : Instruction::SExt, ExtTy, Ty,
 
 3280        thisT()->getArithmeticInstrCost(Instruction::Mul, ExtTy, 
CostKind);
 
 3282    return RedCost + MulCost + 2 * ExtCost;
 
 
 
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< 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
 
static unsigned getNumElements(Type *Ty)
 
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
 
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 TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
 
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
 
ArrayRef - 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
size - 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 getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, const Value *Op0, const Value *Op1) 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 *CxtI=nullptr) 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
 
InstructionCost getGEPCost(Type *PointeeType, const Value *Ptr, ArrayRef< const Value * > Operands, Type *AccessType, TTI::TargetCostKind CostKind) 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
 
InstructionCost getScalarizationOverhead(VectorType *InTy, const APInt &DemandedElts, bool Insert, bool Extract, TTI::TargetCostKind CostKind, bool ForPoisonSrc=true, ArrayRef< Value * > VL={}) const override
Estimate the overhead of scalarizing an instruction.
 
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
 
InstructionCost getStridedMemoryOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) const override
 
InstructionCost getVectorInstrCost(const Instruction &I, Type *Val, TTI::TargetCostKind CostKind, unsigned Index) 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
 
unsigned getStoreMinimumVF(unsigned VF, Type *ScalarMemTy, Type *ScalarValTy) const override
 
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
 
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *DstTy, VectorType *SrcTy, ArrayRef< int > Mask, TTI::TargetCostKind CostKind, int Index, VectorType *SubTp, ArrayRef< const Value * > Args={}, const Instruction *CxtI=nullptr) const override
 
InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, Value *Scalar, ArrayRef< std::tuple< Value *, User *, int > > ScalarUserAndIdx) const override
 
unsigned getEstimatedNumberOfCaseClusters(const SwitchInst &SI, unsigned &JumpTableSize, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) const override
 
Value * rewriteIntrinsicWithAddressSpace(IntrinsicInst *II, Value *OldV, Value *NewV) const override
 
unsigned adjustInliningThreshold(const CallBase *CB) const override
 
unsigned getInliningThresholdMultiplier() const override
 
InstructionCost getExpandCompressMemoryOpCost(unsigned Opcode, Type *DataTy, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) 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 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
 
std::optional< unsigned > getMaxVScale() 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
 
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...
 
bool isTargetIntrinsicTriviallyScalarizable(Intrinsic::ID ID) const override
 
bool preferPredicateOverEpilogue(TailFoldingInfo *TFI) const override
 
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
 
bool isVScaleKnownToBeAPowerOfTwo() const override
 
InstructionCost getMulAccReductionCost(bool IsUnsigned, unsigned RedOpcode, Type *ResTy, VectorType *Ty, TTI::TargetCostKind CostKind) 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.
 
bool isLegalAddImmediate(int64_t imm) const override
 
InstructionCost getReplicationShuffleCost(Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts, TTI::TargetCostKind CostKind) const override
 
unsigned getMaxInterleaveFactor(ElementCount VF) const override
 
bool isSingleThreaded() const override
 
InstructionCost getScalarizationOverhead(VectorType *InTy, bool Insert, bool Extract, TTI::TargetCostKind CostKind) const
Helper wrapper for the DemandedElts variant of getScalarizationOverhead.
 
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.
 
TailFoldingStyle getPreferredTailFoldingStyle(bool IVUpdateMayOverflow=true) 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 isSourceOfDivergence(const Value *V) 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...
 
std::optional< unsigned > getCacheSize(TargetTransformInfo::CacheLevel Level) const override
 
bool isAlwaysUniform(const Value *V) const override
 
bool isLegalICmpImmediate(int64_t imm) const override
 
bool isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE, AssumptionCache &AC, TargetLibraryInfo *LibInfo, HardwareLoopInfo &HWLoopInfo) const override
 
unsigned getRegUsageForType(Type *Ty) const override
 
InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I=nullptr) const override
 
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
 
InstructionCost getMaskedMemoryOpCost(unsigned Opcode, Type *DataTy, Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind) const override
 
bool enableWritePrefetching() const override
 
bool isLSRCostLess(const TTI::LSRCost &C1, const TTI::LSRCost &C2) const override
 
InstructionCost getOperandsScalarizationOverhead(ArrayRef< Type * > Tys, TTI::TargetCostKind CostKind) const override
Estimate the overhead of scalarizing an instruction's operands.
 
bool isNumRegsMajorCostOfLSR() const override
 
BasicTTIImpl(const TargetMachine *TM, const Function &F)
 
size_type count() const
count - Returns the number of bits which are set.
 
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_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 TargetLibraryInfo * getLibInfo() 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.
 
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
 
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type 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 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.
 
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.
 
virtual bool isFreeAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g.
 
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
 
LegalizeAction getTruncStoreAction(EVT ValVT, EVT MemVT) const
Return how this store with truncation should be treated: either it is legal, needs to be promoted to ...
 
LegalizeAction getLoadExtAction(unsigned ExtType, EVT ValVT, EVT MemVT) const
Return how this load with extension should be treated: either it is legal, needs to be promoted to a ...
 
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...
 
bool isLoadExtLegal(unsigned ExtType, EVT ValVT, EVT MemVT) const
Return true if the specified load with extension is legal on this target.
 
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 ...
 
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.
 
TargetSubtargetInfo - Generic base class for all target subtargets.
 
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.
 
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...
 
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 bool isVPBinOp(Intrinsic::ID ID)
 
static LLVM_ABI bool isVPCast(Intrinsic::ID ID)
 
static LLVM_ABI bool isVPCmp(Intrinsic::ID ID)
 
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.
 
Provides info so a possible vectorization of a function can be computed.
 
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).
 
#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.
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
@ Fast
Attempts to make calls as fast as possible (e.g.
 
@ C
The default llvm calling convention, compatible with C.
 
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.
 
@ 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.
 
@ SSUBO
Same for subtraction.
 
@ 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.
 
@ SMULO
Same for multiplication.
 
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
 
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
 
@ 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)...
 
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.
 
LLVM_ABI Libcall getSINCOSPI(EVT RetVT)
getSINCOSPI - Return the SINCOSPI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
 
LLVM_ABI Libcall getMODF(EVT RetVT)
getMODF - Return the MODF_* value for the given types, or UNKNOWN_LIBCALL if there is none.
 
LLVM_ABI Libcall getSINCOS(EVT RetVT)
getSINCOS - Return the SINCOS_* value for the given types, or UNKNOWN_LIBCALL if there is none.
 
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.
 
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)
 
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).
 
FunctionAddr VTableAddr uintptr_t uintptr_t Data
 
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
 
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
 
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.
 
cl::opt< unsigned > PartialUnrollingThreshold
 
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.
 
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
 
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.
 
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...