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), LibInfo(LibInfo) {
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());
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))
187 if (!BI->isConditional())
207 : TTIImpl(
std::make_unique<NoTTIImpl>(
DL)) {}
212 : TTIImpl(
std::
move(Arg.TTIImpl)) {}
215 TTIImpl = std::move(RHS.TTIImpl);
220 return TTIImpl->getInliningThresholdMultiplier();
225 return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
231 return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
235 return TTIImpl->getInliningLastCallToStaticBonus();
240 return TTIImpl->adjustInliningThreshold(CB);
245 return TTIImpl->getCallerAllocaCost(CB, AI);
249 return TTIImpl->getInlinerVectorBonusPercent();
255 return TTIImpl->getGEPCost(PointeeType, Ptr, Operands, AccessType,
CostKind);
263 "If pointers have same base address it has to be provided.");
264 return TTIImpl->getPointersChainCost(Ptrs,
Base, Info, AccessTy,
CostKind);
270 return TTIImpl->getEstimatedNumberOfCaseClusters(
SI, JTSize, PSI, BFI);
279 "TTI should not produce negative costs!");
286 : TTIImpl->getPredictableBranchThreshold();
290 return TTIImpl->getBranchMispredictPenalty();
294 return TTIImpl->hasBranchDivergence(
F);
299 if (
Call->hasFnAttr(Attribute::NoDivergenceSource))
302 return TTIImpl->isSourceOfDivergence(V);
306 return TTIImpl->isAlwaysUniform(V);
310 unsigned ToAS)
const {
311 return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
315 unsigned ToAS)
const {
316 return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
320 return TTIImpl->getFlatAddressSpace();
325 return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
329 unsigned ToAS)
const {
330 return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
335 return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
339 return TTIImpl->getAssumedAddrSpace(V);
343 return TTIImpl->isSingleThreaded();
346std::pair<const Value *, unsigned>
348 return TTIImpl->getPredicatedAddrSpace(V);
353 return TTIImpl->rewriteIntrinsicWithAddressSpace(
II, OldV, NewV);
357 return TTIImpl->isLoweredToCall(
F);
363 return TTIImpl->isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
367 return TTIImpl->getEpilogueVectorizationMinVF();
372 return TTIImpl->preferPredicateOverEpilogue(TFI);
376 bool IVUpdateMayOverflow)
const {
377 return TTIImpl->getPreferredTailFoldingStyle(IVUpdateMayOverflow);
380std::optional<Instruction *>
383 return TTIImpl->instCombineIntrinsic(IC,
II);
388 bool &KnownBitsComputed)
const {
389 return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC,
II, DemandedMask, Known,
397 SimplifyAndSetOp)
const {
398 return TTIImpl->simplifyDemandedVectorEltsIntrinsic(
399 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
406 return TTIImpl->getUnrollingPreferences(L, SE, UP, ORE);
411 return TTIImpl->getPeelingPreferences(L, SE, PP);
415 return TTIImpl->isLegalAddImmediate(Imm);
419 return TTIImpl->isLegalAddScalableImmediate(Imm);
423 return TTIImpl->isLegalICmpImmediate(Imm);
428 bool HasBaseReg, int64_t Scale,
431 int64_t ScalableOffset)
const {
432 return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
433 Scale, AddrSpace,
I, ScalableOffset);
438 return TTIImpl->isLSRCostLess(C1, C2);
442 return TTIImpl->isNumRegsMajorCostOfLSR();
446 return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
450 return TTIImpl->isProfitableLSRChainElement(
I);
454 return TTIImpl->canMacroFuseCmp();
461 return TTIImpl->canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
467 return TTIImpl->getPreferredAddressingMode(L, SE);
472 return TTIImpl->isLegalMaskedStore(DataType, Alignment,
AddressSpace);
477 return TTIImpl->isLegalMaskedLoad(DataType, Alignment,
AddressSpace);
481 Align Alignment)
const {
482 return TTIImpl->isLegalNTStore(DataType, Alignment);
486 return TTIImpl->isLegalNTLoad(DataType, Alignment);
491 return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
495 Align Alignment)
const {
496 return TTIImpl->isLegalMaskedGather(DataType, Alignment);
500 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
502 return TTIImpl->isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask);
506 Align Alignment)
const {
507 return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
511 Align Alignment)
const {
512 return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
516 Align Alignment)
const {
517 return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
521 Align Alignment)
const {
522 return TTIImpl->isLegalMaskedCompressStore(DataType, Alignment);
526 Align Alignment)
const {
527 return TTIImpl->isLegalMaskedExpandLoad(DataType, Alignment);
531 Align Alignment)
const {
532 return TTIImpl->isLegalStridedLoadStore(DataType, Alignment);
537 unsigned AddrSpace)
const {
538 return TTIImpl->isLegalInterleavedAccessType(VTy, Factor, Alignment,
543 Type *DataType)
const {
544 return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
548 return TTIImpl->enableOrderedReductions();
552 return TTIImpl->hasDivRemOp(DataType, IsSigned);
556 unsigned AddrSpace)
const {
557 return TTIImpl->hasVolatileVariant(
I, AddrSpace);
561 return TTIImpl->prefersVectorizedAddressing();
566 int64_t Scale,
unsigned AddrSpace)
const {
568 Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
569 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
574 return TTIImpl->LSRWithInstrQueries();
578 return TTIImpl->isTruncateFree(Ty1, Ty2);
582 return TTIImpl->isProfitableToHoist(
I);
588 return TTIImpl->isTypeLegal(Ty);
592 return TTIImpl->getRegUsageForType(Ty);
596 return TTIImpl->shouldBuildLookupTables();
601 return TTIImpl->shouldBuildLookupTablesForConstant(
C);
605 return TTIImpl->shouldBuildRelLookupTables();
609 return TTIImpl->useColdCCForColdCall(
F);
613 return TTIImpl->useFastCCForInternalCall(
F);
618 return TTIImpl->isTargetIntrinsicTriviallyScalarizable(
ID);
623 return TTIImpl->isTargetIntrinsicWithScalarOpAtArg(
ID, ScalarOpdIdx);
628 return TTIImpl->isTargetIntrinsicWithOverloadTypeAtArg(
ID, OpdIdx);
633 return TTIImpl->isTargetIntrinsicWithStructReturnOverloadAtField(
ID, RetIdx);
640 return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
646 return TTIImpl->getOperandsScalarizationOverhead(Tys,
CostKind);
650 return TTIImpl->supportsEfficientVectorElementLoadStore();
654 return TTIImpl->supportsTailCalls();
658 return TTIImpl->supportsTailCallFor(CB);
662 bool LoopHasReductions)
const {
663 return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
668 return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
672 return TTIImpl->enableSelectOptimize();
677 return TTIImpl->shouldTreatInstructionLikeSelect(
I);
681 return TTIImpl->enableInterleavedAccessVectorization();
685 return TTIImpl->enableMaskedInterleavedAccessVectorization();
689 return TTIImpl->isFPVectorizationPotentiallyUnsafe();
697 unsigned *
Fast)
const {
698 return TTIImpl->allowsMisalignedMemoryAccesses(Context,
BitWidth,
704 return TTIImpl->getPopcntSupport(IntTyWidthInBit);
708 return TTIImpl->haveFastSqrt(Ty);
713 return TTIImpl->isExpensiveToSpeculativelyExecute(
I);
717 return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
722 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
731 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
739 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
744 unsigned Opcode,
unsigned Idx,
const APInt &Imm,
Type *Ty,
747 TTIImpl->getIntImmCostInst(Opcode, Idx, Imm, Ty,
CostKind, Inst);
748 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
757 TTIImpl->getIntImmCostIntrin(IID, Idx, Imm, Ty,
CostKind);
758 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
764 return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
768 return TTIImpl->getNumberOfRegisters(ClassID);
772 bool IsStore)
const {
773 return TTIImpl->hasConditionalLoadStoreForType(Ty, IsStore);
778 return TTIImpl->getRegisterClassForType(
Vector, Ty);
782 return TTIImpl->getRegisterClassName(ClassID);
787 return TTIImpl->getRegisterBitWidth(K);
791 return TTIImpl->getMinVectorRegisterBitWidth();
795 return TTIImpl->getMaxVScale();
799 return TTIImpl->getVScaleForTuning();
803 return TTIImpl->isVScaleKnownToBeAPowerOfTwo();
808 return TTIImpl->shouldMaximizeVectorBandwidth(K);
812 bool IsScalable)
const {
813 return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
817 unsigned Opcode)
const {
818 return TTIImpl->getMaximumVF(ElemWidth, Opcode);
822 Type *ScalarValTy)
const {
823 return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy);
827 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const {
828 return TTIImpl->shouldConsiderAddressTypePromotion(
829 I, AllowPromotionWithoutCommonHeader);
834 : TTIImpl->getCacheLineSize();
837std::optional<unsigned>
839 return TTIImpl->getCacheSize(Level);
842std::optional<unsigned>
844 return TTIImpl->getCacheAssociativity(Level);
849 : TTIImpl->getMinPageSize();
853 return TTIImpl->getPrefetchDistance();
857 unsigned NumMemAccesses,
unsigned NumStridedMemAccesses,
858 unsigned NumPrefetches,
bool HasCall)
const {
859 return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
860 NumPrefetches, HasCall);
864 return TTIImpl->getMaxPrefetchIterationsAhead();
868 return TTIImpl->enableWritePrefetching();
872 return TTIImpl->shouldPrefetchAddressSpace(AS);
876 unsigned Opcode,
Type *InputTypeA,
Type *InputTypeB,
Type *AccumType,
880 return TTIImpl->getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
881 AccumType, VF, OpAExtend, OpBExtend,
886 return TTIImpl->getMaxInterleaveFactor(VF);
900 if (CI->getValue().isPowerOf2())
902 else if (CI->getValue().isNegatedPowerOf2())
912 if (ShuffleInst->isZeroEltSplat())
927 if (CI->getValue().isPowerOf2())
929 else if (CI->getValue().isNegatedPowerOf2())
935 bool AllPow2 =
true, AllNegPow2 =
true;
936 for (
uint64_t I = 0, E = CDS->getNumElements();
I != E; ++
I) {
938 AllPow2 &= CI->getValue().isPowerOf2();
939 AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
940 if (AllPow2 || AllNegPow2)
943 AllPow2 = AllNegPow2 =
false;
952 return {OpInfo, OpProps};
964 if (TLibInfo && Opcode == Instruction::FRem) {
968 TLibInfo->
getLibFunc(Instruction::FRem, Ty->getScalarType(), Func) &&
975 TTIImpl->getArithmeticInstrCost(Opcode, Ty,
CostKind,
978 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
983 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
986 TTIImpl->getAltInstrCost(VecTy, Opcode0, Opcode1, OpcodeMask,
CostKind);
987 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
997 "Expected the Mask to match the return size if given");
999 "Expected the same scalar types");
1001 Kind, DstTy, SrcTy, Mask,
CostKind, Index, SubTp, Args, CxtI);
1002 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1017 case Instruction::CastOps::ZExt:
1019 case Instruction::CastOps::SExt:
1032 auto getLoadStoreKind = [](
const Value *V,
unsigned LdStOp,
unsigned MaskedOp,
1033 unsigned GatScatOp) {
1038 if (
I->getOpcode() == LdStOp)
1042 if (
II->getIntrinsicID() == MaskedOp)
1044 if (
II->getIntrinsicID() == GatScatOp)
1051 switch (
I->getOpcode()) {
1052 case Instruction::ZExt:
1053 case Instruction::SExt:
1054 case Instruction::FPExt:
1055 return getLoadStoreKind(
I->getOperand(0), Instruction::Load,
1056 Intrinsic::masked_load, Intrinsic::masked_gather);
1057 case Instruction::Trunc:
1058 case Instruction::FPTrunc:
1060 return getLoadStoreKind(*
I->user_begin(), Instruction::Store,
1061 Intrinsic::masked_store,
1062 Intrinsic::masked_scatter);
1074 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1075 "Opcode should reflect passed instruction.");
1077 TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH,
CostKind,
I);
1078 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1086 TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index,
CostKind);
1087 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1093 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1094 "Opcode should reflect passed instruction.");
1096 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1104 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1105 "Opcode should reflect passed instruction.");
1107 Opcode, ValTy, CondTy, VecPred,
CostKind, Op1Info, Op2Info,
I);
1108 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1115 assert((Opcode == Instruction::InsertElement ||
1116 Opcode == Instruction::ExtractElement) &&
1117 "Expecting Opcode to be insertelement/extractelement.");
1119 TTIImpl->getVectorInstrCost(Opcode, Val,
CostKind, Index, Op0, Op1);
1120 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1127 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx)
const {
1128 assert((Opcode == Instruction::InsertElement ||
1129 Opcode == Instruction::ExtractElement) &&
1130 "Expecting Opcode to be insertelement/extractelement.");
1132 Opcode, Val,
CostKind, Index, Scalar, ScalarUserAndIdx);
1133 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1140 unsigned Index)
const {
1145 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1151 unsigned Index)
const {
1153 TTIImpl->getIndexedVectorInstrCostFromEnd(Opcode, Val,
CostKind, Index);
1154 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1160 assert((Opcode == Instruction::InsertValue ||
1161 Opcode == Instruction::ExtractValue) &&
1162 "Expecting Opcode to be insertvalue/extractvalue.");
1164 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1169 Type *EltTy,
int ReplicationFactor,
int VF,
const APInt &DemandedDstElts,
1172 EltTy, ReplicationFactor, VF, DemandedDstElts,
CostKind);
1173 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1181 assert((
I ==
nullptr ||
I->getOpcode() == Opcode) &&
1182 "Opcode should reflect passed instruction.");
1185 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1193 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1198 unsigned Opcode,
Type *DataTy,
const Value *Ptr,
bool VariableMask,
1201 Opcode, DataTy, Ptr, VariableMask, Alignment,
CostKind,
I);
1203 "TTI should not produce negative costs!");
1208 unsigned Opcode,
Type *DataTy,
bool VariableMask,
Align Alignment,
1211 Opcode, DataTy, VariableMask, Alignment,
CostKind,
I);
1212 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1217 unsigned Opcode,
Type *DataTy,
const Value *Ptr,
bool VariableMask,
1220 Opcode, DataTy, Ptr, VariableMask, Alignment,
CostKind,
I);
1221 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1228 bool UseMaskForCond,
bool UseMaskForGaps)
const {
1231 UseMaskForCond, UseMaskForGaps);
1232 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1240 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1249 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1254 return TTIImpl->getNumberOfParts(Tp);
1261 TTIImpl->getAddressComputationCost(PtrTy, SE, Ptr,
CostKind);
1262 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1268 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1273 return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
1277 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1280 TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF,
CostKind);
1281 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1289 TTIImpl->getMinMaxReductionCost(IID, Ty, FMF,
CostKind);
1290 assert(
Cost >= 0 &&
"TTI should not produce negative costs!");
1297 return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1302 bool IsUnsigned,
unsigned RedOpcode,
Type *ResTy,
VectorType *Ty,
1304 return TTIImpl->getMulAccReductionCost(IsUnsigned, RedOpcode, ResTy, Ty,
1310 return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
1315 return TTIImpl->getTgtMemIntrinsic(Inst, Info);
1319 return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
1324 return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType,
1330 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1331 std::optional<uint32_t> AtomicElementSize)
const {
1332 return TTIImpl->getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
1333 DestAddrSpace, SrcAlign, DestAlign,
1339 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1341 std::optional<uint32_t> AtomicCpySize)
const {
1342 TTIImpl->getMemcpyLoopResidualLoweringType(
1343 OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
1344 DestAlign, AtomicCpySize);
1349 return TTIImpl->areInlineCompatible(Caller, Callee);
1355 unsigned DefaultCallPenalty)
const {
1356 return TTIImpl->getInlineCallPenalty(
F,
Call, DefaultCallPenalty);
1362 return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
1367 return TTIImpl->isIndexedLoadLegal(Mode, Ty);
1372 return TTIImpl->isIndexedStoreLegal(Mode, Ty);
1376 return TTIImpl->getLoadStoreVecRegBitWidth(AS);
1380 return TTIImpl->isLegalToVectorizeLoad(LI);
1384 return TTIImpl->isLegalToVectorizeStore(
SI);
1388 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1389 return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
1394 unsigned ChainSizeInBytes,
Align Alignment,
unsigned AddrSpace)
const {
1395 return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
1401 return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1405 return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1410 unsigned ChainSizeInBytes,
1412 return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
1417 unsigned ChainSizeInBytes,
1419 return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
1423 bool IsEpilogue)
const {
1424 return TTIImpl->preferFixedOverScalableIfEqualCost(IsEpilogue);
1429 return TTIImpl->preferInLoopReduction(Kind, Ty);
1433 return TTIImpl->preferAlternateOpcodeVectorization();
1437 return TTIImpl->preferPredicatedReductionSelect();
1441 return TTIImpl->preferEpilogueVectorization();
1445 return TTIImpl->shouldConsiderVectorizationRegPressure();
1450 return TTIImpl->getVPLegalizationStrategy(VPI);
1454 return TTIImpl->hasArmWideBranch(Thumb);
1458 return TTIImpl->getFeatureMask(
F);
1462 return TTIImpl->isMultiversionedFunction(
F);
1466 return TTIImpl->getMaxNumArgs();
1470 return TTIImpl->shouldExpandReduction(
II);
1476 return TTIImpl->getPreferredExpandedReductionShuffle(
II);
1480 return TTIImpl->getGISelRematGlobalCost();
1484 return TTIImpl->getMinTripCountTailFoldingThreshold();
1488 return TTIImpl->supportsScalableVectors();
1492 return TTIImpl->enableScalableVectorization();
1496 return TTIImpl->hasActiveVectorLength();
1501 return TTIImpl->isProfitableToSinkOperands(
I, OpsToSink);
1505 return TTIImpl->isVectorShiftByScalarCheap(Ty);
1511 return TTIImpl->getNumBytesToPadGlobalArray(
Size,
ArrayType);
1517 return TTIImpl->collectKernelLaunchBounds(
F, LB);
1521 return TTIImpl->allowVectorElementIndexingUsingGEP();
1530 : TTICallback(
std::
move(TTICallback)) {}
1534 assert(!
F.isIntrinsic() &&
"Should not request TTI for intrinsics");
1535 return TTICallback(
F);
1541 return Result(
F.getDataLayout());
1546 "Target Transform Information",
false,
true)
1560 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 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.
ArrayRef - 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.
LLVM Basic Block Representation.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
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.
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, TargetLibraryInfo const *LibInfo=nullptr)
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.
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.