30#define DEBUG_TYPE "tti"
34 cl::desc(
"Recognize reduction patterns."));
38 cl::desc(
"Use this to override the target cache line size when "
39 "specified by the user."));
43 cl::desc(
"Use this to override the target's minimum page size."));
48 "Use this to override the target's predictable branch threshold (%)."));
62 std::unique_ptr<const TargetTransformInfoImplBase> Impl)
79 ScalarizationCost(ScalarizationCost) {
82 FMF = FPMO->getFastMathFlags();
87 ParamTys.push_back(Arg->getType());
95 : II(
I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost) {
96 ParamTys.insert(ParamTys.begin(), Tys.
begin(), Tys.
end());
101 : RetTy(Ty), IID(Id) {
103 Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
104 ParamTys.reserve(Arguments.size());
113 : II(
I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost),
115 ParamTys.insert(ParamTys.begin(), Tys.
begin(), Tys.
end());
116 Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
132 L->getExitingBlocks(ExitingBlocks);
137 if (!
L->isLoopLatch(BB)) {
146 if (ConstEC->getValue()->isZero())
167 bool NotAlways =
false;
169 if (!
L->contains(Pred))
204 : TTIImpl(
std::make_unique<NoTTIImpl>(
DL)) {}
209 : TTIImpl(
std::
move(Arg.TTIImpl)) {}
212 TTIImpl = std::move(RHS.TTIImpl);
217 return TTIImpl->getInliningThresholdMultiplier();
222 return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
228 return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
232 return TTIImpl->getInliningLastCallToStaticBonus();
237 return TTIImpl->adjustInliningThreshold(CB);
242 return TTIImpl->getCallerAllocaCost(CB, AI);
246 return TTIImpl->getInlinerVectorBonusPercent();
252 return TTIImpl->getGEPCost(PointeeType, Ptr,
Operands,
CostKind, AccessType);
260 "If pointers have same base address it has to be provided.");
261 return TTIImpl->getPointersChainCost(Ptrs,
Base, Info, AccessTy,
CostKind);
267 return TTIImpl->getEstimatedNumberOfCaseClusters(
SI, JTSize, PSI, BFI);
276 "TTI should not produce negative costs!");
283 : TTIImpl->getPredictableBranchThreshold();
287 return TTIImpl->getBranchMispredictPenalty();
291 return TTIImpl->hasBranchDivergence(
F);
299 Call->hasFnAttr(Attribute::NoDivergenceSource))
306 unsigned ToAS)
const {
307 return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
311 unsigned ToAS)
const {
312 return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
316 return TTIImpl->getFlatAddressSpace();
320 unsigned AS2)
const {
321 assert(AS1 != AS2 &&
"Expected distinct address spaces");
322 return TTIImpl->getAddressSpaceJoin(AS1, AS2);
327 return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
331 unsigned ToAS)
const {
332 return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
335std::pair<KnownBits, KnownBits>
337 const Value &PtrOp)
const {
338 return TTIImpl->computeKnownBitsAddrSpaceCast(ToAS, PtrOp);
342 unsigned FromAS,
unsigned ToAS,
const KnownBits &FromPtrBits)
const {
343 return TTIImpl->computeKnownBitsAddrSpaceCast(FromAS, ToAS, FromPtrBits);
347 unsigned SrcAS,
unsigned DstAS)
const {
348 return TTIImpl->getAddrSpaceCastPreservedPtrMask(SrcAS, DstAS);
353 return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
357 return TTIImpl->getAssumedAddrSpace(V);
360std::pair<const Value *, unsigned>
362 return TTIImpl->getPredicatedAddrSpace(V);
367 return TTIImpl->rewriteIntrinsicWithAddressSpace(
II, OldV, NewV);
371 return TTIImpl->isLoweredToCall(
F);
377 return TTIImpl->isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
381 return TTIImpl->getEpilogueVectorizationMinVF();
386 return TTIImpl->preferTailFoldingOverEpilogue(TFI);
390 return TTIImpl->getPreferredTailFoldingStyle();
393std::optional<Instruction *>
396 return TTIImpl->instCombineIntrinsic(IC,
II);
401 bool &KnownBitsComputed)
const {
402 return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC,
II, DemandedMask,
Known,
410 SimplifyAndSetOp)
const {
411 return TTIImpl->simplifyDemandedVectorEltsIntrinsic(
412 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
419 return TTIImpl->getUnrollingPreferences(L, SE, UP, ORE);
424 return TTIImpl->getPeelingPreferences(L, SE, PP);
428 return TTIImpl->isLegalAddImmediate(
Imm);
432 return TTIImpl->isLegalAddScalableImmediate(
Imm);
436 return TTIImpl->isLegalICmpImmediate(
Imm);
441 bool HasBaseReg, int64_t Scale,
444 int64_t ScalableOffset)
const {
445 return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
446 Scale, AddrSpace,
I, ScalableOffset);
451 return TTIImpl->isLSRCostLess(C1, C2);
455 return TTIImpl->isNumRegsMajorCostOfLSR();
459 return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
463 return TTIImpl->isProfitableLSRChainElement(
I);
467 return TTIImpl->canMacroFuseCmp();
474 return TTIImpl->canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
480 return TTIImpl->getPreferredAddressingMode(L, SE);
486 return TTIImpl->isLegalMaskedStore(DataType, Alignment,
AddressSpace,
493 return TTIImpl->isLegalMaskedLoad(DataType, Alignment,
AddressSpace,
499 return TTIImpl->isLegalSpeculativeLoad(DataType,
AddressSpace);
503 Align Alignment)
const {
504 return TTIImpl->isLegalNTStore(DataType, Alignment);
508 return TTIImpl->isLegalNTLoad(DataType, Alignment);
513 return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
517 Align Alignment)
const {
518 return TTIImpl->isLegalMaskedGather(DataType, Alignment);
522 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
524 return TTIImpl->isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask, Scalars);
528 Align Alignment)
const {
529 return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
533 Align Alignment)
const {
534 return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
538 Align Alignment)
const {
539 return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
543 Align Alignment)
const {
544 return TTIImpl->isLegalMaskedCompressStore(DataType, Alignment);
548 Align Alignment)
const {
549 return TTIImpl->isLegalMaskedExpandLoad(DataType, Alignment);
553 Align Alignment)
const {
554 return TTIImpl->isLegalStridedLoadStore(DataType, Alignment);
559 bool IsStore, std::optional<Instruction::CastOps> CastHint)
const {
560 return TTIImpl->hasMultiVectorLoadStore(NumVectors, Mask, VectorTy, IsStore,
566 unsigned AddrSpace)
const {
567 return TTIImpl->isLegalInterleavedAccessType(VTy, Factor, Alignment,
572 Type *DataType)
const {
573 return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
577 return TTIImpl->enableOrderedReductions();
581 return TTIImpl->hasDivRemOp(DataType, IsSigned);
585 unsigned AddrSpace)
const {
586 return TTIImpl->hasVolatileVariant(
I, AddrSpace);
590 return TTIImpl->prefersVectorizedAddressing();
595 int64_t Scale,
unsigned AddrSpace)
const {
597 Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
598 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
603 return TTIImpl->LSRWithInstrQueries();
607 return TTIImpl->isTruncateFree(Ty1, Ty2);
611 return TTIImpl->isProfitableToHoist(
I);
617 return TTIImpl->isTypeLegal(Ty);
621 return TTIImpl->getRegUsageForType(Ty);
625 return TTIImpl->shouldBuildLookupTables();
630 return TTIImpl->shouldBuildLookupTablesForConstant(
C);
634 return TTIImpl->getMinimumLookupTableEntryBitWidth();
638 return TTIImpl->shouldBuildRelLookupTables();
642 return TTIImpl->useColdCCForColdCall(
F);
646 return TTIImpl->useFastCCForInternalCall(
F);
651 return TTIImpl->isTargetIntrinsicWithScalarOpAtArg(ID, ScalarOpdIdx);
656 return TTIImpl->isTargetIntrinsicWithOverloadTypeAtArg(ID, OpdIdx);
661 return TTIImpl->isTargetIntrinsicWithStructReturnOverloadAtField(ID, RetIdx);
668 return Ctx1 == Ctx2 ? Ctx1 : TargetTransformInfo::VectorInstrContext::None;
679 I->getOperand(1)->hasOneUse())
695 return TTIImpl->getBuildVectorContextHint(Mask, Scalars, GatherUseOps);
702 return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
709 return TTIImpl->getOperandsScalarizationOverhead(Tys,
CostKind, VIC);
713 return TTIImpl->supportsEfficientVectorElementLoadStore();
717 return TTIImpl->supportsTailCalls();
721 return TTIImpl->supportsTailCallFor(CB);
725 bool LoopHasReductions)
const {
726 return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
731 return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
735 return TTIImpl->enableSelectOptimize();
740 return TTIImpl->shouldTreatInstructionLikeSelect(
I);
744 return TTIImpl->enableInterleavedAccessVectorization();
748 return TTIImpl->enableMaskedInterleavedAccessVectorization();
752 return TTIImpl->isFPVectorizationPotentiallyUnsafe();
760 unsigned *
Fast)
const {
761 return TTIImpl->allowsMisalignedMemoryAccesses(Context,
BitWidth,
767 return TTIImpl->getPopcntSupport(IntTyWidthInBit);
771 return TTIImpl->haveFastSqrt(Ty);
776 return TTIImpl->isExpensiveToSpeculativelyExecute(
I);
780 return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
785 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
794 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
802 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
807 unsigned Opcode,
unsigned Idx,
const APInt &
Imm,
Type *Ty,
810 TTIImpl->getIntImmCostInst(Opcode, Idx,
Imm, Ty,
CostKind, Inst);
811 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
820 TTIImpl->getIntImmCostIntrin(IID, Idx,
Imm, Ty,
CostKind);
821 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
827 return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
831 return TTIImpl->getNumberOfRegisters(ClassID);
835 bool IsStore)
const {
836 return TTIImpl->hasConditionalLoadStoreForType(Ty, IsStore);
841 return TTIImpl->getRegisterClassForType(
Vector, Ty);
845 return TTIImpl->getRegisterClassName(ClassID);
850 return TTIImpl->getRegisterClassSpillCost(ClassID,
CostKind);
855 return TTIImpl->getRegisterClassReloadCost(ClassID,
CostKind);
860 return TTIImpl->getRegisterBitWidth(
K);
864 return TTIImpl->getMinVectorRegisterBitWidth();
868 return TTIImpl->getVScaleForTuning();
873 return TTIImpl->shouldMaximizeVectorBandwidth(
K);
877 bool IsScalable)
const {
878 return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
882 unsigned Opcode)
const {
883 return TTIImpl->getMaximumVF(ElemWidth, Opcode);
889 unsigned AddrSpace)
const {
890 return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy, Alignment,
895 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
896 return TTIImpl->shouldConsiderAddressTypePromotion(
897 I, AllowPromotionWithoutCommonHeader);
902 : TTIImpl->getCacheLineSize();
905std::optional<unsigned>
907 return TTIImpl->getCacheSize(Level);
910std::optional<unsigned>
912 return TTIImpl->getCacheAssociativity(Level);
917 : TTIImpl->getMinPageSize();
921 return TTIImpl->getPrefetchDistance();
925 unsigned NumMemAccesses,
unsigned NumStridedMemAccesses,
926 unsigned NumPrefetches,
bool HasCall)
const {
927 return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
928 NumPrefetches, HasCall);
932 return TTIImpl->getMaxPrefetchIterationsAhead();
936 return TTIImpl->enableWritePrefetching();
940 return TTIImpl->shouldPrefetchAddressSpace(AS);
944 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
948 return TTIImpl->getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
949 AccumType, VF, OpAExtend, OpBExtend,
955 bool HasUnorderedReductions)
const {
956 return TTIImpl->getMaxInterleaveFactor(VF, HasUnorderedReductions);
970 if (CI->getValue().isPowerOf2())
972 else if (CI->getValue().isNegatedPowerOf2())
982 if (ShuffleInst->isZeroEltSplat())
997 if (CI->getValue().isPowerOf2())
999 else if (CI->getValue().isNegatedPowerOf2())
1005 bool AllPow2 =
true, AllNegPow2 =
true;
1006 for (uint64_t
I = 0, E = CDS->getNumElements();
I != E; ++
I) {
1008 AllPow2 &= CI->getValue().isPowerOf2();
1009 AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
1010 if (AllPow2 || AllNegPow2)
1013 AllPow2 = AllNegPow2 =
false;
1022 return {OpInfo, OpProps};
1028 const auto *Op0 =
Ops.front();
1042 return CI->getValue().isPowerOf2();
1048 return CI->getValue().isNegatedPowerOf2();
1053 if (IsConstant && IsUniform)
1055 else if (IsConstant)
1084 if (TLibInfo && Opcode == Instruction::FRem) {
1086 LibFunc Func = TLibInfo->
getLibFunc(Instruction::FRem, Ty->getScalarType());
1087 if (VecTy && Func != NotLibFunc &&
1094 Opcode, Ty,
CostKind, Op1Info, Op2Info, Args, CtxI);
1095 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1100 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
1104 VecTy, Opcode0, Opcode1, OpcodeMask,
CostKind, Scalars);
1105 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1116 "Expected the Mask to match the return size if given");
1118 "Expected the same scalar types");
1120 Kind, DstTy, SrcTy,
CostKind, Mask, Index, SubTp, Args, CtxI, VIC);
1121 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1137 return Instruction::CastOps::ZExt;
1139 return Instruction::CastOps::SExt;
1141 return Instruction::CastOps::FPExt;
1152 case Instruction::CastOps::ZExt:
1154 case Instruction::CastOps::SExt:
1156 case Instruction::CastOps::FPExt:
1169 auto getLoadStoreKind = [](
const Value *V,
unsigned LdStOp,
unsigned MaskedOp,
1170 unsigned GatScatOp) {
1175 if (
I->getOpcode() == LdStOp)
1179 if (
II->getIntrinsicID() == MaskedOp)
1181 if (
II->getIntrinsicID() == GatScatOp)
1188 switch (
I->getOpcode()) {
1189 case Instruction::ZExt:
1190 case Instruction::SExt:
1191 case Instruction::FPExt:
1192 return getLoadStoreKind(
I->getOperand(0), Instruction::Load,
1193 Intrinsic::masked_load, Intrinsic::masked_gather);
1194 case Instruction::Trunc:
1195 case Instruction::FPTrunc:
1197 return getLoadStoreKind(*
I->user_begin(), Instruction::Store,
1198 Intrinsic::masked_store,
1199 Intrinsic::masked_scatter);
1211 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1212 "Opcode should reflect passed instruction.");
1214 TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH,
CostKind,
I);
1215 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1223 TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index,
CostKind);
1224 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1230 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1231 "Opcode should reflect passed instruction.");
1233 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1241 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1242 "Opcode should reflect passed instruction.");
1244 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
1245 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1252 assert((Opcode == Instruction::InsertElement ||
1253 Opcode == Instruction::ExtractElement) &&
1254 "Expecting Opcode to be insertelement/extractelement.");
1256 TTIImpl->getVectorInstrCost(Opcode, Val,
CostKind, Index, Op0, Op1, VIC);
1257 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1263 Value *Scalar,
ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1265 assert((Opcode == Instruction::InsertElement ||
1266 Opcode == Instruction::ExtractElement) &&
1267 "Expecting Opcode to be insertelement/extractelement.");
1269 Opcode, Val,
CostKind, Index, Scalar, ScalarUserAndIdx, VIC);
1270 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1281 TTIImpl->getVectorInstrCost(
I, Val,
CostKind, Index, VIC);
1282 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1288 unsigned Index)
const {
1290 TTIImpl->getIndexedVectorInstrCostFromEnd(Opcode, Val,
CostKind, Index);
1291 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1297 assert((Opcode == Instruction::InsertValue ||
1298 Opcode == Instruction::ExtractValue) &&
1299 "Expecting Opcode to be insertvalue/extractvalue.");
1301 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1306 Type *EltTy,
int ReplicationFactor,
int VF,
const APInt &DemandedDstElts,
1309 EltTy, ReplicationFactor, VF, DemandedDstElts,
CostKind);
1310 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1318 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1319 "Opcode should reflect passed instruction.");
1322 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1329 bool UseMaskForCond,
bool UseMaskForGaps)
const {
1332 UseMaskForCond, UseMaskForGaps);
1333 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1341 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1349 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1358 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1363 return TTIImpl->getNumberOfParts(Tp);
1370 TTIImpl->getAddressComputationCost(PtrTy, SE, Ptr,
CostKind);
1371 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1377 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1382 return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
1386 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1389 TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF,
CostKind);
1390 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1398 TTIImpl->getMinMaxReductionCost(IID, Ty, FMF,
CostKind);
1399 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1406 return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1411 bool IsUnsigned,
unsigned RedOpcode,
Type *ResTy,
VectorType *Ty,
1413 return TTIImpl->getMulAccReductionCost(IsUnsigned, RedOpcode, ResTy, Ty,
1419 return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
1424 return TTIImpl->getTgtMemIntrinsic(Inst, Info);
1428 return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
1433 return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType,
1439 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1440 std::optional<uint32_t> AtomicElementSize)
const {
1441 return TTIImpl->getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
1442 DestAddrSpace, SrcAlign, DestAlign,
1448 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1450 std::optional<uint32_t> AtomicCpySize)
const {
1451 TTIImpl->getMemcpyLoopResidualLoweringType(
1452 OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
1453 DestAlign, AtomicCpySize);
1458 return TTIImpl->areInlineCompatible(Caller, Callee);
1464 unsigned DefaultCallPenalty)
const {
1465 return TTIImpl->getInlineCallPenalty(
F,
Call, DefaultCallPenalty);
1470 return TTIImpl->shouldCopyAttributeWhenOutliningFrom(Caller, Attr);
1475 return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
1480 return TTIImpl->isIndexedLoadLegal(Mode, Ty);
1485 return TTIImpl->isIndexedStoreLegal(Mode, Ty);
1489 return TTIImpl->getLoadStoreVecRegBitWidth(AS);
1493 return TTIImpl->isLegalToVectorizeLoad(LI);
1497 return TTIImpl->isLegalToVectorizeStore(
SI);
1501 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1502 return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
1507 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1508 return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
1514 return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1518 return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1523 unsigned ChainSizeInBytes,
1525 return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
1530 unsigned ChainSizeInBytes,
1532 return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
1536 return TTIImpl->preferFixedOverScalableIfEqualCost();
1541 return TTIImpl->preferInLoopReduction(Kind, Ty);
1545 return TTIImpl->preferAlternateOpcodeVectorization();
1549 return TTIImpl->preferSLPInstCountCheck();
1553 return TTIImpl->preferPredicatedReductionSelect();
1558 return TTIImpl->preferEpilogueVectorization(Iters);
1562 return TTIImpl->shouldConsiderVectorizationRegPressure();
1567 return TTIImpl->getVPLegalizationStrategy(VPI);
1571 return TTIImpl->hasArmWideBranch(Thumb);
1575 return TTIImpl->getFeatureMask(
F);
1579 return TTIImpl->getPriorityMask(
F);
1583 return TTIImpl->isMultiversionedFunction(
F);
1587 return TTIImpl->getMaxNumArgs();
1591 return TTIImpl->shouldExpandReduction(
II);
1597 return TTIImpl->getPreferredExpandedReductionShuffle(
II);
1601 return TTIImpl->getGISelRematGlobalCost();
1605 return TTIImpl->getMinTripCountTailFoldingThreshold();
1609 return TTIImpl->supportsScalableVectors();
1613 return TTIImpl->enableScalableVectorization();
1617 return TTIImpl->hasActiveVectorLength();
1622 return TTIImpl->isProfitableToSinkOperands(
I, OpsToSink);
1626 return TTIImpl->isVectorShiftByScalarCheap(Ty);
1632 return TTIImpl->collectKernelLaunchBounds(
F, LB);
1636 return TTIImpl->allowVectorElementIndexingUsingGEP();
1641 return TTIImpl->isUniform(
I, UniformArgs);
1650 : TTICallback(
std::
move(TTICallback)) {}
1654 assert(!
F.isIntrinsic() &&
"Should not request TTI for intrinsics");
1655 return TTICallback(
F);
1661 return Result(
F.getDataLayout());
1666 "Target Transform Information",
false,
true)
1680 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< 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")))
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)
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),...
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.
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.
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.