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);
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 unsigned AddrSpace)
const {
560 return TTIImpl->isLegalInterleavedAccessType(VTy, Factor, Alignment,
565 Type *DataType)
const {
566 return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
570 return TTIImpl->enableOrderedReductions();
574 return TTIImpl->hasDivRemOp(DataType, IsSigned);
578 unsigned AddrSpace)
const {
579 return TTIImpl->hasVolatileVariant(
I, AddrSpace);
583 return TTIImpl->prefersVectorizedAddressing();
588 int64_t Scale,
unsigned AddrSpace)
const {
590 Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
591 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
596 return TTIImpl->LSRWithInstrQueries();
600 return TTIImpl->isTruncateFree(Ty1, Ty2);
604 return TTIImpl->isProfitableToHoist(
I);
610 return TTIImpl->isTypeLegal(Ty);
614 return TTIImpl->getRegUsageForType(Ty);
618 return TTIImpl->shouldBuildLookupTables();
623 return TTIImpl->shouldBuildLookupTablesForConstant(
C);
627 return TTIImpl->getMinimumLookupTableEntryBitWidth();
631 return TTIImpl->shouldBuildRelLookupTables();
635 return TTIImpl->useColdCCForColdCall(
F);
639 return TTIImpl->useFastCCForInternalCall(
F);
644 return TTIImpl->isTargetIntrinsicWithScalarOpAtArg(ID, ScalarOpdIdx);
649 return TTIImpl->isTargetIntrinsicWithOverloadTypeAtArg(ID, OpdIdx);
654 return TTIImpl->isTargetIntrinsicWithStructReturnOverloadAtField(ID, RetIdx);
661 return Ctx1 == Ctx2 ? Ctx1 : TargetTransformInfo::VectorInstrContext::None;
672 I->getOperand(1)->hasOneUse())
688 return TTIImpl->getBuildVectorContextHint(Mask, Scalars, GatherUseOps);
695 return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
702 return TTIImpl->getOperandsScalarizationOverhead(Tys,
CostKind, VIC);
706 return TTIImpl->supportsEfficientVectorElementLoadStore();
710 return TTIImpl->supportsTailCalls();
714 return TTIImpl->supportsTailCallFor(CB);
718 bool LoopHasReductions)
const {
719 return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
724 return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
728 return TTIImpl->enableSelectOptimize();
733 return TTIImpl->shouldTreatInstructionLikeSelect(
I);
737 return TTIImpl->enableInterleavedAccessVectorization();
741 return TTIImpl->enableMaskedInterleavedAccessVectorization();
745 return TTIImpl->isFPVectorizationPotentiallyUnsafe();
753 unsigned *
Fast)
const {
754 return TTIImpl->allowsMisalignedMemoryAccesses(Context,
BitWidth,
760 return TTIImpl->getPopcntSupport(IntTyWidthInBit);
764 return TTIImpl->haveFastSqrt(Ty);
768 return TTIImpl->haveFastClmul(Ty);
773 return TTIImpl->isExpensiveToSpeculativelyExecute(
I);
777 return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
782 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
791 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
799 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
804 unsigned Opcode,
unsigned Idx,
const APInt &
Imm,
Type *Ty,
807 TTIImpl->getIntImmCostInst(Opcode, Idx,
Imm, Ty,
CostKind, Inst);
808 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
817 TTIImpl->getIntImmCostIntrin(IID, Idx,
Imm, Ty,
CostKind);
818 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
824 return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
828 return TTIImpl->getNumberOfRegisters(ClassID);
832 bool IsStore)
const {
833 return TTIImpl->hasConditionalLoadStoreForType(Ty, IsStore);
838 return TTIImpl->getRegisterClassForType(
Vector, Ty);
842 return TTIImpl->getRegisterClassName(ClassID);
847 return TTIImpl->getRegisterClassSpillCost(ClassID,
CostKind);
852 return TTIImpl->getRegisterClassReloadCost(ClassID,
CostKind);
857 return TTIImpl->getRegisterBitWidth(
K);
861 return TTIImpl->getMinVectorRegisterBitWidth();
865 return TTIImpl->getVScaleForTuning();
870 return TTIImpl->shouldMaximizeVectorBandwidth(
K);
874 bool IsScalable)
const {
875 return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
879 unsigned Opcode)
const {
880 return TTIImpl->getMaximumVF(ElemWidth, Opcode);
886 unsigned AddrSpace)
const {
887 return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy, Alignment,
892 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
893 return TTIImpl->shouldConsiderAddressTypePromotion(
894 I, AllowPromotionWithoutCommonHeader);
899 : TTIImpl->getCacheLineSize();
902std::optional<unsigned>
904 return TTIImpl->getCacheSize(Level);
907std::optional<unsigned>
909 return TTIImpl->getCacheAssociativity(Level);
914 : TTIImpl->getMinPageSize();
918 return TTIImpl->getPrefetchDistance();
922 unsigned NumMemAccesses,
unsigned NumStridedMemAccesses,
923 unsigned NumPrefetches,
bool HasCall)
const {
924 return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
925 NumPrefetches, HasCall);
929 return TTIImpl->getMaxPrefetchIterationsAhead();
933 return TTIImpl->enableWritePrefetching();
937 return TTIImpl->shouldPrefetchAddressSpace(AS);
941 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
945 return TTIImpl->getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
946 AccumType, VF, OpAExtend, OpBExtend,
952 bool HasUnorderedReductions)
const {
953 return TTIImpl->getMaxInterleaveFactor(VF, HasUnorderedReductions);
967 if (CI->getValue().isPowerOf2())
969 else if (CI->getValue().isNegatedPowerOf2())
979 if (ShuffleInst->isZeroEltSplat())
994 if (CI->getValue().isPowerOf2())
996 else if (CI->getValue().isNegatedPowerOf2())
1002 bool AllPow2 =
true, AllNegPow2 =
true;
1003 for (uint64_t
I = 0, E = CDS->getNumElements();
I != E; ++
I) {
1005 AllPow2 &= CI->getValue().isPowerOf2();
1006 AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
1007 if (AllPow2 || AllNegPow2)
1010 AllPow2 = AllNegPow2 =
false;
1019 return {OpInfo, OpProps};
1039 if (TLibInfo && Opcode == Instruction::FRem) {
1041 LibFunc Func = TLibInfo->
getLibFunc(Instruction::FRem, Ty->getScalarType());
1042 if (VecTy && Func != NotLibFunc &&
1049 Opcode, Ty,
CostKind, Op1Info, Op2Info, Args, CtxI);
1050 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1055 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
1058 TTIImpl->getAltInstrCost(VecTy, Opcode0, Opcode1, OpcodeMask,
CostKind);
1059 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1070 "Expected the Mask to match the return size if given");
1072 "Expected the same scalar types");
1074 Kind, DstTy, SrcTy,
CostKind, Mask, Index, SubTp, Args, CtxI, VIC);
1075 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1091 return Instruction::CastOps::ZExt;
1093 return Instruction::CastOps::SExt;
1095 return Instruction::CastOps::FPExt;
1106 case Instruction::CastOps::ZExt:
1108 case Instruction::CastOps::SExt:
1110 case Instruction::CastOps::FPExt:
1123 auto getLoadStoreKind = [](
const Value *V,
unsigned LdStOp,
unsigned MaskedOp,
1124 unsigned GatScatOp) {
1129 if (
I->getOpcode() == LdStOp)
1133 if (
II->getIntrinsicID() == MaskedOp)
1135 if (
II->getIntrinsicID() == GatScatOp)
1142 switch (
I->getOpcode()) {
1143 case Instruction::ZExt:
1144 case Instruction::SExt:
1145 case Instruction::FPExt:
1146 return getLoadStoreKind(
I->getOperand(0), Instruction::Load,
1147 Intrinsic::masked_load, Intrinsic::masked_gather);
1148 case Instruction::Trunc:
1149 case Instruction::FPTrunc:
1151 return getLoadStoreKind(*
I->user_begin(), Instruction::Store,
1152 Intrinsic::masked_store,
1153 Intrinsic::masked_scatter);
1165 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1166 "Opcode should reflect passed instruction.");
1168 TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH,
CostKind,
I);
1169 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1177 TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index,
CostKind);
1178 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1184 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1185 "Opcode should reflect passed instruction.");
1187 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1195 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1196 "Opcode should reflect passed instruction.");
1198 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
1199 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1206 assert((Opcode == Instruction::InsertElement ||
1207 Opcode == Instruction::ExtractElement) &&
1208 "Expecting Opcode to be insertelement/extractelement.");
1210 TTIImpl->getVectorInstrCost(Opcode, Val,
CostKind, Index, Op0, Op1, VIC);
1211 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1217 Value *Scalar,
ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1219 assert((Opcode == Instruction::InsertElement ||
1220 Opcode == Instruction::ExtractElement) &&
1221 "Expecting Opcode to be insertelement/extractelement.");
1223 Opcode, Val,
CostKind, Index, Scalar, ScalarUserAndIdx, VIC);
1224 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1235 TTIImpl->getVectorInstrCost(
I, Val,
CostKind, Index, VIC);
1236 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1242 unsigned Index)
const {
1244 TTIImpl->getIndexedVectorInstrCostFromEnd(Opcode, Val,
CostKind, Index);
1245 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1251 assert((Opcode == Instruction::InsertValue ||
1252 Opcode == Instruction::ExtractValue) &&
1253 "Expecting Opcode to be insertvalue/extractvalue.");
1255 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1260 Type *EltTy,
int ReplicationFactor,
int VF,
const APInt &DemandedDstElts,
1263 EltTy, ReplicationFactor, VF, DemandedDstElts,
CostKind);
1264 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1272 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1273 "Opcode should reflect passed instruction.");
1276 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1283 bool UseMaskForCond,
bool UseMaskForGaps)
const {
1286 UseMaskForCond, UseMaskForGaps);
1287 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1295 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1303 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1312 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1317 return TTIImpl->getNumberOfParts(Tp);
1324 TTIImpl->getAddressComputationCost(PtrTy, SE, Ptr,
CostKind);
1325 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1331 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1336 return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
1340 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1343 TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF,
CostKind);
1344 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1352 TTIImpl->getMinMaxReductionCost(IID, Ty, FMF,
CostKind);
1353 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1360 return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1365 bool IsUnsigned,
unsigned RedOpcode,
Type *ResTy,
VectorType *Ty,
1367 return TTIImpl->getMulAccReductionCost(IsUnsigned, RedOpcode, ResTy, Ty,
1373 return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
1378 return TTIImpl->getTgtMemIntrinsic(Inst, Info);
1382 return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
1387 return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType,
1393 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1394 std::optional<uint32_t> AtomicElementSize)
const {
1395 return TTIImpl->getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
1396 DestAddrSpace, SrcAlign, DestAlign,
1402 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1404 std::optional<uint32_t> AtomicCpySize)
const {
1405 TTIImpl->getMemcpyLoopResidualLoweringType(
1406 OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
1407 DestAlign, AtomicCpySize);
1412 return TTIImpl->areInlineCompatible(Caller, Callee);
1418 unsigned DefaultCallPenalty)
const {
1419 return TTIImpl->getInlineCallPenalty(
F,
Call, DefaultCallPenalty);
1424 return TTIImpl->shouldCopyAttributeWhenOutliningFrom(Caller, Attr);
1429 return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
1434 return TTIImpl->isIndexedLoadLegal(Mode, Ty);
1439 return TTIImpl->isIndexedStoreLegal(Mode, Ty);
1443 return TTIImpl->getLoadStoreVecRegBitWidth(AS);
1447 return TTIImpl->isLegalToVectorizeLoad(LI);
1451 return TTIImpl->isLegalToVectorizeStore(
SI);
1455 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1456 return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
1461 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1462 return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
1468 return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1472 return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1477 unsigned ChainSizeInBytes,
1479 return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
1484 unsigned ChainSizeInBytes,
1486 return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
1490 return TTIImpl->preferFixedOverScalableIfEqualCost();
1495 return TTIImpl->preferInLoopReduction(Kind, Ty);
1499 return TTIImpl->preferAlternateOpcodeVectorization();
1503 return TTIImpl->preferSLPInstCountCheck();
1507 return TTIImpl->preferPredicatedReductionSelect();
1512 return TTIImpl->preferEpilogueVectorization(Iters);
1516 return TTIImpl->shouldConsiderVectorizationRegPressure();
1521 return TTIImpl->getVPLegalizationStrategy(VPI);
1525 return TTIImpl->hasArmWideBranch(Thumb);
1529 return TTIImpl->getFeatureMask(
F);
1533 return TTIImpl->getPriorityMask(
F);
1537 return TTIImpl->isMultiversionedFunction(
F);
1541 return TTIImpl->getMaxNumArgs();
1545 return TTIImpl->shouldExpandReduction(
II);
1551 return TTIImpl->getPreferredExpandedReductionShuffle(
II);
1555 return TTIImpl->getGISelRematGlobalCost();
1559 return TTIImpl->getMinTripCountTailFoldingThreshold();
1563 return TTIImpl->supportsScalableVectors();
1567 return TTIImpl->enableScalableVectorization();
1571 return TTIImpl->hasActiveVectorLength();
1576 return TTIImpl->isProfitableToSinkOperands(
I, OpsToSink);
1580 return TTIImpl->isVectorShiftByScalarCheap(Ty);
1586 return TTIImpl->getNumBytesToPadGlobalArray(
Size,
ArrayType);
1592 return TTIImpl->collectKernelLaunchBounds(
F, LB);
1596 return TTIImpl->allowVectorElementIndexingUsingGEP();
1601 return TTIImpl->isUniform(
I, UniformArgs);
1610 : TTICallback(
std::
move(TTICallback)) {}
1614 assert(!
F.isIntrinsic() &&
"Should not request TTI for intrinsics");
1615 return TTICallback(
F);
1621 return Result(
F.getDataLayout());
1626 "Target Transform Information",
false,
true)
1640 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.
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),...
Class to represent array types.
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.
Class to represent integer types.
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.
@ 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.