31#define DEBUG_TYPE "tti"
35 cl::desc(
"Use this to override the target cache line size when "
36 "specified by the user."));
40 cl::desc(
"Use this to override the target's minimum page size."));
45 "Use this to override the target's predictable branch threshold (%)."));
59 std::unique_ptr<const TargetTransformInfoImplBase> Impl)
76 ScalarizationCost(ScalarizationCost) {
79 FMF = FPMO->getFastMathFlags();
84 ParamTys.push_back(Arg->getType());
92 : II(
I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost) {
93 ParamTys.insert(ParamTys.begin(), Tys.
begin(), Tys.
end());
98 : RetTy(Ty), IID(Id) {
100 Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
101 ParamTys.reserve(Arguments.size());
110 : II(
I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost),
112 ParamTys.insert(ParamTys.begin(), Tys.
begin(), Tys.
end());
113 Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
129 L->getExitingBlocks(ExitingBlocks);
134 if (!
L->isLoopLatch(BB)) {
143 if (ConstEC->getValue()->isZero())
164 bool NotAlways =
false;
166 if (!
L->contains(Pred))
197 : TTIImpl(
std::make_unique<NoTTIImpl>(
DL)) {}
202 : TTIImpl(
std::
move(Arg.TTIImpl)) {}
205 TTIImpl = std::move(RHS.TTIImpl);
210 return TTIImpl->getInliningThresholdMultiplier();
215 return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
221 return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
225 return TTIImpl->getInliningLastCallToStaticBonus();
230 return TTIImpl->adjustInliningThreshold(CB);
235 return TTIImpl->getCallerAllocaCost(CB, AI);
239 return TTIImpl->getInlinerVectorBonusPercent();
245 return TTIImpl->getGEPCost(PointeeType, Ptr,
Operands, CostKind, AccessType);
253 "If pointers have same base address it has to be provided.");
254 return TTIImpl->getPointersChainCost(Ptrs,
Base, Info, AccessTy, CostKind);
260 return TTIImpl->getEstimatedNumberOfCaseClusters(
SI, JTSize, PSI, BFI);
269 "TTI should not produce negative costs!");
276 : TTIImpl->getPredictableBranchThreshold();
280 return TTIImpl->getBranchMispredictPenalty();
284 return TTIImpl->hasBranchDivergence(
F);
292 Call->hasFnAttr(Attribute::NoDivergenceSource))
299 unsigned ToAS)
const {
300 return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
304 unsigned ToAS)
const {
305 return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
309 return TTIImpl->getFlatAddressSpace();
313 unsigned AS2)
const {
314 assert(AS1 != AS2 &&
"Expected distinct address spaces");
315 return TTIImpl->getAddressSpaceJoin(AS1, AS2);
320 return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
324 unsigned ToAS)
const {
325 return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
328std::pair<KnownBits, KnownBits>
330 const Value &PtrOp)
const {
331 return TTIImpl->computeKnownBitsAddrSpaceCast(ToAS, PtrOp);
335 unsigned FromAS,
unsigned ToAS,
const KnownBits &FromPtrBits)
const {
336 return TTIImpl->computeKnownBitsAddrSpaceCast(FromAS, ToAS, FromPtrBits);
340 unsigned SrcAS,
unsigned DstAS)
const {
341 return TTIImpl->getAddrSpaceCastPreservedPtrMask(SrcAS, DstAS);
346 return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
350 return TTIImpl->getAssumedAddrSpace(V);
353std::pair<const Value *, unsigned>
355 return TTIImpl->getPredicatedAddrSpace(V);
360 return TTIImpl->rewriteIntrinsicWithAddressSpace(
II, OldV, NewV);
364 return TTIImpl->isLoweredToCall(
F);
370 return TTIImpl->isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
374 return TTIImpl->getEpilogueVectorizationMinVF();
379 return TTIImpl->preferTailFoldingOverEpilogue(TFI);
383 return TTIImpl->getPreferredTailFoldingStyle();
386std::optional<Instruction *>
389 return TTIImpl->instCombineIntrinsic(IC,
II);
394 bool &KnownBitsComputed)
const {
395 return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC,
II, DemandedMask,
Known,
403 SimplifyAndSetOp)
const {
404 return TTIImpl->simplifyDemandedVectorEltsIntrinsic(
405 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
412 return TTIImpl->getUnrollingPreferences(L, SE, UP, ORE);
417 return TTIImpl->getPeelingPreferences(L, SE, PP);
421 return TTIImpl->isLegalAddImmediate(
Imm);
425 return TTIImpl->isLegalAddScalableImmediate(
Imm);
429 return TTIImpl->isLegalICmpImmediate(
Imm);
434 return TTIImpl->preferLoopExitWithEqualityComparison(
Cond, PostIncExitValue);
439 bool HasBaseReg, int64_t Scale,
442 int64_t ScalableOffset)
const {
443 return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
444 Scale, AddrSpace,
I, ScalableOffset);
449 return TTIImpl->isLSRCostLess(
C1, C2);
453 return TTIImpl->isNumRegsMajorCostOfLSR();
457 return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
461 return TTIImpl->isProfitableLSRChainElement(
I);
465 return TTIImpl->canMacroFuseCmp();
472 return TTIImpl->canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
478 return TTIImpl->getPreferredAddressingMode(L, SE);
484 return TTIImpl->isLegalMaskedStore(DataType, Alignment,
AddressSpace,
491 return TTIImpl->isLegalMaskedLoad(DataType, Alignment,
AddressSpace,
497 return TTIImpl->isLegalSpeculativeLoad(DataType,
AddressSpace);
501 Align Alignment)
const {
502 return TTIImpl->isLegalNTStore(DataType, Alignment);
506 return TTIImpl->isLegalNTLoad(DataType, Alignment);
511 return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
515 Align Alignment)
const {
516 return TTIImpl->isLegalMaskedGather(DataType, Alignment);
520 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
522 return TTIImpl->isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask, Scalars);
526 Align Alignment)
const {
527 return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
531 Align Alignment)
const {
532 return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
536 Align Alignment)
const {
537 return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
541 Align Alignment)
const {
542 return TTIImpl->isLegalMaskedCompressStore(DataType, Alignment);
546 Align Alignment)
const {
547 return TTIImpl->isLegalMaskedExpandLoad(DataType, Alignment);
551 Align Alignment)
const {
552 return TTIImpl->isLegalStridedLoadStore(DataType, Alignment);
557 bool IsStore, std::optional<Instruction::CastOps> CastHint)
const {
558 return TTIImpl->hasMultiVectorLoadStore(NumVectors, Mask, VectorTy, IsStore,
564 unsigned AddrSpace)
const {
565 return TTIImpl->isLegalInterleavedAccessType(VTy, Factor, Alignment,
570 Type *DataType)
const {
571 return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
575 return TTIImpl->enableOrderedReductions();
579 return TTIImpl->hasDivRemOp(DataType, IsSigned);
583 unsigned AddrSpace)
const {
584 return TTIImpl->hasVolatileVariant(
I, AddrSpace);
588 return TTIImpl->prefersVectorizedAddressing();
593 int64_t Scale,
unsigned AddrSpace)
const {
595 Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
596 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
601 return TTIImpl->LSRWithInstrQueries();
605 return TTIImpl->isTruncateFree(Ty1, Ty2);
609 return TTIImpl->isProfitableToHoist(
I);
615 return TTIImpl->isTypeLegal(Ty);
619 return TTIImpl->getRegUsageForType(Ty);
623 return TTIImpl->shouldBuildLookupTables();
628 return TTIImpl->shouldBuildLookupTablesForConstant(
C);
632 return TTIImpl->getMinimumLookupTableEntryBitWidth();
636 return TTIImpl->shouldBuildRelLookupTables();
640 return TTIImpl->useColdCCForColdCall(
F);
644 return TTIImpl->useFastCCForInternalCall(
F);
649 return TTIImpl->isTargetIntrinsicWithScalarOpAtArg(ID, ScalarOpdIdx);
654 return TTIImpl->isTargetIntrinsicWithOverloadTypeAtArg(ID, OpdIdx);
659 return TTIImpl->isTargetIntrinsicWithStructReturnOverloadAtField(ID, RetIdx);
666 return Ctx1 == Ctx2 ? Ctx1 : TargetTransformInfo::VectorInstrContext::None;
677 I->getOperand(1)->hasOneUse())
690 const APInt &DemandedElts) {
693 if (!DemandedElts[
I])
717 return TTIImpl->getBuildVectorContextHint(Mask, Scalars, GatherUseOps);
724 return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
725 CostKind, ForPoisonSrc, VL, VIC);
731 return TTIImpl->getOperandsScalarizationOverhead(Tys, CostKind, VIC);
735 return TTIImpl->supportsEfficientVectorElementLoadStore();
739 return TTIImpl->supportsTailCalls();
743 return TTIImpl->supportsTailCallFor(CB);
747 bool LoopHasReductions)
const {
748 return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
753 return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
757 return TTIImpl->enableSelectOptimize();
762 return TTIImpl->shouldTreatInstructionLikeSelect(
I);
766 return TTIImpl->enableInterleavedAccessVectorization();
770 return TTIImpl->enableMaskedInterleavedAccessVectorization();
774 return TTIImpl->isFPVectorizationPotentiallyUnsafe();
782 unsigned *
Fast)
const {
783 return TTIImpl->allowsMisalignedMemoryAccesses(Context,
BitWidth,
789 return TTIImpl->getPopcntSupport(IntTyWidthInBit);
793 return TTIImpl->haveFastSqrt(Ty);
798 return TTIImpl->isExpensiveToSpeculativelyExecute(
I);
802 return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
807 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
816 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
824 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
829 unsigned Opcode,
unsigned Idx,
const APInt &
Imm,
Type *Ty,
832 TTIImpl->getIntImmCostInst(Opcode, Idx,
Imm, Ty, CostKind, Inst);
833 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
842 TTIImpl->getIntImmCostIntrin(IID, Idx,
Imm, Ty, CostKind);
843 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
849 return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
853 return TTIImpl->getNumberOfRegisters(ClassID);
857 bool IsStore)
const {
858 return TTIImpl->hasConditionalLoadStoreForType(Ty, IsStore);
863 return TTIImpl->getRegisterClassForType(
Vector, Ty);
867 return TTIImpl->getRegisterClassName(ClassID);
872 return TTIImpl->getRegisterClassSpillCost(ClassID, CostKind);
877 return TTIImpl->getRegisterClassReloadCost(ClassID, CostKind);
882 return TTIImpl->getRegisterBitWidth(
K);
886 return TTIImpl->getMinVectorRegisterBitWidth();
890 return TTIImpl->getVScaleForTuning();
895 return TTIImpl->shouldMaximizeVectorBandwidth(
K);
900 return TTIImpl->getMinimumVF(ElemWidth,
IsScalable);
904 unsigned Opcode)
const {
905 return TTIImpl->getMaximumVF(ElemWidth, Opcode);
911 unsigned AddrSpace)
const {
912 return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy, Alignment,
917 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
918 return TTIImpl->shouldConsiderAddressTypePromotion(
919 I, AllowPromotionWithoutCommonHeader);
924 : TTIImpl->getCacheLineSize();
927std::optional<unsigned>
929 return TTIImpl->getCacheSize(Level);
932std::optional<unsigned>
934 return TTIImpl->getCacheAssociativity(Level);
939 : TTIImpl->getMinPageSize();
943 return TTIImpl->getPrefetchDistance();
947 unsigned NumMemAccesses,
unsigned NumStridedMemAccesses,
948 unsigned NumPrefetches,
bool HasCall)
const {
949 return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
950 NumPrefetches, HasCall);
954 return TTIImpl->getMaxPrefetchIterationsAhead();
958 return TTIImpl->enableWritePrefetching();
962 return TTIImpl->shouldPrefetchAddressSpace(AS);
966 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
970 return TTIImpl->getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
971 AccumType, VF, OpAExtend, OpBExtend,
972 BinOp, CostKind, FMF);
977 bool HasUnorderedReductions)
const {
978 return TTIImpl->getMaxInterleaveFactor(VF, HasUnorderedReductions);
992 if (CI->getValue().isPowerOf2())
994 else if (CI->getValue().isNegatedPowerOf2())
1004 if (ShuffleInst->isZeroEltSplat())
1019 if (CI->getValue().isPowerOf2())
1021 else if (CI->getValue().isNegatedPowerOf2())
1027 bool AllPow2 =
true, AllNegPow2 =
true;
1028 for (uint64_t
I = 0, E = CDS->getNumElements();
I != E; ++
I) {
1030 AllPow2 &= CI->getValue().isPowerOf2();
1031 AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
1032 if (AllPow2 || AllNegPow2)
1035 AllPow2 = AllNegPow2 =
false;
1044 return {OpInfo, OpProps};
1050 const auto *Op0 =
Ops.front();
1064 return CI->getValue().isPowerOf2();
1070 return CI->getValue().isNegatedPowerOf2();
1075 if (IsConstant && IsUniform)
1077 else if (IsConstant)
1106 if (TLibInfo && Opcode == Instruction::FRem) {
1108 LibFunc Func = TLibInfo->
getLibFunc(Instruction::FRem, Ty->getScalarType());
1109 if (VecTy && Func != NotLibFunc &&
1116 Opcode, Ty, CostKind, Op1Info, Op2Info, Args, CtxI);
1117 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1122 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
1126 VecTy, Opcode0, Opcode1, OpcodeMask, CostKind, Scalars);
1127 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1138 "Expected the Mask to match the return size if given");
1140 "Expected the same scalar types");
1142 Kind, DstTy, SrcTy, CostKind, Mask, Index, SubTp, Args, CtxI, VIC);
1143 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1159 return Instruction::CastOps::ZExt;
1161 return Instruction::CastOps::SExt;
1163 return Instruction::CastOps::FPExt;
1174 case Instruction::CastOps::ZExt:
1176 case Instruction::CastOps::SExt:
1178 case Instruction::CastOps::FPExt:
1191 auto getLoadStoreKind = [](
const Value *V,
unsigned LdStOp,
unsigned MaskedOp,
1192 unsigned GatScatOp) {
1197 if (
I->getOpcode() == LdStOp)
1201 if (
II->getIntrinsicID() == MaskedOp)
1203 if (
II->getIntrinsicID() == GatScatOp)
1210 switch (
I->getOpcode()) {
1211 case Instruction::ZExt:
1212 case Instruction::SExt:
1213 case Instruction::FPExt:
1214 return getLoadStoreKind(
I->getOperand(0), Instruction::Load,
1215 Intrinsic::masked_load, Intrinsic::masked_gather);
1216 case Instruction::Trunc:
1217 case Instruction::FPTrunc:
1219 return getLoadStoreKind(*
I->user_begin(), Instruction::Store,
1220 Intrinsic::masked_store,
1221 Intrinsic::masked_scatter);
1233 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1234 "Opcode should reflect passed instruction.");
1236 TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH, CostKind,
I);
1237 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1245 TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index, CostKind);
1246 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1252 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1253 "Opcode should reflect passed instruction.");
1255 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1263 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1264 "Opcode should reflect passed instruction.");
1266 Opcode, ValTy, CondTy, VecPred, CostKind, Op1Info, Op2Info,
I);
1267 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1274 assert((Opcode == Instruction::InsertElement ||
1275 Opcode == Instruction::ExtractElement) &&
1276 "Expecting Opcode to be insertelement/extractelement.");
1278 TTIImpl->getVectorInstrCost(Opcode, Val, CostKind, Index, Op0, Op1, VIC);
1279 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1285 Value *Scalar,
ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1287 assert((Opcode == Instruction::InsertElement ||
1288 Opcode == Instruction::ExtractElement) &&
1289 "Expecting Opcode to be insertelement/extractelement.");
1291 Opcode, Val, CostKind, Index, Scalar, ScalarUserAndIdx, VIC);
1292 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1303 TTIImpl->getVectorInstrCost(
I, Val, CostKind, Index, VIC);
1304 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1310 unsigned Index)
const {
1312 TTIImpl->getIndexedVectorInstrCostFromEnd(Opcode, Val, CostKind, Index);
1313 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1319 assert((Opcode == Instruction::InsertValue ||
1320 Opcode == Instruction::ExtractValue) &&
1321 "Expecting Opcode to be insertvalue/extractvalue.");
1323 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1328 Type *EltTy,
int ReplicationFactor,
int VF,
const APInt &DemandedDstElts,
1331 EltTy, ReplicationFactor, VF, DemandedDstElts, CostKind);
1332 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1340 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1341 "Opcode should reflect passed instruction.");
1344 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1351 bool UseMaskForCond,
bool UseMaskForGaps)
const {
1353 Opcode, VecTy, Factor, Indices, Alignment,
AddressSpace, CostKind,
1354 UseMaskForCond, UseMaskForGaps);
1355 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1363 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1371 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1380 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1385 return TTIImpl->getNumberOfParts(Tp);
1392 TTIImpl->getAddressComputationCost(PtrTy, SE, Ptr, CostKind);
1393 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1399 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1404 return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
1408 return TTIImpl->getMaxBoundedMemSetInlineSize();
1412 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1415 TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF, CostKind);
1416 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1424 TTIImpl->getMinMaxReductionCost(IID, Ty, FMF, CostKind);
1425 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1432 return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1437 bool IsUnsigned,
unsigned RedOpcode,
Type *ResTy,
VectorType *Ty,
1439 return TTIImpl->getMulAccReductionCost(IsUnsigned, RedOpcode, ResTy, Ty,
1445 return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
1450 return TTIImpl->getTgtMemIntrinsic(Inst, Info);
1454 return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
1459 return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType,
1465 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1466 std::optional<uint32_t> AtomicElementSize)
const {
1467 return TTIImpl->getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
1468 DestAddrSpace, SrcAlign, DestAlign,
1474 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1476 std::optional<uint32_t> AtomicCpySize)
const {
1477 TTIImpl->getMemcpyLoopResidualLoweringType(
1478 OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
1479 DestAlign, AtomicCpySize);
1484 return TTIImpl->areInlineCompatible(Caller, Callee);
1490 unsigned DefaultCallPenalty)
const {
1491 return TTIImpl->getInlineCallPenalty(
F,
Call, DefaultCallPenalty);
1496 return TTIImpl->shouldCopyAttributeWhenOutliningFrom(Caller, Attr);
1501 return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
1506 return TTIImpl->isIndexedLoadLegal(Mode, Ty);
1511 return TTIImpl->isIndexedStoreLegal(Mode, Ty);
1515 return TTIImpl->getLoadStoreVecRegBitWidth(AS);
1519 return TTIImpl->isLegalToVectorizeLoad(LI);
1523 return TTIImpl->isLegalToVectorizeStore(
SI);
1527 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1528 return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
1533 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1534 return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
1540 return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1544 return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1549 unsigned ChainSizeInBytes,
1551 return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
1556 unsigned ChainSizeInBytes,
1558 return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
1562 return TTIImpl->preferFixedOverScalableIfEqualCost();
1567 return TTIImpl->preferInLoopReduction(Kind, Ty);
1571 return TTIImpl->preferAlternateOpcodeVectorization();
1575 return TTIImpl->preferSLPInstCountCheck();
1579 return TTIImpl->preferPredicatedReductionSelect();
1584 return TTIImpl->preferEpilogueVectorization(Iters);
1588 return TTIImpl->shouldConsiderVectorizationRegPressure();
1593 return TTIImpl->getVPLegalizationStrategy(VPI);
1597 return TTIImpl->hasArmWideBranch(Thumb);
1601 return TTIImpl->getFeatureMask(
F);
1605 return TTIImpl->getPriorityMask(
F);
1609 return TTIImpl->isMultiversionedFunction(
F);
1613 return TTIImpl->getMaxNumArgs();
1617 return TTIImpl->shouldExpandReduction(
II);
1623 return TTIImpl->getPreferredExpandedReductionShuffle(
II);
1627 return TTIImpl->getGISelRematGlobalCost();
1631 return TTIImpl->getMinTripCountTailFoldingThreshold();
1635 return TTIImpl->supportsScalableVectors();
1639 return TTIImpl->enableScalableVectorization();
1643 return TTIImpl->hasActiveVectorLength();
1649 return TTIImpl->isProfitableToSinkOperands(
I, OpsToSink, LI);
1653 return TTIImpl->isVectorShiftByScalarCheap(Ty);
1659 return TTIImpl->collectKernelLaunchBounds(
F, LB);
1663 return TTIImpl->allowVectorElementIndexingUsingGEP();
1668 return TTIImpl->isUniform(
I, UniformArgs);
1677 : TTICallback(
std::
move(TTICallback)) {}
1681 assert(!
F.isIntrinsic() &&
"Should not request TTI for intrinsics");
1682 return TTICallback(
F);
1688 return Result(
F.getDataLayout());
1693 "Target Transform Information",
false,
true)
1707 TTI = TIRA.run(
F, DummyFAM);
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static cl::opt< bool > ForceNestedLoop("force-nested-hardware-loop", cl::Hidden, cl::init(false), cl::desc("Force allowance of nested hardware loops"))
static cl::opt< bool > ForceHardwareLoopPHI("force-hardware-loop-phi", cl::Hidden, cl::init(false), cl::desc("Force hardware loop counter to be updated through a phi"))
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
SmallVector< MachineOperand, 4 > Cond
Provides some synthesis utilities to produce sequences of values.
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)
Class for arbitrary precision integers.
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
A cache of @llvm.assume calls within a function.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM Basic Block Representation.
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...
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Conditional Branch instruction.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Convenience struct for specifying and reasoning about fast-math flags.
This instruction compares its operands according to the predicate given to the constructor.
ImmutablePass class - This class is used to provide information that does not need to be run.
The core instruction combiner logic.
LLVM_ABI IntrinsicCostAttributes(Intrinsic::ID Id, const CallBase &CI, InstructionCost ScalarCost=InstructionCost::getInvalid(), bool TypeBasedOnly=false)
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Wrapper class to LoopBlocksDFS that provides a standard begin()/end() interface for the DFS reverse p...
void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Information for memory intrinsic cost model.
Analysis providing profile information.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
This class represents a constant integer value.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
LLVM_ABI uint64_t getTypeSizeInBits(Type *Ty) const
Return the size in bits of the specified type, for which isSCEVable must return true.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
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.
An instruction for storing to memory.
Analysis pass providing the TargetTransformInfo.
LLVM_ABI Result run(const Function &F, FunctionAnalysisManager &)
TargetTransformInfo Result
LLVM_ABI TargetIRAnalysis()
Default construct a target IR analysis.
Provides information about what library functions are available for the current target.
StringRef getName(LibFunc F) const
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI bool isScalableTy() const
Return true if this is a type whose size is a known multiple of vscale.
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
Base class of all SIMD vector types.
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
VectorInstrContext
Represents a hint about the context in which a vector instruction or intrinsic is used.
@ None
The instruction is not folded.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool containsIrreducibleCFG(RPOTraversalT &RPOTraversal, const LoopInfoT &LI)
Return true if the control flow in RPOTraversal is irreducible.
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...
LLVM_ABI ImmutablePass * createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)
Create an analysis pass wrapper around a TTI object.
RecurKind
These are the kinds of recurrences that we support.
@ Fast
Assign the register banks as fast as possible (default).
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
auto predecessors(const MachineBasicBlock *BB)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
ValueUniformity
Enum describing how values behave with respect to uniformity and divergence, to answer the question: ...
@ NeverUniform
The result value can never be assumed to be uniform.
@ Default
The result value is uniform if and only if all operands are uniform.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Attributes of a target dependent hardware loop.
LLVM_ABI bool canAnalyze(LoopInfo &LI)
HardwareLoopInfo()=delete
LLVM_ABI bool isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop=false, bool ForceHardwareLoopPHI=false)
Information about a load/store intrinsic defined by the target.