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.insert(ParamTys.begin(), FTy->param_begin(), FTy->param_end());
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());
115 : II(
I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost) {
116 ParamTys.insert(ParamTys.begin(), Tys.
begin(), Tys.
end());
117 Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
133 L->getExitingBlocks(ExitingBlocks);
138 if (!
L->isLoopLatch(BB)) {
147 if (ConstEC->getValue()->isZero())
168 bool NotAlways =
false;
170 if (!
L->contains(Pred))
205 : TTIImpl(
std::make_unique<NoTTIImpl>(
DL)) {}
210 : TTIImpl(
std::
move(Arg.TTIImpl)) {}
213 TTIImpl = std::move(RHS.TTIImpl);
218 return TTIImpl->getInliningThresholdMultiplier();
223 return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
229 return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
233 return TTIImpl->getInliningLastCallToStaticBonus();
238 return TTIImpl->adjustInliningThreshold(CB);
243 return TTIImpl->getCallerAllocaCost(CB, AI);
247 return TTIImpl->getInlinerVectorBonusPercent();
253 return TTIImpl->getGEPCost(PointeeType, Ptr, Operands, AccessType,
CostKind);
261 "If pointers have same base address it has to be provided.");
262 return TTIImpl->getPointersChainCost(Ptrs,
Base, Info, AccessTy,
CostKind);
268 return TTIImpl->getEstimatedNumberOfCaseClusters(
SI, JTSize, PSI, BFI);
277 "TTI should not produce negative costs!");
284 : TTIImpl->getPredictableBranchThreshold();
288 return TTIImpl->getBranchMispredictPenalty();
292 return TTIImpl->hasBranchDivergence(
F);
300 Call->hasFnAttr(Attribute::NoDivergenceSource))
307 unsigned ToAS)
const {
308 return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
312 unsigned ToAS)
const {
313 return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
317 return TTIImpl->getFlatAddressSpace();
322 return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
326 unsigned ToAS)
const {
327 return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
330std::pair<KnownBits, KnownBits>
332 const Value &PtrOp)
const {
333 return TTIImpl->computeKnownBitsAddrSpaceCast(ToAS, PtrOp);
337 unsigned FromAS,
unsigned ToAS,
const KnownBits &FromPtrBits)
const {
338 return TTIImpl->computeKnownBitsAddrSpaceCast(FromAS, ToAS, FromPtrBits);
342 unsigned SrcAS,
unsigned DstAS)
const {
343 return TTIImpl->getAddrSpaceCastPreservedPtrMask(SrcAS, DstAS);
348 return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
352 return TTIImpl->getAssumedAddrSpace(V);
356 return TTIImpl->isSingleThreaded();
359std::pair<const Value *, unsigned>
361 return TTIImpl->getPredicatedAddrSpace(V);
366 return TTIImpl->rewriteIntrinsicWithAddressSpace(
II, OldV, NewV);
370 return TTIImpl->isLoweredToCall(
F);
376 return TTIImpl->isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
380 return TTIImpl->getEpilogueVectorizationMinVF();
385 return TTIImpl->preferTailFoldingOverEpilogue(TFI);
389 return TTIImpl->getPreferredTailFoldingStyle();
392std::optional<Instruction *>
395 return TTIImpl->instCombineIntrinsic(IC,
II);
400 bool &KnownBitsComputed)
const {
401 return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC,
II, DemandedMask, Known,
409 SimplifyAndSetOp)
const {
410 return TTIImpl->simplifyDemandedVectorEltsIntrinsic(
411 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
418 return TTIImpl->getUnrollingPreferences(L, SE, UP, ORE);
423 return TTIImpl->getPeelingPreferences(L, SE, PP);
427 return TTIImpl->isLegalAddImmediate(Imm);
431 return TTIImpl->isLegalAddScalableImmediate(Imm);
435 return TTIImpl->isLegalICmpImmediate(Imm);
440 bool HasBaseReg, int64_t Scale,
443 int64_t ScalableOffset)
const {
444 return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
445 Scale, AddrSpace,
I, ScalableOffset);
450 return TTIImpl->isLSRCostLess(C1, C2);
454 return TTIImpl->isNumRegsMajorCostOfLSR();
458 return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
462 return TTIImpl->isProfitableLSRChainElement(
I);
466 return TTIImpl->canMacroFuseCmp();
473 return TTIImpl->canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
479 return TTIImpl->getPreferredAddressingMode(L, SE);
485 return TTIImpl->isLegalMaskedStore(DataType, Alignment,
AddressSpace,
492 return TTIImpl->isLegalMaskedLoad(DataType, Alignment,
AddressSpace,
497 Align Alignment)
const {
498 return TTIImpl->isLegalNTStore(DataType, Alignment);
502 return TTIImpl->isLegalNTLoad(DataType, Alignment);
507 return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
511 Align Alignment)
const {
512 return TTIImpl->isLegalMaskedGather(DataType, Alignment);
516 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
518 return TTIImpl->isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask);
522 Align Alignment)
const {
523 return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
527 Align Alignment)
const {
528 return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
532 Align Alignment)
const {
533 return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
537 Align Alignment)
const {
538 return TTIImpl->isLegalMaskedCompressStore(DataType, Alignment);
542 Align Alignment)
const {
543 return TTIImpl->isLegalMaskedExpandLoad(DataType, Alignment);
547 Align Alignment)
const {
548 return TTIImpl->isLegalStridedLoadStore(DataType, Alignment);
553 unsigned AddrSpace)
const {
554 return TTIImpl->isLegalInterleavedAccessType(VTy, Factor, Alignment,
559 Type *DataType)
const {
560 return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
564 return TTIImpl->enableOrderedReductions();
568 return TTIImpl->hasDivRemOp(DataType, IsSigned);
572 unsigned AddrSpace)
const {
573 return TTIImpl->hasVolatileVariant(
I, AddrSpace);
577 return TTIImpl->prefersVectorizedAddressing();
582 int64_t Scale,
unsigned AddrSpace)
const {
584 Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
585 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
590 return TTIImpl->LSRWithInstrQueries();
594 return TTIImpl->isTruncateFree(Ty1, Ty2);
598 return TTIImpl->isProfitableToHoist(
I);
604 return TTIImpl->isTypeLegal(Ty);
608 return TTIImpl->getRegUsageForType(Ty);
612 return TTIImpl->shouldBuildLookupTables();
617 return TTIImpl->shouldBuildLookupTablesForConstant(
C);
621 return TTIImpl->shouldBuildRelLookupTables();
625 return TTIImpl->useColdCCForColdCall(
F);
629 return TTIImpl->useFastCCForInternalCall(
F);
634 return TTIImpl->isTargetIntrinsicWithScalarOpAtArg(
ID, ScalarOpdIdx);
639 return TTIImpl->isTargetIntrinsicWithOverloadTypeAtArg(
ID, OpdIdx);
644 return TTIImpl->isTargetIntrinsicWithStructReturnOverloadAtField(
ID, RetIdx);
655 I->getOperand(1)->hasOneUse())
670 return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
677 return TTIImpl->getOperandsScalarizationOverhead(Tys,
CostKind, VIC);
681 return TTIImpl->supportsEfficientVectorElementLoadStore();
685 return TTIImpl->supportsTailCalls();
689 return TTIImpl->supportsTailCallFor(CB);
693 bool LoopHasReductions)
const {
694 return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
699 return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
703 return TTIImpl->enableSelectOptimize();
708 return TTIImpl->shouldTreatInstructionLikeSelect(
I);
712 return TTIImpl->enableInterleavedAccessVectorization();
716 return TTIImpl->enableMaskedInterleavedAccessVectorization();
720 return TTIImpl->isFPVectorizationPotentiallyUnsafe();
728 unsigned *
Fast)
const {
729 return TTIImpl->allowsMisalignedMemoryAccesses(Context,
BitWidth,
735 return TTIImpl->getPopcntSupport(IntTyWidthInBit);
739 return TTIImpl->haveFastSqrt(Ty);
744 return TTIImpl->isExpensiveToSpeculativelyExecute(
I);
748 return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
753 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
762 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
770 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
775 unsigned Opcode,
unsigned Idx,
const APInt &Imm,
Type *Ty,
778 TTIImpl->getIntImmCostInst(Opcode, Idx, Imm, Ty,
CostKind, Inst);
779 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
788 TTIImpl->getIntImmCostIntrin(IID, Idx, Imm, Ty,
CostKind);
789 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
795 return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
799 return TTIImpl->getNumberOfRegisters(ClassID);
803 bool IsStore)
const {
804 return TTIImpl->hasConditionalLoadStoreForType(Ty, IsStore);
809 return TTIImpl->getRegisterClassForType(
Vector, Ty);
813 return TTIImpl->getRegisterClassName(ClassID);
818 return TTIImpl->getRegisterClassSpillCost(ClassID,
CostKind);
823 return TTIImpl->getRegisterClassReloadCost(ClassID,
CostKind);
828 return TTIImpl->getRegisterBitWidth(K);
832 return TTIImpl->getMinVectorRegisterBitWidth();
836 return TTIImpl->getMaxVScale();
840 return TTIImpl->getVScaleForTuning();
845 return TTIImpl->shouldMaximizeVectorBandwidth(K);
849 bool IsScalable)
const {
850 return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
854 unsigned Opcode)
const {
855 return TTIImpl->getMaximumVF(ElemWidth, Opcode);
861 unsigned AddrSpace)
const {
862 return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy, Alignment,
867 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
868 return TTIImpl->shouldConsiderAddressTypePromotion(
869 I, AllowPromotionWithoutCommonHeader);
874 : TTIImpl->getCacheLineSize();
877std::optional<unsigned>
879 return TTIImpl->getCacheSize(Level);
882std::optional<unsigned>
884 return TTIImpl->getCacheAssociativity(Level);
889 : TTIImpl->getMinPageSize();
893 return TTIImpl->getPrefetchDistance();
897 unsigned NumMemAccesses,
unsigned NumStridedMemAccesses,
898 unsigned NumPrefetches,
bool HasCall)
const {
899 return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
900 NumPrefetches, HasCall);
904 return TTIImpl->getMaxPrefetchIterationsAhead();
908 return TTIImpl->enableWritePrefetching();
912 return TTIImpl->shouldPrefetchAddressSpace(AS);
916 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
920 return TTIImpl->getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
921 AccumType, VF, OpAExtend, OpBExtend,
926 return TTIImpl->getMaxInterleaveFactor(VF);
940 if (CI->getValue().isPowerOf2())
942 else if (CI->getValue().isNegatedPowerOf2())
952 if (ShuffleInst->isZeroEltSplat())
967 if (CI->getValue().isPowerOf2())
969 else if (CI->getValue().isNegatedPowerOf2())
975 bool AllPow2 =
true, AllNegPow2 =
true;
976 for (
uint64_t I = 0, E = CDS->getNumElements();
I != E; ++
I) {
978 AllPow2 &= CI->getValue().isPowerOf2();
979 AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
980 if (AllPow2 || AllNegPow2)
983 AllPow2 = AllNegPow2 =
false;
992 return {OpInfo, OpProps};
1012 if (TLibInfo && Opcode == Instruction::FRem) {
1016 TLibInfo->
getLibFunc(Instruction::FRem, Ty->getScalarType(), Func) &&
1023 Opcode, Ty,
CostKind, Op1Info, Op2Info, Args, CxtI);
1024 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1029 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
1032 TTIImpl->getAltInstrCost(VecTy, Opcode0, Opcode1, OpcodeMask,
CostKind);
1033 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1043 "Expected the Mask to match the return size if given");
1045 "Expected the same scalar types");
1047 Kind, DstTy, SrcTy, Mask,
CostKind, Index, SubTp, Args, CxtI);
1048 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1064 return Instruction::CastOps::ZExt;
1066 return Instruction::CastOps::SExt;
1068 return Instruction::CastOps::FPExt;
1079 case Instruction::CastOps::ZExt:
1081 case Instruction::CastOps::SExt:
1083 case Instruction::CastOps::FPExt:
1096 auto getLoadStoreKind = [](
const Value *V,
unsigned LdStOp,
unsigned MaskedOp,
1097 unsigned GatScatOp) {
1102 if (
I->getOpcode() == LdStOp)
1106 if (
II->getIntrinsicID() == MaskedOp)
1108 if (
II->getIntrinsicID() == GatScatOp)
1115 switch (
I->getOpcode()) {
1116 case Instruction::ZExt:
1117 case Instruction::SExt:
1118 case Instruction::FPExt:
1119 return getLoadStoreKind(
I->getOperand(0), Instruction::Load,
1120 Intrinsic::masked_load, Intrinsic::masked_gather);
1121 case Instruction::Trunc:
1122 case Instruction::FPTrunc:
1124 return getLoadStoreKind(*
I->user_begin(), Instruction::Store,
1125 Intrinsic::masked_store,
1126 Intrinsic::masked_scatter);
1138 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1139 "Opcode should reflect passed instruction.");
1141 TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH,
CostKind,
I);
1142 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1150 TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index,
CostKind);
1151 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1157 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1158 "Opcode should reflect passed instruction.");
1160 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1168 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1169 "Opcode should reflect passed instruction.");
1171 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
1172 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1179 assert((Opcode == Instruction::InsertElement ||
1180 Opcode == Instruction::ExtractElement) &&
1181 "Expecting Opcode to be insertelement/extractelement.");
1183 TTIImpl->getVectorInstrCost(Opcode, Val,
CostKind, Index, Op0, Op1, VIC);
1184 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1190 Value *Scalar,
ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx,
1192 assert((Opcode == Instruction::InsertElement ||
1193 Opcode == Instruction::ExtractElement) &&
1194 "Expecting Opcode to be insertelement/extractelement.");
1196 Opcode, Val,
CostKind, Index, Scalar, ScalarUserAndIdx, VIC);
1197 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1208 TTIImpl->getVectorInstrCost(
I, Val,
CostKind, Index, VIC);
1209 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1215 unsigned Index)
const {
1217 TTIImpl->getIndexedVectorInstrCostFromEnd(Opcode, Val,
CostKind, Index);
1218 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1224 assert((Opcode == Instruction::InsertValue ||
1225 Opcode == Instruction::ExtractValue) &&
1226 "Expecting Opcode to be insertvalue/extractvalue.");
1228 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1233 Type *EltTy,
int ReplicationFactor,
int VF,
const APInt &DemandedDstElts,
1236 EltTy, ReplicationFactor, VF, DemandedDstElts,
CostKind);
1237 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1245 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1246 "Opcode should reflect passed instruction.");
1249 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1256 bool UseMaskForCond,
bool UseMaskForGaps)
const {
1259 UseMaskForCond, UseMaskForGaps);
1260 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1268 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1276 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1285 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1290 return TTIImpl->getNumberOfParts(Tp);
1297 TTIImpl->getAddressComputationCost(PtrTy, SE, Ptr,
CostKind);
1298 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1304 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1309 return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
1313 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1316 TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF,
CostKind);
1317 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1325 TTIImpl->getMinMaxReductionCost(IID, Ty, FMF,
CostKind);
1326 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1333 return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1338 bool IsUnsigned,
unsigned RedOpcode,
Type *ResTy,
VectorType *Ty,
1340 return TTIImpl->getMulAccReductionCost(IsUnsigned, RedOpcode, ResTy, Ty,
1346 return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
1351 return TTIImpl->getTgtMemIntrinsic(Inst, Info);
1355 return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
1360 return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType,
1366 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1367 std::optional<uint32_t> AtomicElementSize)
const {
1368 return TTIImpl->getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
1369 DestAddrSpace, SrcAlign, DestAlign,
1375 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1377 std::optional<uint32_t> AtomicCpySize)
const {
1378 TTIImpl->getMemcpyLoopResidualLoweringType(
1379 OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
1380 DestAlign, AtomicCpySize);
1385 return TTIImpl->areInlineCompatible(Caller, Callee);
1391 unsigned DefaultCallPenalty)
const {
1392 return TTIImpl->getInlineCallPenalty(
F,
Call, DefaultCallPenalty);
1397 return TTIImpl->shouldCopyAttributeWhenOutliningFrom(Caller, Attr);
1402 return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
1407 return TTIImpl->isIndexedLoadLegal(Mode, Ty);
1412 return TTIImpl->isIndexedStoreLegal(Mode, Ty);
1416 return TTIImpl->getLoadStoreVecRegBitWidth(AS);
1420 return TTIImpl->isLegalToVectorizeLoad(LI);
1424 return TTIImpl->isLegalToVectorizeStore(
SI);
1428 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1429 return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
1434 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1435 return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
1441 return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1445 return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1450 unsigned ChainSizeInBytes,
1452 return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
1457 unsigned ChainSizeInBytes,
1459 return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
1463 bool IsEpilogue)
const {
1464 return TTIImpl->preferFixedOverScalableIfEqualCost(IsEpilogue);
1469 return TTIImpl->preferInLoopReduction(Kind, Ty);
1473 return TTIImpl->preferAlternateOpcodeVectorization();
1477 return TTIImpl->preferPredicatedReductionSelect();
1482 return TTIImpl->preferEpilogueVectorization(Iters);
1486 return TTIImpl->shouldConsiderVectorizationRegPressure();
1491 return TTIImpl->getVPLegalizationStrategy(VPI);
1495 return TTIImpl->hasArmWideBranch(Thumb);
1499 return TTIImpl->getFeatureMask(
F);
1503 return TTIImpl->getPriorityMask(
F);
1507 return TTIImpl->isMultiversionedFunction(
F);
1511 return TTIImpl->getMaxNumArgs();
1515 return TTIImpl->shouldExpandReduction(
II);
1521 return TTIImpl->getPreferredExpandedReductionShuffle(
II);
1525 return TTIImpl->getGISelRematGlobalCost();
1529 return TTIImpl->getMinTripCountTailFoldingThreshold();
1533 return TTIImpl->supportsScalableVectors();
1537 return TTIImpl->enableScalableVectorization();
1541 return TTIImpl->hasActiveVectorLength();
1546 return TTIImpl->isProfitableToSinkOperands(
I, OpsToSink);
1550 return TTIImpl->isVectorShiftByScalarCheap(Ty);
1556 return TTIImpl->getNumBytesToPadGlobalArray(
Size,
ArrayType);
1562 return TTIImpl->collectKernelLaunchBounds(
F, LB);
1566 return TTIImpl->allowVectorElementIndexingUsingGEP();
1571 return TTIImpl->isUniform(
I, UniformArgs);
1580 : TTICallback(
std::
move(TTICallback)) {}
1584 assert(!
F.isIntrinsic() &&
"Should not request TTI for intrinsics");
1585 return TTICallback(
F);
1591 return Result(
F.getDataLayout());
1596 "Target Transform Information",
false,
true)
1610 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 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...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
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.
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.
Class to represent function types.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
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.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
StringRef getName(LibFunc F) const
bool isFunctionVectorizable(StringRef F, const ElementCount &VF) const
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
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.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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.
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.