21#ifndef LLVM_ANALYSIS_TARGETTRANSFORMINFO_H
22#define LLVM_ANALYSIS_TARGETTRANSFORMINFO_H
45class BlockFrequencyInfo;
51class OptimizationRemarkEmitter;
52class InterleavedAccessInfo;
57class LoopVectorizationLegality;
58class ProfileSummaryInfo;
59class RecurrenceDescriptor;
65class TargetLibraryInfo;
121 Type *RetTy =
nullptr;
134 bool TypeBasedOnly =
false);
207class TargetTransformInfo;
338 static_assert(
sizeof(PointersChainInfo) == 4,
"Was size increase justified?");
346 const PointersChainInfo &
Info,
Type *AccessTy,
497 std::pair<const Value *, unsigned>
698 KnownBits & Known,
bool &KnownBitsComputed)
const;
705 SimplifyAndSetOp)
const;
749 bool HasBaseReg, int64_t Scale,
751 int64_t ScalableOffset = 0)
const;
827 Align Alignment,
unsigned AddrSpace)
const;
871 unsigned AddrSpace = 0)
const;
915 unsigned ScalarOpdIdx)
const;
933 const APInt &DemandedElts,
934 bool Insert,
bool Extract,
943 ArrayRef<Type *> Tys,
999 bool IsZeroCmp)
const;
1031 unsigned *
Fast =
nullptr)
const;
1216 unsigned getMaximumVF(
unsigned ElemWidth,
unsigned Opcode)
const;
1227 Type *ScalarValTy)
const;
1233 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
const;
1280 unsigned NumStridedMemAccesses,
1281 unsigned NumPrefetches,
bool HasCall)
const;
1306 std::optional<unsigned> BinOp = std::nullopt)
const;
1335 unsigned Opcode,
Type *Ty,
1339 ArrayRef<const Value *>
Args = {},
const Instruction *CxtI =
nullptr,
1340 const TargetLibraryInfo *TLibInfo =
nullptr)
const;
1350 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
1351 const SmallBitVector &OpcodeMask,
1366 ArrayRef<const Value *>
Args = {},
1367 const Instruction *CxtI =
nullptr)
const;
1418 unsigned Index)
const;
1440 const Instruction *
I =
nullptr)
const;
1449 unsigned Index = -1, Value *Op0 =
nullptr,
1450 Value *Op1 =
nullptr)
const;
1464 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx)
const;
1474 unsigned Index = -1)
const;
1483 const APInt &DemandedDstElts,
1492 const Instruction *
I =
nullptr)
const;
1516 unsigned Opcode,
Type *DataTy,
const Value *
Ptr,
bool VariableMask,
1529 unsigned Opcode,
Type *DataTy,
bool VariableMask,
Align Alignment,
1543 unsigned Opcode,
Type *DataTy,
const Value *
Ptr,
bool VariableMask,
1561 bool UseMaskForCond =
false,
bool UseMaskForGaps =
false)
const;
1566 return FMF && !(*FMF).allowReassoc();
1594 unsigned Opcode,
VectorType *Ty, std::optional<FastMathFlags> FMF,
1643 const SCEV *
Ptr =
nullptr)
const;
1667 Type *ExpectedType)
const;
1672 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
1673 std::optional<uint32_t> AtomicElementSize = std::nullopt)
const;
1683 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
1685 std::optional<uint32_t> AtomicCpySize = std::nullopt)
const;
1699 unsigned DefaultCallPenalty)
const;
1735 unsigned AddrSpace)
const;
1739 unsigned AddrSpace)
const;
1751 unsigned ChainSizeInBytes,
1757 unsigned ChainSizeInBytes,
1829 Align Alignment)
const;
1919 template <
typename T>
class Model;
1921 std::unique_ptr<Concept> TTIImpl;
1969 virtual std::pair<const Value *, unsigned>
1973 Value *NewV)
const = 0;
1992 KnownBits & Known,
bool &KnownBitsComputed) = 0;
1997 SimplifyAndSetOp) = 0;
2002 int64_t BaseOffset,
bool HasBaseReg,
2003 int64_t Scale,
unsigned AddrSpace,
2005 int64_t ScalableOffset) = 0;
2026 Align Alignment) = 0;
2028 Align Alignment) = 0;
2034 unsigned AddrSpace) = 0;
2046 bool HasBaseReg, int64_t Scale,
2047 unsigned AddrSpace) = 0;
2060 unsigned ScalarOpdIdx) = 0;
2089 unsigned *
Fast) = 0;
2111 Type *Ty =
nullptr)
const = 0;
2121 bool IsScalable)
const = 0;
2122 virtual unsigned getMaximumVF(
unsigned ElemWidth,
unsigned Opcode)
const = 0;
2124 Type *ScalarValTy)
const = 0;
2126 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader) = 0;
2145 unsigned NumStridedMemAccesses,
2146 unsigned NumPrefetches,
2147 bool HasCall)
const = 0;
2172 std::optional<unsigned> BinOp)
const = 0;
2180 VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
2194 unsigned Index) = 0;
2215 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx) = 0;
2219 unsigned Index) = 0;
2223 const APInt &DemandedDstElts,
2241 bool VariableMask,
Align Alignment,
2245 unsigned Opcode,
Type *DataTy,
bool VariableMask,
Align Alignment,
2249 bool VariableMask,
Align Alignment,
2256 bool UseMaskForCond =
false,
bool UseMaskForGaps =
false) = 0;
2259 std::optional<FastMathFlags> FMF,
2286 Type *ExpectedType) = 0;
2289 unsigned DestAddrSpace,
Align SrcAlign,
Align DestAlign,
2290 std::optional<uint32_t> AtomicElementSize)
const = 0;
2294 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
2296 std::optional<uint32_t> AtomicCpySize)
const = 0;
2300 unsigned DefaultCallPenalty)
const = 0;
2311 unsigned AddrSpace)
const = 0;
2314 unsigned AddrSpace)
const = 0;
2319 unsigned ChainSizeInBytes,
2322 unsigned ChainSizeInBytes,
2339 Align Alignment)
const = 0;
2358template <
typename T>
2363 Model(
T Impl) : Impl(std::move(Impl)) {}
2364 ~Model()
override =
default;
2366 const DataLayout &getDataLayout()
const override {
2367 return Impl.getDataLayout();
2371 getGEPCost(Type *PointeeType,
const Value *
Ptr,
2372 ArrayRef<const Value *>
Operands, Type *AccessType,
2376 InstructionCost getPointersChainCost(ArrayRef<const Value *> Ptrs,
2378 const PointersChainInfo &
Info,
2383 unsigned getInliningThresholdMultiplier()
const override {
2384 return Impl.getInliningThresholdMultiplier();
2386 unsigned adjustInliningThreshold(
const CallBase *CB)
override {
2387 return Impl.adjustInliningThreshold(CB);
2389 unsigned getInliningCostBenefitAnalysisSavingsMultiplier()
const override {
2390 return Impl.getInliningCostBenefitAnalysisSavingsMultiplier();
2392 unsigned getInliningCostBenefitAnalysisProfitableMultiplier()
const override {
2393 return Impl.getInliningCostBenefitAnalysisProfitableMultiplier();
2395 int getInliningLastCallToStaticBonus()
const override {
2396 return Impl.getInliningLastCallToStaticBonus();
2398 int getInlinerVectorBonusPercent()
const override {
2399 return Impl.getInlinerVectorBonusPercent();
2401 unsigned getCallerAllocaCost(
const CallBase *CB,
2402 const AllocaInst *AI)
const override {
2403 return Impl.getCallerAllocaCost(CB, AI);
2405 InstructionCost getMemcpyCost(
const Instruction *
I)
override {
2406 return Impl.getMemcpyCost(
I);
2409 uint64_t getMaxMemIntrinsicInlineSizeThreshold()
const override {
2410 return Impl.getMaxMemIntrinsicInlineSizeThreshold();
2413 InstructionCost getInstructionCost(
const User *U,
2418 BranchProbability getPredictableBranchThreshold()
override {
2419 return Impl.getPredictableBranchThreshold();
2421 InstructionCost getBranchMispredictPenalty()
override {
2422 return Impl.getBranchMispredictPenalty();
2424 bool hasBranchDivergence(
const Function *
F =
nullptr)
override {
2425 return Impl.hasBranchDivergence(
F);
2427 bool isSourceOfDivergence(
const Value *V)
override {
2428 return Impl.isSourceOfDivergence(V);
2431 bool isAlwaysUniform(
const Value *V)
override {
2432 return Impl.isAlwaysUniform(V);
2435 bool isValidAddrSpaceCast(
unsigned FromAS,
unsigned ToAS)
const override {
2436 return Impl.isValidAddrSpaceCast(FromAS, ToAS);
2439 bool addrspacesMayAlias(
unsigned AS0,
unsigned AS1)
const override {
2440 return Impl.addrspacesMayAlias(AS0, AS1);
2443 unsigned getFlatAddressSpace()
override {
return Impl.getFlatAddressSpace(); }
2445 bool collectFlatAddressOperands(SmallVectorImpl<int> &OpIndexes,
2447 return Impl.collectFlatAddressOperands(OpIndexes, IID);
2450 bool isNoopAddrSpaceCast(
unsigned FromAS,
unsigned ToAS)
const override {
2451 return Impl.isNoopAddrSpaceCast(FromAS, ToAS);
2455 canHaveNonUndefGlobalInitializerInAddressSpace(
unsigned AS)
const override {
2456 return Impl.canHaveNonUndefGlobalInitializerInAddressSpace(AS);
2459 unsigned getAssumedAddrSpace(
const Value *V)
const override {
2460 return Impl.getAssumedAddrSpace(V);
2463 bool isSingleThreaded()
const override {
return Impl.isSingleThreaded(); }
2465 std::pair<const Value *, unsigned>
2466 getPredicatedAddrSpace(
const Value *V)
const override {
2467 return Impl.getPredicatedAddrSpace(V);
2470 Value *rewriteIntrinsicWithAddressSpace(IntrinsicInst *
II, Value *OldV,
2471 Value *NewV)
const override {
2472 return Impl.rewriteIntrinsicWithAddressSpace(
II, OldV, NewV);
2475 bool isLoweredToCall(
const Function *
F)
override {
2476 return Impl.isLoweredToCall(
F);
2478 void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
2479 UnrollingPreferences &UP,
2480 OptimizationRemarkEmitter *ORE)
override {
2481 return Impl.getUnrollingPreferences(L, SE, UP, ORE);
2483 void getPeelingPreferences(Loop *L, ScalarEvolution &SE,
2484 PeelingPreferences &PP)
override {
2485 return Impl.getPeelingPreferences(L, SE, PP);
2487 bool isHardwareLoopProfitable(Loop *L, ScalarEvolution &SE,
2488 AssumptionCache &AC, TargetLibraryInfo *LibInfo,
2489 HardwareLoopInfo &HWLoopInfo)
override {
2490 return Impl.isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
2492 unsigned getEpilogueVectorizationMinVF()
override {
2493 return Impl.getEpilogueVectorizationMinVF();
2495 bool preferPredicateOverEpilogue(TailFoldingInfo *TFI)
override {
2496 return Impl.preferPredicateOverEpilogue(TFI);
2499 getPreferredTailFoldingStyle(
bool IVUpdateMayOverflow =
true)
override {
2500 return Impl.getPreferredTailFoldingStyle(IVUpdateMayOverflow);
2502 std::optional<Instruction *>
2503 instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &
II)
override {
2504 return Impl.instCombineIntrinsic(IC,
II);
2506 std::optional<Value *>
2507 simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &
II,
2508 APInt DemandedMask, KnownBits &Known,
2509 bool &KnownBitsComputed)
override {
2510 return Impl.simplifyDemandedUseBitsIntrinsic(IC,
II, DemandedMask, Known,
2513 std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
2514 InstCombiner &IC, IntrinsicInst &
II, APInt DemandedElts, APInt &UndefElts,
2515 APInt &UndefElts2, APInt &UndefElts3,
2516 std::function<
void(Instruction *,
unsigned, APInt, APInt &)>
2517 SimplifyAndSetOp)
override {
2518 return Impl.simplifyDemandedVectorEltsIntrinsic(
2519 IC,
II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
2522 bool isLegalAddImmediate(int64_t Imm)
override {
2523 return Impl.isLegalAddImmediate(Imm);
2525 bool isLegalAddScalableImmediate(int64_t Imm)
override {
2526 return Impl.isLegalAddScalableImmediate(Imm);
2528 bool isLegalICmpImmediate(int64_t Imm)
override {
2529 return Impl.isLegalICmpImmediate(Imm);
2531 bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
2532 bool HasBaseReg, int64_t Scale,
unsigned AddrSpace,
2533 Instruction *
I, int64_t ScalableOffset)
override {
2534 return Impl.isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, Scale,
2535 AddrSpace,
I, ScalableOffset);
2537 bool isLSRCostLess(
const TargetTransformInfo::LSRCost &C1,
2538 const TargetTransformInfo::LSRCost &C2)
override {
2539 return Impl.isLSRCostLess(C1, C2);
2541 bool isNumRegsMajorCostOfLSR()
override {
2542 return Impl.isNumRegsMajorCostOfLSR();
2544 bool shouldDropLSRSolutionIfLessProfitable()
const override {
2545 return Impl.shouldDropLSRSolutionIfLessProfitable();
2547 bool isProfitableLSRChainElement(Instruction *
I)
override {
2548 return Impl.isProfitableLSRChainElement(
I);
2550 bool canMacroFuseCmp()
override {
return Impl.canMacroFuseCmp(); }
2551 bool canSaveCmp(Loop *L, BranchInst **BI, ScalarEvolution *SE, LoopInfo *LI,
2552 DominatorTree *DT, AssumptionCache *AC,
2553 TargetLibraryInfo *LibInfo)
override {
2554 return Impl.canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
2557 getPreferredAddressingMode(
const Loop *L,
2558 ScalarEvolution *SE)
const override {
2559 return Impl.getPreferredAddressingMode(L, SE);
2561 bool isLegalMaskedStore(Type *DataType, Align Alignment)
override {
2562 return Impl.isLegalMaskedStore(DataType, Alignment);
2564 bool isLegalMaskedLoad(Type *DataType, Align Alignment)
override {
2565 return Impl.isLegalMaskedLoad(DataType, Alignment);
2567 bool isLegalNTStore(Type *DataType, Align Alignment)
override {
2568 return Impl.isLegalNTStore(DataType, Alignment);
2570 bool isLegalNTLoad(Type *DataType, Align Alignment)
override {
2571 return Impl.isLegalNTLoad(DataType, Alignment);
2573 bool isLegalBroadcastLoad(Type *ElementTy,
2574 ElementCount NumElements)
const override {
2575 return Impl.isLegalBroadcastLoad(ElementTy, NumElements);
2577 bool isLegalMaskedScatter(Type *DataType, Align Alignment)
override {
2578 return Impl.isLegalMaskedScatter(DataType, Alignment);
2580 bool isLegalMaskedGather(Type *DataType, Align Alignment)
override {
2581 return Impl.isLegalMaskedGather(DataType, Alignment);
2583 bool forceScalarizeMaskedGather(
VectorType *DataType,
2584 Align Alignment)
override {
2585 return Impl.forceScalarizeMaskedGather(DataType, Alignment);
2587 bool forceScalarizeMaskedScatter(
VectorType *DataType,
2588 Align Alignment)
override {
2589 return Impl.forceScalarizeMaskedScatter(DataType, Alignment);
2591 bool isLegalMaskedCompressStore(Type *DataType, Align Alignment)
override {
2592 return Impl.isLegalMaskedCompressStore(DataType, Alignment);
2594 bool isLegalMaskedExpandLoad(Type *DataType, Align Alignment)
override {
2595 return Impl.isLegalMaskedExpandLoad(DataType, Alignment);
2597 bool isLegalStridedLoadStore(Type *DataType, Align Alignment)
override {
2598 return Impl.isLegalStridedLoadStore(DataType, Alignment);
2600 bool isLegalInterleavedAccessType(
VectorType *VTy,
unsigned Factor,
2602 unsigned AddrSpace)
override {
2603 return Impl.isLegalInterleavedAccessType(VTy, Factor, Alignment, AddrSpace);
2605 bool isLegalMaskedVectorHistogram(Type *AddrType, Type *DataType)
override {
2606 return Impl.isLegalMaskedVectorHistogram(AddrType, DataType);
2608 bool isLegalAltInstr(
VectorType *VecTy,
unsigned Opcode0,
unsigned Opcode1,
2609 const SmallBitVector &OpcodeMask)
const override {
2610 return Impl.isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask);
2612 bool enableOrderedReductions()
override {
2613 return Impl.enableOrderedReductions();
2615 bool hasDivRemOp(Type *DataType,
bool IsSigned)
override {
2616 return Impl.hasDivRemOp(DataType, IsSigned);
2618 bool hasVolatileVariant(Instruction *
I,
unsigned AddrSpace)
override {
2619 return Impl.hasVolatileVariant(
I, AddrSpace);
2621 bool prefersVectorizedAddressing()
override {
2622 return Impl.prefersVectorizedAddressing();
2624 InstructionCost getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
2625 StackOffset BaseOffset,
bool HasBaseReg,
2627 unsigned AddrSpace)
override {
2628 return Impl.getScalingFactorCost(Ty, BaseGV, BaseOffset, HasBaseReg, Scale,
2631 bool LSRWithInstrQueries()
override {
return Impl.LSRWithInstrQueries(); }
2632 bool isTruncateFree(Type *Ty1, Type *Ty2)
override {
2633 return Impl.isTruncateFree(Ty1, Ty2);
2635 bool isProfitableToHoist(Instruction *
I)
override {
2636 return Impl.isProfitableToHoist(
I);
2638 bool useAA()
override {
return Impl.useAA(); }
2639 bool isTypeLegal(Type *Ty)
override {
return Impl.isTypeLegal(Ty); }
2640 unsigned getRegUsageForType(Type *Ty)
override {
2641 return Impl.getRegUsageForType(Ty);
2643 bool shouldBuildLookupTables()
override {
2644 return Impl.shouldBuildLookupTables();
2646 bool shouldBuildLookupTablesForConstant(Constant *
C)
override {
2647 return Impl.shouldBuildLookupTablesForConstant(
C);
2649 bool shouldBuildRelLookupTables()
override {
2650 return Impl.shouldBuildRelLookupTables();
2652 bool useColdCCForColdCall(Function &
F)
override {
2653 return Impl.useColdCCForColdCall(
F);
2655 bool isTargetIntrinsicTriviallyScalarizable(
Intrinsic::ID ID)
override {
2656 return Impl.isTargetIntrinsicTriviallyScalarizable(
ID);
2660 unsigned ScalarOpdIdx)
override {
2661 return Impl.isTargetIntrinsicWithScalarOpAtArg(
ID, ScalarOpdIdx);
2665 int OpdIdx)
override {
2666 return Impl.isTargetIntrinsicWithOverloadTypeAtArg(
ID, OpdIdx);
2669 bool isTargetIntrinsicWithStructReturnOverloadAtField(
Intrinsic::ID ID,
2670 int RetIdx)
override {
2671 return Impl.isTargetIntrinsicWithStructReturnOverloadAtField(
ID, RetIdx);
2674 InstructionCost getScalarizationOverhead(
VectorType *Ty,
2675 const APInt &DemandedElts,
2676 bool Insert,
bool Extract,
2678 ArrayRef<Value *> VL = {})
override {
2679 return Impl.getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
2683 getOperandsScalarizationOverhead(ArrayRef<const Value *> Args,
2684 ArrayRef<Type *> Tys,
2686 return Impl.getOperandsScalarizationOverhead(Args, Tys,
CostKind);
2689 bool supportsEfficientVectorElementLoadStore()
override {
2690 return Impl.supportsEfficientVectorElementLoadStore();
2693 bool supportsTailCalls()
override {
return Impl.supportsTailCalls(); }
2694 bool supportsTailCallFor(
const CallBase *CB)
override {
2695 return Impl.supportsTailCallFor(CB);
2698 bool enableAggressiveInterleaving(
bool LoopHasReductions)
override {
2699 return Impl.enableAggressiveInterleaving(LoopHasReductions);
2701 MemCmpExpansionOptions enableMemCmpExpansion(
bool OptSize,
2702 bool IsZeroCmp)
const override {
2703 return Impl.enableMemCmpExpansion(OptSize, IsZeroCmp);
2705 bool enableSelectOptimize()
override {
2706 return Impl.enableSelectOptimize();
2708 bool shouldTreatInstructionLikeSelect(
const Instruction *
I)
override {
2709 return Impl.shouldTreatInstructionLikeSelect(
I);
2711 bool enableInterleavedAccessVectorization()
override {
2712 return Impl.enableInterleavedAccessVectorization();
2714 bool enableMaskedInterleavedAccessVectorization()
override {
2715 return Impl.enableMaskedInterleavedAccessVectorization();
2717 bool isFPVectorizationPotentiallyUnsafe()
override {
2718 return Impl.isFPVectorizationPotentiallyUnsafe();
2720 bool allowsMisalignedMemoryAccesses(LLVMContext &Context,
unsigned BitWidth,
2722 unsigned *
Fast)
override {
2727 return Impl.getPopcntSupport(IntTyWidthInBit);
2729 bool haveFastSqrt(Type *Ty)
override {
return Impl.haveFastSqrt(Ty); }
2731 bool isExpensiveToSpeculativelyExecute(
const Instruction*
I)
override {
2732 return Impl.isExpensiveToSpeculativelyExecute(
I);
2735 bool isFCmpOrdCheaperThanFCmpZero(Type *Ty)
override {
2736 return Impl.isFCmpOrdCheaperThanFCmpZero(Ty);
2739 InstructionCost getFPOpCost(Type *Ty)
override {
2740 return Impl.getFPOpCost(Ty);
2743 InstructionCost getIntImmCodeSizeCost(
unsigned Opc,
unsigned Idx,
2744 const APInt &Imm, Type *Ty)
override {
2745 return Impl.getIntImmCodeSizeCost(Opc,
Idx, Imm, Ty);
2747 InstructionCost getIntImmCost(
const APInt &Imm, Type *Ty,
2749 return Impl.getIntImmCost(Imm, Ty,
CostKind);
2751 InstructionCost getIntImmCostInst(
unsigned Opc,
unsigned Idx,
2752 const APInt &Imm, Type *Ty,
2754 Instruction *Inst =
nullptr)
override {
2755 return Impl.getIntImmCostInst(Opc,
Idx, Imm, Ty,
CostKind, Inst);
2758 const APInt &Imm, Type *Ty,
2760 return Impl.getIntImmCostIntrin(IID,
Idx, Imm, Ty,
CostKind);
2762 bool preferToKeepConstantsAttached(
const Instruction &Inst,
2763 const Function &Fn)
const override {
2764 return Impl.preferToKeepConstantsAttached(Inst, Fn);
2766 unsigned getNumberOfRegisters(
unsigned ClassID)
const override {
2767 return Impl.getNumberOfRegisters(ClassID);
2769 bool hasConditionalLoadStoreForType(Type *Ty =
nullptr)
const override {
2770 return Impl.hasConditionalLoadStoreForType(Ty);
2772 unsigned getRegisterClassForType(
bool Vector,
2773 Type *Ty =
nullptr)
const override {
2774 return Impl.getRegisterClassForType(
Vector, Ty);
2776 const char *getRegisterClassName(
unsigned ClassID)
const override {
2777 return Impl.getRegisterClassName(ClassID);
2779 TypeSize getRegisterBitWidth(
RegisterKind K)
const override {
2780 return Impl.getRegisterBitWidth(K);
2782 unsigned getMinVectorRegisterBitWidth()
const override {
2783 return Impl.getMinVectorRegisterBitWidth();
2785 std::optional<unsigned>
getMaxVScale()
const override {
2786 return Impl.getMaxVScale();
2788 std::optional<unsigned> getVScaleForTuning()
const override {
2789 return Impl.getVScaleForTuning();
2791 bool isVScaleKnownToBeAPowerOfTwo()
const override {
2792 return Impl.isVScaleKnownToBeAPowerOfTwo();
2794 bool shouldMaximizeVectorBandwidth(
2796 return Impl.shouldMaximizeVectorBandwidth(K);
2798 ElementCount getMinimumVF(
unsigned ElemWidth,
2799 bool IsScalable)
const override {
2800 return Impl.getMinimumVF(ElemWidth, IsScalable);
2802 unsigned getMaximumVF(
unsigned ElemWidth,
unsigned Opcode)
const override {
2803 return Impl.getMaximumVF(ElemWidth, Opcode);
2805 unsigned getStoreMinimumVF(
unsigned VF, Type *ScalarMemTy,
2806 Type *ScalarValTy)
const override {
2807 return Impl.getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy);
2809 bool shouldConsiderAddressTypePromotion(
2810 const Instruction &
I,
bool &AllowPromotionWithoutCommonHeader)
override {
2811 return Impl.shouldConsiderAddressTypePromotion(
2812 I, AllowPromotionWithoutCommonHeader);
2814 unsigned getCacheLineSize()
const override {
return Impl.getCacheLineSize(); }
2815 std::optional<unsigned> getCacheSize(
CacheLevel Level)
const override {
2816 return Impl.getCacheSize(Level);
2818 std::optional<unsigned>
2819 getCacheAssociativity(
CacheLevel Level)
const override {
2820 return Impl.getCacheAssociativity(Level);
2823 std::optional<unsigned> getMinPageSize()
const override {
2824 return Impl.getMinPageSize();
2829 unsigned getPrefetchDistance()
const override {
2830 return Impl.getPrefetchDistance();
2836 unsigned getMinPrefetchStride(
unsigned NumMemAccesses,
2837 unsigned NumStridedMemAccesses,
2838 unsigned NumPrefetches,
2839 bool HasCall)
const override {
2840 return Impl.getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
2841 NumPrefetches, HasCall);
2847 unsigned getMaxPrefetchIterationsAhead()
const override {
2848 return Impl.getMaxPrefetchIterationsAhead();
2852 bool enableWritePrefetching()
const override {
2853 return Impl.enableWritePrefetching();
2857 bool shouldPrefetchAddressSpace(
unsigned AS)
const override {
2858 return Impl.shouldPrefetchAddressSpace(AS);
2861 InstructionCost getPartialReductionCost(
2862 unsigned Opcode, Type *InputTypeA, Type *InputTypeB, Type *AccumType,
2865 std::optional<unsigned> BinOp = std::nullopt)
const override {
2866 return Impl.getPartialReductionCost(Opcode, InputTypeA, InputTypeB,
2867 AccumType, VF, OpAExtend, OpBExtend,
2871 unsigned getMaxInterleaveFactor(ElementCount VF)
override {
2872 return Impl.getMaxInterleaveFactor(VF);
2874 unsigned getEstimatedNumberOfCaseClusters(
const SwitchInst &SI,
2876 ProfileSummaryInfo *PSI,
2877 BlockFrequencyInfo *BFI)
override {
2878 return Impl.getEstimatedNumberOfCaseClusters(SI, JTSize, PSI, BFI);
2880 InstructionCost getArithmeticInstrCost(
2882 OperandValueInfo Opd1Info, OperandValueInfo Opd2Info,
2883 ArrayRef<const Value *> Args,
2884 const Instruction *CxtI =
nullptr)
override {
2885 return Impl.getArithmeticInstrCost(Opcode, Ty,
CostKind, Opd1Info, Opd2Info,
2888 InstructionCost getAltInstrCost(
VectorType *VecTy,
unsigned Opcode0,
2890 const SmallBitVector &OpcodeMask,
2892 return Impl.getAltInstrCost(VecTy, Opcode0, Opcode1, OpcodeMask,
CostKind);
2899 ArrayRef<const Value *> Args,
2900 const Instruction *CxtI)
override {
2901 return Impl.getShuffleCost(Kind, Tp, Mask,
CostKind,
Index, SubTp, Args,
2904 InstructionCost getCastInstrCost(
unsigned Opcode, Type *Dst, Type *Src,
2907 const Instruction *
I)
override {
2908 return Impl.getCastInstrCost(Opcode, Dst, Src, CCH,
CostKind,
I);
2910 InstructionCost getExtractWithExtendCost(
unsigned Opcode, Type *Dst,
2912 unsigned Index)
override {
2913 return Impl.getExtractWithExtendCost(Opcode, Dst, VecTy,
Index);
2916 const Instruction *
I =
nullptr)
override {
2917 return Impl.getCFInstrCost(Opcode,
CostKind,
I);
2919 InstructionCost getCmpSelInstrCost(
unsigned Opcode, Type *ValTy, Type *CondTy,
2922 OperandValueInfo Op1Info,
2923 OperandValueInfo Op2Info,
2924 const Instruction *
I)
override {
2925 return Impl.getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred,
CostKind,
2926 Op1Info, Op2Info,
I);
2928 InstructionCost getVectorInstrCost(
unsigned Opcode, Type *Val,
2930 unsigned Index, Value *Op0,
2931 Value *Op1)
override {
2932 return Impl.getVectorInstrCost(Opcode, Val,
CostKind,
Index, Op0, Op1);
2934 InstructionCost getVectorInstrCost(
2937 ArrayRef<std::tuple<Value *, User *, int>> ScalarUserAndIdx)
override {
2938 return Impl.getVectorInstrCost(Opcode, Val,
CostKind,
Index, Scalar,
2941 InstructionCost getVectorInstrCost(
const Instruction &
I, Type *Val,
2943 unsigned Index)
override {
2947 getReplicationShuffleCost(Type *EltTy,
int ReplicationFactor,
int VF,
2948 const APInt &DemandedDstElts,
2950 return Impl.getReplicationShuffleCost(EltTy, ReplicationFactor, VF,
2953 InstructionCost getMemoryOpCost(
unsigned Opcode, Type *Src, Align Alignment,
2956 OperandValueInfo OpInfo,
2957 const Instruction *
I)
override {
2961 InstructionCost getVPMemoryOpCost(
unsigned Opcode, Type *Src, Align Alignment,
2964 const Instruction *
I)
override {
2965 return Impl.getVPMemoryOpCost(Opcode, Src, Alignment,
AddressSpace,
2968 InstructionCost getMaskedMemoryOpCost(
unsigned Opcode, Type *Src,
2971 return Impl.getMaskedMemoryOpCost(Opcode, Src, Alignment,
AddressSpace,
2975 getGatherScatterOpCost(
unsigned Opcode, Type *DataTy,
const Value *
Ptr,
2976 bool VariableMask, Align Alignment,
2978 const Instruction *
I =
nullptr)
override {
2979 return Impl.getGatherScatterOpCost(Opcode, DataTy,
Ptr, VariableMask,
2982 InstructionCost getExpandCompressMemoryOpCost(
2983 unsigned Opcode, Type *DataTy,
bool VariableMask, Align Alignment,
2985 return Impl.getExpandCompressMemoryOpCost(Opcode, DataTy, VariableMask,
2989 getStridedMemoryOpCost(
unsigned Opcode, Type *DataTy,
const Value *
Ptr,
2990 bool VariableMask, Align Alignment,
2992 const Instruction *
I =
nullptr)
override {
2993 return Impl.getStridedMemoryOpCost(Opcode, DataTy,
Ptr, VariableMask,
2996 InstructionCost getInterleavedMemoryOpCost(
2997 unsigned Opcode, Type *VecTy,
unsigned Factor, ArrayRef<unsigned> Indices,
2999 bool UseMaskForCond,
bool UseMaskForGaps)
override {
3000 return Impl.getInterleavedMemoryOpCost(Opcode, VecTy, Factor, Indices,
3002 UseMaskForCond, UseMaskForGaps);
3005 getArithmeticReductionCost(
unsigned Opcode,
VectorType *Ty,
3006 std::optional<FastMathFlags> FMF,
3008 return Impl.getArithmeticReductionCost(Opcode, Ty, FMF,
CostKind);
3013 return Impl.getMinMaxReductionCost(IID, Ty, FMF,
CostKind);
3016 getExtendedReductionCost(
unsigned Opcode,
bool IsUnsigned, Type *ResTy,
3019 return Impl.getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
3023 getMulAccReductionCost(
bool IsUnsigned, Type *ResTy,
VectorType *Ty,
3025 return Impl.getMulAccReductionCost(IsUnsigned, ResTy, Ty,
CostKind);
3027 InstructionCost getIntrinsicInstrCost(
const IntrinsicCostAttributes &ICA,
3029 return Impl.getIntrinsicInstrCost(ICA,
CostKind);
3031 InstructionCost getCallInstrCost(Function *
F, Type *
RetTy,
3032 ArrayRef<Type *> Tys,
3036 unsigned getNumberOfParts(Type *Tp)
override {
3037 return Impl.getNumberOfParts(Tp);
3039 InstructionCost getAddressComputationCost(Type *Ty, ScalarEvolution *SE,
3040 const SCEV *
Ptr)
override {
3041 return Impl.getAddressComputationCost(Ty, SE,
Ptr);
3043 InstructionCost getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys)
override {
3044 return Impl.getCostOfKeepingLiveOverCall(Tys);
3046 bool getTgtMemIntrinsic(IntrinsicInst *Inst,
3047 MemIntrinsicInfo &
Info)
override {
3048 return Impl.getTgtMemIntrinsic(Inst,
Info);
3050 unsigned getAtomicMemIntrinsicMaxElementSize()
const override {
3051 return Impl.getAtomicMemIntrinsicMaxElementSize();
3053 Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
3054 Type *ExpectedType)
override {
3055 return Impl.getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
3057 Type *getMemcpyLoopLoweringType(
3058 LLVMContext &Context, Value *
Length,
unsigned SrcAddrSpace,
3059 unsigned DestAddrSpace, Align SrcAlign, Align DestAlign,
3060 std::optional<uint32_t> AtomicElementSize)
const override {
3061 return Impl.getMemcpyLoopLoweringType(Context,
Length, SrcAddrSpace,
3062 DestAddrSpace, SrcAlign, DestAlign,
3065 void getMemcpyLoopResidualLoweringType(
3066 SmallVectorImpl<Type *> &OpsOut, LLVMContext &Context,
3067 unsigned RemainingBytes,
unsigned SrcAddrSpace,
unsigned DestAddrSpace,
3068 Align SrcAlign, Align DestAlign,
3069 std::optional<uint32_t> AtomicCpySize)
const override {
3070 Impl.getMemcpyLoopResidualLoweringType(OpsOut, Context, RemainingBytes,
3071 SrcAddrSpace, DestAddrSpace,
3072 SrcAlign, DestAlign, AtomicCpySize);
3075 const Function *Callee)
const override {
3076 return Impl.areInlineCompatible(Caller, Callee);
3078 unsigned getInlineCallPenalty(
const Function *
F,
const CallBase &Call,
3079 unsigned DefaultCallPenalty)
const override {
3080 return Impl.getInlineCallPenalty(
F, Call, DefaultCallPenalty);
3082 bool areTypesABICompatible(
const Function *Caller,
const Function *Callee,
3083 const ArrayRef<Type *> &Types)
const override {
3084 return Impl.areTypesABICompatible(Caller, Callee, Types);
3087 return Impl.isIndexedLoadLegal(
Mode, Ty, getDataLayout());
3090 return Impl.isIndexedStoreLegal(
Mode, Ty, getDataLayout());
3092 unsigned getLoadStoreVecRegBitWidth(
unsigned AddrSpace)
const override {
3093 return Impl.getLoadStoreVecRegBitWidth(AddrSpace);
3095 bool isLegalToVectorizeLoad(LoadInst *LI)
const override {
3096 return Impl.isLegalToVectorizeLoad(LI);
3098 bool isLegalToVectorizeStore(StoreInst *SI)
const override {
3099 return Impl.isLegalToVectorizeStore(SI);
3101 bool isLegalToVectorizeLoadChain(
unsigned ChainSizeInBytes, Align Alignment,
3102 unsigned AddrSpace)
const override {
3103 return Impl.isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
3106 bool isLegalToVectorizeStoreChain(
unsigned ChainSizeInBytes, Align Alignment,
3107 unsigned AddrSpace)
const override {
3108 return Impl.isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
3111 bool isLegalToVectorizeReduction(
const RecurrenceDescriptor &RdxDesc,
3112 ElementCount VF)
const override {
3113 return Impl.isLegalToVectorizeReduction(RdxDesc, VF);
3115 bool isElementTypeLegalForScalableVector(Type *Ty)
const override {
3116 return Impl.isElementTypeLegalForScalableVector(Ty);
3118 unsigned getLoadVectorFactor(
unsigned VF,
unsigned LoadSize,
3119 unsigned ChainSizeInBytes,
3121 return Impl.getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
3123 unsigned getStoreVectorFactor(
unsigned VF,
unsigned StoreSize,
3124 unsigned ChainSizeInBytes,
3126 return Impl.getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
3128 bool preferFixedOverScalableIfEqualCost()
const override {
3129 return Impl.preferFixedOverScalableIfEqualCost();
3131 bool preferInLoopReduction(
unsigned Opcode, Type *Ty,
3132 ReductionFlags Flags)
const override {
3133 return Impl.preferInLoopReduction(Opcode, Ty, Flags);
3135 bool preferPredicatedReductionSelect(
unsigned Opcode, Type *Ty,
3136 ReductionFlags Flags)
const override {
3137 return Impl.preferPredicatedReductionSelect(Opcode, Ty, Flags);
3139 bool preferEpilogueVectorization()
const override {
3140 return Impl.preferEpilogueVectorization();
3143 bool shouldExpandReduction(
const IntrinsicInst *
II)
const override {
3144 return Impl.shouldExpandReduction(
II);
3148 getPreferredExpandedReductionShuffle(
const IntrinsicInst *
II)
const override {
3149 return Impl.getPreferredExpandedReductionShuffle(
II);
3152 unsigned getGISelRematGlobalCost()
const override {
3153 return Impl.getGISelRematGlobalCost();
3156 unsigned getMinTripCountTailFoldingThreshold()
const override {
3157 return Impl.getMinTripCountTailFoldingThreshold();
3160 bool supportsScalableVectors()
const override {
3161 return Impl.supportsScalableVectors();
3164 bool enableScalableVectorization()
const override {
3165 return Impl.enableScalableVectorization();
3168 bool hasActiveVectorLength(
unsigned Opcode, Type *DataType,
3169 Align Alignment)
const override {
3170 return Impl.hasActiveVectorLength(Opcode, DataType, Alignment);
3173 bool isProfitableToSinkOperands(Instruction *
I,
3174 SmallVectorImpl<Use *> &Ops)
const override {
3175 return Impl.isProfitableToSinkOperands(
I, Ops);
3178 bool isVectorShiftByScalarCheap(Type *Ty)
const override {
3179 return Impl.isVectorShiftByScalarCheap(Ty);
3183 getVPLegalizationStrategy(
const VPIntrinsic &PI)
const override {
3184 return Impl.getVPLegalizationStrategy(PI);
3187 bool hasArmWideBranch(
bool Thumb)
const override {
3188 return Impl.hasArmWideBranch(Thumb);
3191 uint64_t getFeatureMask(
const Function &
F)
const override {
3192 return Impl.getFeatureMask(
F);
3195 bool isMultiversionedFunction(
const Function &
F)
const override {
3196 return Impl.isMultiversionedFunction(
F);
3199 unsigned getMaxNumArgs()
const override {
3200 return Impl.getMaxNumArgs();
3203 unsigned getNumBytesToPadGlobalArray(
unsigned Size,
3208 void collectKernelLaunchBounds(
3210 SmallVectorImpl<std::pair<StringRef, int64_t>> &LB)
const override {
3211 Impl.collectKernelLaunchBounds(
F, LB);
3215template <
typename T>
3217 : TTIImpl(new Model<
T>(Impl)) {}
3248 : TTICallback(Arg.TTICallback) {}
3250 : TTICallback(
std::
move(Arg.TTICallback)) {}
3252 TTICallback =
RHS.TTICallback;
3256 TTICallback = std::move(
RHS.TTICallback);
3288 std::optional<TargetTransformInfo>
TTI;
3290 virtual void anchor();
AMDGPU Lower Kernel Arguments
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
Analysis containing CSE Info
static cl::opt< TargetTransformInfo::TargetCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(TargetTransformInfo::TCK_RecipThroughput), cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(TargetTransformInfo::TCK_Latency, "latency", "Instruction latency"), clEnumValN(TargetTransformInfo::TCK_CodeSize, "code-size", "Code size"), clEnumValN(TargetTransformInfo::TCK_SizeAndLatency, "size-latency", "Code size and latency")))
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
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 header defines various interfaces for pass management in LLVM.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
std::optional< unsigned > getMaxVScale(const Function &F, const TargetTransformInfo &TTI)
mir Rename Register Operands
uint64_t IntrinsicInst * II
static cl::opt< RegAllocEvictionAdvisorAnalysis::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysis::AdvisorMode::Development, "development", "for training")))
Class for arbitrary precision integers.
an instruction to allocate memory on the stack
API to communicate dependencies between analyses during invalidation.
A container for analyses that lazily runs them and caches their results.
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...
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.
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.
static InstructionCost getInvalid(CostType Val=0)
Class to represent integer types.
Drive the analysis of interleaved memory accesses in the loop.
FastMathFlags getFlags() const
const SmallVectorImpl< Type * > & getArgTypes() const
Type * getReturnType() const
bool skipScalarizationCost() const
const SmallVectorImpl< const Value * > & getArgs() const
InstructionCost getScalarizationCost() const
const IntrinsicInst * getInst() const
Intrinsic::ID getID() const
bool isTypeBasedOnly() const
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.
LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor...
Represents a single loop in the control flow graph.
A set of analyses that are preserved following a run of a transformation pass.
Analysis providing profile information.
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
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.
TargetIRAnalysis(const TargetIRAnalysis &Arg)
TargetIRAnalysis & operator=(const TargetIRAnalysis &RHS)
Result run(const Function &F, FunctionAnalysisManager &)
TargetTransformInfo Result
TargetIRAnalysis()
Default construct a target IR analysis.
TargetIRAnalysis & operator=(TargetIRAnalysis &&RHS)
TargetIRAnalysis(TargetIRAnalysis &&Arg)
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Base class of all SIMD vector types.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
bool areInlineCompatible(const Function &Caller, const Function &Callee)
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.
Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
This is an optimization pass for GlobalISel generic memory operations.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ImmutablePass * createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)
Create an analysis pass wrapper around a TTI object.
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.
@ DataAndControlFlowWithoutRuntimeCheck
Use predicate to control both data and control flow, but modify the trip count so that a runtime over...
@ DataWithEVL
Use predicated EVL instructions for tail-folding.
@ DataAndControlFlow
Use predicate to control both data and control flow.
@ DataWithoutLaneMask
Same as Data, but avoids using the get.active.lane.mask intrinsic to calculate the mask and instead i...
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 CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Attributes of a target dependent hardware loop.
bool canAnalyze(LoopInfo &LI)
HardwareLoopInfo()=delete
bool isHardwareLoopCandidate(ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, bool ForceNestedLoop=false, bool ForceHardwareLoopPHI=false)
Information about a load/store intrinsic defined by the target.
unsigned short MatchingId
Value * PtrVal
This is the pointer that the intrinsic is loading from or storing to.
InterleavedAccessInfo * IAI
TailFoldingInfo(TargetLibraryInfo *TLI, LoopVectorizationLegality *LVL, InterleavedAccessInfo *IAI)
LoopVectorizationLegality * LVL