xref: /freebsd-src/contrib/llvm-project/llvm/lib/Analysis/TargetTransformInfo.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- llvm/Analysis/TargetTransformInfo.cpp ------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/Analysis/TargetTransformInfo.h"
10480093f4SDimitry Andric #include "llvm/Analysis/CFG.h"
11480093f4SDimitry Andric #include "llvm/Analysis/LoopIterator.h"
12*0fca6ea1SDimitry Andric #include "llvm/Analysis/TargetLibraryInfo.h"
130b57cec5SDimitry Andric #include "llvm/Analysis/TargetTransformInfoImpl.h"
148bcb0991SDimitry Andric #include "llvm/IR/CFG.h"
155ffd83dbSDimitry Andric #include "llvm/IR/Dominators.h"
160b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
170b57cec5SDimitry Andric #include "llvm/IR/Instructions.h"
180b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
190b57cec5SDimitry Andric #include "llvm/IR/Module.h"
200b57cec5SDimitry Andric #include "llvm/IR/Operator.h"
210b57cec5SDimitry Andric #include "llvm/IR/PatternMatch.h"
22480093f4SDimitry Andric #include "llvm/InitializePasses.h"
230b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
24bdd1243dSDimitry Andric #include <optional>
250b57cec5SDimitry Andric #include <utility>
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric using namespace llvm;
280b57cec5SDimitry Andric using namespace PatternMatch;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric #define DEBUG_TYPE "tti"
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric static cl::opt<bool> EnableReduxCost("costmodel-reduxcost", cl::init(false),
330b57cec5SDimitry Andric                                      cl::Hidden,
340b57cec5SDimitry Andric                                      cl::desc("Recognize reduction patterns."));
350b57cec5SDimitry Andric 
3681ad6265SDimitry Andric static cl::opt<unsigned> CacheLineSize(
3781ad6265SDimitry Andric     "cache-line-size", cl::init(0), cl::Hidden,
3881ad6265SDimitry Andric     cl::desc("Use this to override the target cache line size when "
3981ad6265SDimitry Andric              "specified by the user."));
4081ad6265SDimitry Andric 
411db9f3b2SDimitry Andric static cl::opt<unsigned> MinPageSize(
421db9f3b2SDimitry Andric     "min-page-size", cl::init(0), cl::Hidden,
431db9f3b2SDimitry Andric     cl::desc("Use this to override the target's minimum page size."));
441db9f3b2SDimitry Andric 
4506c3fb27SDimitry Andric static cl::opt<unsigned> PredictableBranchThreshold(
4606c3fb27SDimitry Andric     "predictable-branch-threshold", cl::init(99), cl::Hidden,
4706c3fb27SDimitry Andric     cl::desc(
4806c3fb27SDimitry Andric         "Use this to override the target's predictable branch threshold (%)."));
4906c3fb27SDimitry Andric 
500b57cec5SDimitry Andric namespace {
510b57cec5SDimitry Andric /// No-op implementation of the TTI interface using the utility base
520b57cec5SDimitry Andric /// classes.
530b57cec5SDimitry Andric ///
540b57cec5SDimitry Andric /// This is used when no target specific information is available.
550b57cec5SDimitry Andric struct NoTTIImpl : TargetTransformInfoImplCRTPBase<NoTTIImpl> {
560b57cec5SDimitry Andric   explicit NoTTIImpl(const DataLayout &DL)
570b57cec5SDimitry Andric       : TargetTransformInfoImplCRTPBase<NoTTIImpl>(DL) {}
580b57cec5SDimitry Andric };
595ffd83dbSDimitry Andric } // namespace
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric bool HardwareLoopInfo::canAnalyze(LoopInfo &LI) {
620b57cec5SDimitry Andric   // If the loop has irreducible control flow, it can not be converted to
630b57cec5SDimitry Andric   // Hardware loop.
640b57cec5SDimitry Andric   LoopBlocksRPO RPOT(L);
650b57cec5SDimitry Andric   RPOT.perform(&LI);
660b57cec5SDimitry Andric   if (containsIrreducibleCFG<const BasicBlock *>(RPOT, LI))
670b57cec5SDimitry Andric     return false;
680b57cec5SDimitry Andric   return true;
690b57cec5SDimitry Andric }
700b57cec5SDimitry Andric 
71fe6060f1SDimitry Andric IntrinsicCostAttributes::IntrinsicCostAttributes(
72fcaf7f86SDimitry Andric     Intrinsic::ID Id, const CallBase &CI, InstructionCost ScalarizationCost,
73fcaf7f86SDimitry Andric     bool TypeBasedOnly)
74fe6060f1SDimitry Andric     : II(dyn_cast<IntrinsicInst>(&CI)), RetTy(CI.getType()), IID(Id),
75fe6060f1SDimitry Andric       ScalarizationCost(ScalarizationCost) {
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric   if (const auto *FPMO = dyn_cast<FPMathOperator>(&CI))
785ffd83dbSDimitry Andric     FMF = FPMO->getFastMathFlags();
795ffd83dbSDimitry Andric 
80fcaf7f86SDimitry Andric   if (!TypeBasedOnly)
81e8d8bef9SDimitry Andric     Arguments.insert(Arguments.begin(), CI.arg_begin(), CI.arg_end());
82fe6060f1SDimitry Andric   FunctionType *FTy = CI.getCalledFunction()->getFunctionType();
835ffd83dbSDimitry Andric   ParamTys.insert(ParamTys.begin(), FTy->param_begin(), FTy->param_end());
845ffd83dbSDimitry Andric }
855ffd83dbSDimitry Andric 
865ffd83dbSDimitry Andric IntrinsicCostAttributes::IntrinsicCostAttributes(Intrinsic::ID Id, Type *RTy,
875ffd83dbSDimitry Andric                                                  ArrayRef<Type *> Tys,
885ffd83dbSDimitry Andric                                                  FastMathFlags Flags,
89fe6060f1SDimitry Andric                                                  const IntrinsicInst *I,
90fe6060f1SDimitry Andric                                                  InstructionCost ScalarCost)
91fe6060f1SDimitry Andric     : II(I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost) {
925ffd83dbSDimitry Andric   ParamTys.insert(ParamTys.begin(), Tys.begin(), Tys.end());
935ffd83dbSDimitry Andric }
945ffd83dbSDimitry Andric 
955ffd83dbSDimitry Andric IntrinsicCostAttributes::IntrinsicCostAttributes(Intrinsic::ID Id, Type *Ty,
965ffd83dbSDimitry Andric                                                  ArrayRef<const Value *> Args)
975ffd83dbSDimitry Andric     : RetTy(Ty), IID(Id) {
985ffd83dbSDimitry Andric 
995ffd83dbSDimitry Andric   Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
1005ffd83dbSDimitry Andric   ParamTys.reserve(Arguments.size());
101*0fca6ea1SDimitry Andric   for (const Value *Argument : Arguments)
102*0fca6ea1SDimitry Andric     ParamTys.push_back(Argument->getType());
1035ffd83dbSDimitry Andric }
1045ffd83dbSDimitry Andric 
105fe6060f1SDimitry Andric IntrinsicCostAttributes::IntrinsicCostAttributes(Intrinsic::ID Id, Type *RTy,
106fe6060f1SDimitry Andric                                                  ArrayRef<const Value *> Args,
107fe6060f1SDimitry Andric                                                  ArrayRef<Type *> Tys,
108fe6060f1SDimitry Andric                                                  FastMathFlags Flags,
109fe6060f1SDimitry Andric                                                  const IntrinsicInst *I,
110fe6060f1SDimitry Andric                                                  InstructionCost ScalarCost)
111fe6060f1SDimitry Andric     : II(I), RetTy(RTy), IID(Id), FMF(Flags), ScalarizationCost(ScalarCost) {
112fe6060f1SDimitry Andric   ParamTys.insert(ParamTys.begin(), Tys.begin(), Tys.end());
113fe6060f1SDimitry Andric   Arguments.insert(Arguments.begin(), Args.begin(), Args.end());
114fe6060f1SDimitry Andric }
115fe6060f1SDimitry Andric 
11606c3fb27SDimitry Andric HardwareLoopInfo::HardwareLoopInfo(Loop *L) : L(L) {
11706c3fb27SDimitry Andric   // Match default options:
11806c3fb27SDimitry Andric   // - hardware-loop-counter-bitwidth = 32
11906c3fb27SDimitry Andric   // - hardware-loop-decrement = 1
12006c3fb27SDimitry Andric   CountType = Type::getInt32Ty(L->getHeader()->getContext());
12106c3fb27SDimitry Andric   LoopDecrement = ConstantInt::get(CountType, 1);
12206c3fb27SDimitry Andric }
12306c3fb27SDimitry Andric 
1240b57cec5SDimitry Andric bool HardwareLoopInfo::isHardwareLoopCandidate(ScalarEvolution &SE,
1250b57cec5SDimitry Andric                                                LoopInfo &LI, DominatorTree &DT,
1260b57cec5SDimitry Andric                                                bool ForceNestedLoop,
1270b57cec5SDimitry Andric                                                bool ForceHardwareLoopPHI) {
1280b57cec5SDimitry Andric   SmallVector<BasicBlock *, 4> ExitingBlocks;
1290b57cec5SDimitry Andric   L->getExitingBlocks(ExitingBlocks);
1300b57cec5SDimitry Andric 
1318bcb0991SDimitry Andric   for (BasicBlock *BB : ExitingBlocks) {
1320b57cec5SDimitry Andric     // If we pass the updated counter back through a phi, we need to know
1330b57cec5SDimitry Andric     // which latch the updated value will be coming from.
1340b57cec5SDimitry Andric     if (!L->isLoopLatch(BB)) {
1350b57cec5SDimitry Andric       if (ForceHardwareLoopPHI || CounterInReg)
1360b57cec5SDimitry Andric         continue;
1370b57cec5SDimitry Andric     }
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric     const SCEV *EC = SE.getExitCount(L, BB);
1400b57cec5SDimitry Andric     if (isa<SCEVCouldNotCompute>(EC))
1410b57cec5SDimitry Andric       continue;
1420b57cec5SDimitry Andric     if (const SCEVConstant *ConstEC = dyn_cast<SCEVConstant>(EC)) {
1430b57cec5SDimitry Andric       if (ConstEC->getValue()->isZero())
1440b57cec5SDimitry Andric         continue;
1450b57cec5SDimitry Andric     } else if (!SE.isLoopInvariant(EC, L))
1460b57cec5SDimitry Andric       continue;
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric     if (SE.getTypeSizeInBits(EC->getType()) > CountType->getBitWidth())
1490b57cec5SDimitry Andric       continue;
1500b57cec5SDimitry Andric 
1510b57cec5SDimitry Andric     // If this exiting block is contained in a nested loop, it is not eligible
1520b57cec5SDimitry Andric     // for insertion of the branch-and-decrement since the inner loop would
1530b57cec5SDimitry Andric     // end up messing up the value in the CTR.
1540b57cec5SDimitry Andric     if (!IsNestingLegal && LI.getLoopFor(BB) != L && !ForceNestedLoop)
1550b57cec5SDimitry Andric       continue;
1560b57cec5SDimitry Andric 
1570b57cec5SDimitry Andric     // We now have a loop-invariant count of loop iterations (which is not the
1580b57cec5SDimitry Andric     // constant zero) for which we know that this loop will not exit via this
1590b57cec5SDimitry Andric     // existing block.
1600b57cec5SDimitry Andric 
1610b57cec5SDimitry Andric     // We need to make sure that this block will run on every loop iteration.
1620b57cec5SDimitry Andric     // For this to be true, we must dominate all blocks with backedges. Such
1630b57cec5SDimitry Andric     // blocks are in-loop predecessors to the header block.
1640b57cec5SDimitry Andric     bool NotAlways = false;
1658bcb0991SDimitry Andric     for (BasicBlock *Pred : predecessors(L->getHeader())) {
1668bcb0991SDimitry Andric       if (!L->contains(Pred))
1670b57cec5SDimitry Andric         continue;
1680b57cec5SDimitry Andric 
1698bcb0991SDimitry Andric       if (!DT.dominates(BB, Pred)) {
1700b57cec5SDimitry Andric         NotAlways = true;
1710b57cec5SDimitry Andric         break;
1720b57cec5SDimitry Andric       }
1730b57cec5SDimitry Andric     }
1740b57cec5SDimitry Andric 
1750b57cec5SDimitry Andric     if (NotAlways)
1760b57cec5SDimitry Andric       continue;
1770b57cec5SDimitry Andric 
1780b57cec5SDimitry Andric     // Make sure this blocks ends with a conditional branch.
1790b57cec5SDimitry Andric     Instruction *TI = BB->getTerminator();
1800b57cec5SDimitry Andric     if (!TI)
1810b57cec5SDimitry Andric       continue;
1820b57cec5SDimitry Andric 
1830b57cec5SDimitry Andric     if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
1840b57cec5SDimitry Andric       if (!BI->isConditional())
1850b57cec5SDimitry Andric         continue;
1860b57cec5SDimitry Andric 
1870b57cec5SDimitry Andric       ExitBranch = BI;
1880b57cec5SDimitry Andric     } else
1890b57cec5SDimitry Andric       continue;
1900b57cec5SDimitry Andric 
1910b57cec5SDimitry Andric     // Note that this block may not be the loop latch block, even if the loop
1920b57cec5SDimitry Andric     // has a latch block.
1938bcb0991SDimitry Andric     ExitBlock = BB;
194f21fcae4SAlfredo Dal'Ava Junior     ExitCount = EC;
1950b57cec5SDimitry Andric     break;
1960b57cec5SDimitry Andric   }
1970b57cec5SDimitry Andric 
1980b57cec5SDimitry Andric   if (!ExitBlock)
1990b57cec5SDimitry Andric     return false;
2000b57cec5SDimitry Andric   return true;
2010b57cec5SDimitry Andric }
2020b57cec5SDimitry Andric 
2030b57cec5SDimitry Andric TargetTransformInfo::TargetTransformInfo(const DataLayout &DL)
2040b57cec5SDimitry Andric     : TTIImpl(new Model<NoTTIImpl>(NoTTIImpl(DL))) {}
2050b57cec5SDimitry Andric 
20681ad6265SDimitry Andric TargetTransformInfo::~TargetTransformInfo() = default;
2070b57cec5SDimitry Andric 
2080b57cec5SDimitry Andric TargetTransformInfo::TargetTransformInfo(TargetTransformInfo &&Arg)
2090b57cec5SDimitry Andric     : TTIImpl(std::move(Arg.TTIImpl)) {}
2100b57cec5SDimitry Andric 
2110b57cec5SDimitry Andric TargetTransformInfo &TargetTransformInfo::operator=(TargetTransformInfo &&RHS) {
2120b57cec5SDimitry Andric   TTIImpl = std::move(RHS.TTIImpl);
2130b57cec5SDimitry Andric   return *this;
2140b57cec5SDimitry Andric }
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric unsigned TargetTransformInfo::getInliningThresholdMultiplier() const {
2170b57cec5SDimitry Andric   return TTIImpl->getInliningThresholdMultiplier();
2180b57cec5SDimitry Andric }
2190b57cec5SDimitry Andric 
220e8d8bef9SDimitry Andric unsigned
2215f757f3fSDimitry Andric TargetTransformInfo::getInliningCostBenefitAnalysisSavingsMultiplier() const {
2225f757f3fSDimitry Andric   return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
2235f757f3fSDimitry Andric }
2245f757f3fSDimitry Andric 
2255f757f3fSDimitry Andric unsigned
2265f757f3fSDimitry Andric TargetTransformInfo::getInliningCostBenefitAnalysisProfitableMultiplier()
2275f757f3fSDimitry Andric     const {
2285f757f3fSDimitry Andric   return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
2295f757f3fSDimitry Andric }
2305f757f3fSDimitry Andric 
2315f757f3fSDimitry Andric unsigned
232e8d8bef9SDimitry Andric TargetTransformInfo::adjustInliningThreshold(const CallBase *CB) const {
233e8d8bef9SDimitry Andric   return TTIImpl->adjustInliningThreshold(CB);
234e8d8bef9SDimitry Andric }
235e8d8bef9SDimitry Andric 
23606c3fb27SDimitry Andric unsigned TargetTransformInfo::getCallerAllocaCost(const CallBase *CB,
23706c3fb27SDimitry Andric                                                   const AllocaInst *AI) const {
23806c3fb27SDimitry Andric   return TTIImpl->getCallerAllocaCost(CB, AI);
23906c3fb27SDimitry Andric }
24006c3fb27SDimitry Andric 
2410b57cec5SDimitry Andric int TargetTransformInfo::getInlinerVectorBonusPercent() const {
2420b57cec5SDimitry Andric   return TTIImpl->getInlinerVectorBonusPercent();
2430b57cec5SDimitry Andric }
2440b57cec5SDimitry Andric 
24506c3fb27SDimitry Andric InstructionCost TargetTransformInfo::getGEPCost(
24606c3fb27SDimitry Andric     Type *PointeeType, const Value *Ptr, ArrayRef<const Value *> Operands,
24706c3fb27SDimitry Andric     Type *AccessType, TTI::TargetCostKind CostKind) const {
24806c3fb27SDimitry Andric   return TTIImpl->getGEPCost(PointeeType, Ptr, Operands, AccessType, CostKind);
24906c3fb27SDimitry Andric }
25006c3fb27SDimitry Andric 
25106c3fb27SDimitry Andric InstructionCost TargetTransformInfo::getPointersChainCost(
25206c3fb27SDimitry Andric     ArrayRef<const Value *> Ptrs, const Value *Base,
25306c3fb27SDimitry Andric     const TTI::PointersChainInfo &Info, Type *AccessTy,
2545ffd83dbSDimitry Andric     TTI::TargetCostKind CostKind) const {
25506c3fb27SDimitry Andric   assert((Base || !Info.isSameBase()) &&
25606c3fb27SDimitry Andric          "If pointers have same base address it has to be provided.");
25706c3fb27SDimitry Andric   return TTIImpl->getPointersChainCost(Ptrs, Base, Info, AccessTy, CostKind);
2580b57cec5SDimitry Andric }
2590b57cec5SDimitry Andric 
2605ffd83dbSDimitry Andric unsigned TargetTransformInfo::getEstimatedNumberOfCaseClusters(
261480093f4SDimitry Andric     const SwitchInst &SI, unsigned &JTSize, ProfileSummaryInfo *PSI,
262480093f4SDimitry Andric     BlockFrequencyInfo *BFI) const {
263480093f4SDimitry Andric   return TTIImpl->getEstimatedNumberOfCaseClusters(SI, JTSize, PSI, BFI);
2640b57cec5SDimitry Andric }
2650b57cec5SDimitry Andric 
266fe6060f1SDimitry Andric InstructionCost
267bdd1243dSDimitry Andric TargetTransformInfo::getInstructionCost(const User *U,
2685ffd83dbSDimitry Andric                                         ArrayRef<const Value *> Operands,
2695ffd83dbSDimitry Andric                                         enum TargetCostKind CostKind) const {
270bdd1243dSDimitry Andric   InstructionCost Cost = TTIImpl->getInstructionCost(U, Operands, CostKind);
2715ffd83dbSDimitry Andric   assert((CostKind == TTI::TCK_RecipThroughput || Cost >= 0) &&
2725ffd83dbSDimitry Andric          "TTI should not produce negative costs!");
2730b57cec5SDimitry Andric   return Cost;
2740b57cec5SDimitry Andric }
2750b57cec5SDimitry Andric 
276fe6060f1SDimitry Andric BranchProbability TargetTransformInfo::getPredictableBranchThreshold() const {
27706c3fb27SDimitry Andric   return PredictableBranchThreshold.getNumOccurrences() > 0
27806c3fb27SDimitry Andric              ? BranchProbability(PredictableBranchThreshold, 100)
27906c3fb27SDimitry Andric              : TTIImpl->getPredictableBranchThreshold();
280fe6060f1SDimitry Andric }
281fe6060f1SDimitry Andric 
282*0fca6ea1SDimitry Andric InstructionCost TargetTransformInfo::getBranchMispredictPenalty() const {
283*0fca6ea1SDimitry Andric   return TTIImpl->getBranchMispredictPenalty();
284*0fca6ea1SDimitry Andric }
285*0fca6ea1SDimitry Andric 
28606c3fb27SDimitry Andric bool TargetTransformInfo::hasBranchDivergence(const Function *F) const {
28706c3fb27SDimitry Andric   return TTIImpl->hasBranchDivergence(F);
2885ffd83dbSDimitry Andric }
2895ffd83dbSDimitry Andric 
2900b57cec5SDimitry Andric bool TargetTransformInfo::isSourceOfDivergence(const Value *V) const {
2910b57cec5SDimitry Andric   return TTIImpl->isSourceOfDivergence(V);
2920b57cec5SDimitry Andric }
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric bool llvm::TargetTransformInfo::isAlwaysUniform(const Value *V) const {
2950b57cec5SDimitry Andric   return TTIImpl->isAlwaysUniform(V);
2960b57cec5SDimitry Andric }
2970b57cec5SDimitry Andric 
29806c3fb27SDimitry Andric bool llvm::TargetTransformInfo::isValidAddrSpaceCast(unsigned FromAS,
29906c3fb27SDimitry Andric                                                      unsigned ToAS) const {
30006c3fb27SDimitry Andric   return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
30106c3fb27SDimitry Andric }
30206c3fb27SDimitry Andric 
30306c3fb27SDimitry Andric bool llvm::TargetTransformInfo::addrspacesMayAlias(unsigned FromAS,
30406c3fb27SDimitry Andric                                                    unsigned ToAS) const {
30506c3fb27SDimitry Andric   return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
30606c3fb27SDimitry Andric }
30706c3fb27SDimitry Andric 
3080b57cec5SDimitry Andric unsigned TargetTransformInfo::getFlatAddressSpace() const {
3090b57cec5SDimitry Andric   return TTIImpl->getFlatAddressSpace();
3100b57cec5SDimitry Andric }
3110b57cec5SDimitry Andric 
3128bcb0991SDimitry Andric bool TargetTransformInfo::collectFlatAddressOperands(
3138bcb0991SDimitry Andric     SmallVectorImpl<int> &OpIndexes, Intrinsic::ID IID) const {
3148bcb0991SDimitry Andric   return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
3158bcb0991SDimitry Andric }
3168bcb0991SDimitry Andric 
3175ffd83dbSDimitry Andric bool TargetTransformInfo::isNoopAddrSpaceCast(unsigned FromAS,
3185ffd83dbSDimitry Andric                                               unsigned ToAS) const {
3195ffd83dbSDimitry Andric   return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
3205ffd83dbSDimitry Andric }
3215ffd83dbSDimitry Andric 
322349cc55cSDimitry Andric bool TargetTransformInfo::canHaveNonUndefGlobalInitializerInAddressSpace(
323349cc55cSDimitry Andric     unsigned AS) const {
324349cc55cSDimitry Andric   return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
325349cc55cSDimitry Andric }
326349cc55cSDimitry Andric 
327e8d8bef9SDimitry Andric unsigned TargetTransformInfo::getAssumedAddrSpace(const Value *V) const {
328e8d8bef9SDimitry Andric   return TTIImpl->getAssumedAddrSpace(V);
329e8d8bef9SDimitry Andric }
330e8d8bef9SDimitry Andric 
331bdd1243dSDimitry Andric bool TargetTransformInfo::isSingleThreaded() const {
332bdd1243dSDimitry Andric   return TTIImpl->isSingleThreaded();
333bdd1243dSDimitry Andric }
334bdd1243dSDimitry Andric 
335349cc55cSDimitry Andric std::pair<const Value *, unsigned>
336349cc55cSDimitry Andric TargetTransformInfo::getPredicatedAddrSpace(const Value *V) const {
337349cc55cSDimitry Andric   return TTIImpl->getPredicatedAddrSpace(V);
338349cc55cSDimitry Andric }
339349cc55cSDimitry Andric 
3405ffd83dbSDimitry Andric Value *TargetTransformInfo::rewriteIntrinsicWithAddressSpace(
3418bcb0991SDimitry Andric     IntrinsicInst *II, Value *OldV, Value *NewV) const {
3428bcb0991SDimitry Andric   return TTIImpl->rewriteIntrinsicWithAddressSpace(II, OldV, NewV);
3438bcb0991SDimitry Andric }
3448bcb0991SDimitry Andric 
3450b57cec5SDimitry Andric bool TargetTransformInfo::isLoweredToCall(const Function *F) const {
3460b57cec5SDimitry Andric   return TTIImpl->isLoweredToCall(F);
3470b57cec5SDimitry Andric }
3480b57cec5SDimitry Andric 
3490b57cec5SDimitry Andric bool TargetTransformInfo::isHardwareLoopProfitable(
3500b57cec5SDimitry Andric     Loop *L, ScalarEvolution &SE, AssumptionCache &AC,
3510b57cec5SDimitry Andric     TargetLibraryInfo *LibInfo, HardwareLoopInfo &HWLoopInfo) const {
3520b57cec5SDimitry Andric   return TTIImpl->isHardwareLoopProfitable(L, SE, AC, LibInfo, HWLoopInfo);
3530b57cec5SDimitry Andric }
3540b57cec5SDimitry Andric 
3555ffd83dbSDimitry Andric bool TargetTransformInfo::preferPredicateOverEpilogue(
35606c3fb27SDimitry Andric     TailFoldingInfo *TFI) const {
35706c3fb27SDimitry Andric   return TTIImpl->preferPredicateOverEpilogue(TFI);
358480093f4SDimitry Andric }
359480093f4SDimitry Andric 
36006c3fb27SDimitry Andric TailFoldingStyle TargetTransformInfo::getPreferredTailFoldingStyle(
36106c3fb27SDimitry Andric     bool IVUpdateMayOverflow) const {
36206c3fb27SDimitry Andric   return TTIImpl->getPreferredTailFoldingStyle(IVUpdateMayOverflow);
3635ffd83dbSDimitry Andric }
3645ffd83dbSDimitry Andric 
365bdd1243dSDimitry Andric std::optional<Instruction *>
366e8d8bef9SDimitry Andric TargetTransformInfo::instCombineIntrinsic(InstCombiner &IC,
367e8d8bef9SDimitry Andric                                           IntrinsicInst &II) const {
368e8d8bef9SDimitry Andric   return TTIImpl->instCombineIntrinsic(IC, II);
369e8d8bef9SDimitry Andric }
370e8d8bef9SDimitry Andric 
371bdd1243dSDimitry Andric std::optional<Value *> TargetTransformInfo::simplifyDemandedUseBitsIntrinsic(
372e8d8bef9SDimitry Andric     InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known,
373e8d8bef9SDimitry Andric     bool &KnownBitsComputed) const {
374e8d8bef9SDimitry Andric   return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known,
375e8d8bef9SDimitry Andric                                                    KnownBitsComputed);
376e8d8bef9SDimitry Andric }
377e8d8bef9SDimitry Andric 
378bdd1243dSDimitry Andric std::optional<Value *> TargetTransformInfo::simplifyDemandedVectorEltsIntrinsic(
379e8d8bef9SDimitry Andric     InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
380e8d8bef9SDimitry Andric     APInt &UndefElts2, APInt &UndefElts3,
381e8d8bef9SDimitry Andric     std::function<void(Instruction *, unsigned, APInt, APInt &)>
382e8d8bef9SDimitry Andric         SimplifyAndSetOp) const {
383e8d8bef9SDimitry Andric   return TTIImpl->simplifyDemandedVectorEltsIntrinsic(
384e8d8bef9SDimitry Andric       IC, II, DemandedElts, UndefElts, UndefElts2, UndefElts3,
385e8d8bef9SDimitry Andric       SimplifyAndSetOp);
386e8d8bef9SDimitry Andric }
387e8d8bef9SDimitry Andric 
3880b57cec5SDimitry Andric void TargetTransformInfo::getUnrollingPreferences(
389349cc55cSDimitry Andric     Loop *L, ScalarEvolution &SE, UnrollingPreferences &UP,
390349cc55cSDimitry Andric     OptimizationRemarkEmitter *ORE) const {
391349cc55cSDimitry Andric   return TTIImpl->getUnrollingPreferences(L, SE, UP, ORE);
3920b57cec5SDimitry Andric }
3930b57cec5SDimitry Andric 
3945ffd83dbSDimitry Andric void TargetTransformInfo::getPeelingPreferences(Loop *L, ScalarEvolution &SE,
3955ffd83dbSDimitry Andric                                                 PeelingPreferences &PP) const {
3965ffd83dbSDimitry Andric   return TTIImpl->getPeelingPreferences(L, SE, PP);
3975ffd83dbSDimitry Andric }
3985ffd83dbSDimitry Andric 
3990b57cec5SDimitry Andric bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
4000b57cec5SDimitry Andric   return TTIImpl->isLegalAddImmediate(Imm);
4010b57cec5SDimitry Andric }
4020b57cec5SDimitry Andric 
403*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalAddScalableImmediate(int64_t Imm) const {
404*0fca6ea1SDimitry Andric   return TTIImpl->isLegalAddScalableImmediate(Imm);
405*0fca6ea1SDimitry Andric }
406*0fca6ea1SDimitry Andric 
4070b57cec5SDimitry Andric bool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const {
4080b57cec5SDimitry Andric   return TTIImpl->isLegalICmpImmediate(Imm);
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric 
4110b57cec5SDimitry Andric bool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV,
4120b57cec5SDimitry Andric                                                 int64_t BaseOffset,
4135ffd83dbSDimitry Andric                                                 bool HasBaseReg, int64_t Scale,
4140b57cec5SDimitry Andric                                                 unsigned AddrSpace,
415*0fca6ea1SDimitry Andric                                                 Instruction *I,
416*0fca6ea1SDimitry Andric                                                 int64_t ScalableOffset) const {
4170b57cec5SDimitry Andric   return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
418*0fca6ea1SDimitry Andric                                         Scale, AddrSpace, I, ScalableOffset);
4190b57cec5SDimitry Andric }
4200b57cec5SDimitry Andric 
42181ad6265SDimitry Andric bool TargetTransformInfo::isLSRCostLess(const LSRCost &C1,
42281ad6265SDimitry Andric                                         const LSRCost &C2) const {
4230b57cec5SDimitry Andric   return TTIImpl->isLSRCostLess(C1, C2);
4240b57cec5SDimitry Andric }
4250b57cec5SDimitry Andric 
426e8d8bef9SDimitry Andric bool TargetTransformInfo::isNumRegsMajorCostOfLSR() const {
427e8d8bef9SDimitry Andric   return TTIImpl->isNumRegsMajorCostOfLSR();
428e8d8bef9SDimitry Andric }
429e8d8bef9SDimitry Andric 
4305f757f3fSDimitry Andric bool TargetTransformInfo::shouldFoldTerminatingConditionAfterLSR() const {
4315f757f3fSDimitry Andric   return TTIImpl->shouldFoldTerminatingConditionAfterLSR();
4325f757f3fSDimitry Andric }
4335f757f3fSDimitry Andric 
434*0fca6ea1SDimitry Andric bool TargetTransformInfo::shouldDropLSRSolutionIfLessProfitable() const {
435*0fca6ea1SDimitry Andric   return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
436*0fca6ea1SDimitry Andric }
437*0fca6ea1SDimitry Andric 
4385ffd83dbSDimitry Andric bool TargetTransformInfo::isProfitableLSRChainElement(Instruction *I) const {
4395ffd83dbSDimitry Andric   return TTIImpl->isProfitableLSRChainElement(I);
4405ffd83dbSDimitry Andric }
4415ffd83dbSDimitry Andric 
4420b57cec5SDimitry Andric bool TargetTransformInfo::canMacroFuseCmp() const {
4430b57cec5SDimitry Andric   return TTIImpl->canMacroFuseCmp();
4440b57cec5SDimitry Andric }
4450b57cec5SDimitry Andric 
4460b57cec5SDimitry Andric bool TargetTransformInfo::canSaveCmp(Loop *L, BranchInst **BI,
4470b57cec5SDimitry Andric                                      ScalarEvolution *SE, LoopInfo *LI,
4480b57cec5SDimitry Andric                                      DominatorTree *DT, AssumptionCache *AC,
4490b57cec5SDimitry Andric                                      TargetLibraryInfo *LibInfo) const {
4500b57cec5SDimitry Andric   return TTIImpl->canSaveCmp(L, BI, SE, LI, DT, AC, LibInfo);
4510b57cec5SDimitry Andric }
4520b57cec5SDimitry Andric 
453fe6060f1SDimitry Andric TTI::AddressingModeKind
454fe6060f1SDimitry Andric TargetTransformInfo::getPreferredAddressingMode(const Loop *L,
455fe6060f1SDimitry Andric                                                 ScalarEvolution *SE) const {
456fe6060f1SDimitry Andric   return TTIImpl->getPreferredAddressingMode(L, SE);
4570b57cec5SDimitry Andric }
4580b57cec5SDimitry Andric 
4598bcb0991SDimitry Andric bool TargetTransformInfo::isLegalMaskedStore(Type *DataType,
4605ffd83dbSDimitry Andric                                              Align Alignment) const {
4618bcb0991SDimitry Andric   return TTIImpl->isLegalMaskedStore(DataType, Alignment);
4620b57cec5SDimitry Andric }
4630b57cec5SDimitry Andric 
4648bcb0991SDimitry Andric bool TargetTransformInfo::isLegalMaskedLoad(Type *DataType,
4655ffd83dbSDimitry Andric                                             Align Alignment) const {
4668bcb0991SDimitry Andric   return TTIImpl->isLegalMaskedLoad(DataType, Alignment);
4670b57cec5SDimitry Andric }
4680b57cec5SDimitry Andric 
4690b57cec5SDimitry Andric bool TargetTransformInfo::isLegalNTStore(Type *DataType,
4708bcb0991SDimitry Andric                                          Align Alignment) const {
4710b57cec5SDimitry Andric   return TTIImpl->isLegalNTStore(DataType, Alignment);
4720b57cec5SDimitry Andric }
4730b57cec5SDimitry Andric 
4748bcb0991SDimitry Andric bool TargetTransformInfo::isLegalNTLoad(Type *DataType, Align Alignment) const {
4750b57cec5SDimitry Andric   return TTIImpl->isLegalNTLoad(DataType, Alignment);
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric 
47881ad6265SDimitry Andric bool TargetTransformInfo::isLegalBroadcastLoad(Type *ElementTy,
47981ad6265SDimitry Andric                                                ElementCount NumElements) const {
48081ad6265SDimitry Andric   return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
48181ad6265SDimitry Andric }
48281ad6265SDimitry Andric 
483480093f4SDimitry Andric bool TargetTransformInfo::isLegalMaskedGather(Type *DataType,
4845ffd83dbSDimitry Andric                                               Align Alignment) const {
485480093f4SDimitry Andric   return TTIImpl->isLegalMaskedGather(DataType, Alignment);
4860b57cec5SDimitry Andric }
4870b57cec5SDimitry Andric 
48881ad6265SDimitry Andric bool TargetTransformInfo::isLegalAltInstr(
48981ad6265SDimitry Andric     VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
49081ad6265SDimitry Andric     const SmallBitVector &OpcodeMask) const {
49181ad6265SDimitry Andric   return TTIImpl->isLegalAltInstr(VecTy, Opcode0, Opcode1, OpcodeMask);
49281ad6265SDimitry Andric }
49381ad6265SDimitry Andric 
494480093f4SDimitry Andric bool TargetTransformInfo::isLegalMaskedScatter(Type *DataType,
4955ffd83dbSDimitry Andric                                                Align Alignment) const {
496480093f4SDimitry Andric   return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
4970b57cec5SDimitry Andric }
4980b57cec5SDimitry Andric 
49904eeddc0SDimitry Andric bool TargetTransformInfo::forceScalarizeMaskedGather(VectorType *DataType,
50004eeddc0SDimitry Andric                                                      Align Alignment) const {
50104eeddc0SDimitry Andric   return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
50204eeddc0SDimitry Andric }
50304eeddc0SDimitry Andric 
50404eeddc0SDimitry Andric bool TargetTransformInfo::forceScalarizeMaskedScatter(VectorType *DataType,
50504eeddc0SDimitry Andric                                                       Align Alignment) const {
50604eeddc0SDimitry Andric   return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
50704eeddc0SDimitry Andric }
50804eeddc0SDimitry Andric 
509*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalMaskedCompressStore(Type *DataType,
510*0fca6ea1SDimitry Andric                                                      Align Alignment) const {
511*0fca6ea1SDimitry Andric   return TTIImpl->isLegalMaskedCompressStore(DataType, Alignment);
5120b57cec5SDimitry Andric }
5130b57cec5SDimitry Andric 
514*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalMaskedExpandLoad(Type *DataType,
515*0fca6ea1SDimitry Andric                                                   Align Alignment) const {
516*0fca6ea1SDimitry Andric   return TTIImpl->isLegalMaskedExpandLoad(DataType, Alignment);
517*0fca6ea1SDimitry Andric }
518*0fca6ea1SDimitry Andric 
519*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalStridedLoadStore(Type *DataType,
520*0fca6ea1SDimitry Andric                                                   Align Alignment) const {
521*0fca6ea1SDimitry Andric   return TTIImpl->isLegalStridedLoadStore(DataType, Alignment);
522*0fca6ea1SDimitry Andric }
523*0fca6ea1SDimitry Andric 
524*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalMaskedVectorHistogram(Type *AddrType,
525*0fca6ea1SDimitry Andric                                                        Type *DataType) const {
526*0fca6ea1SDimitry Andric   return TTIImpl->isLegalMaskedVectorHistogram(AddrType, DataType);
5270b57cec5SDimitry Andric }
5280b57cec5SDimitry Andric 
529349cc55cSDimitry Andric bool TargetTransformInfo::enableOrderedReductions() const {
530349cc55cSDimitry Andric   return TTIImpl->enableOrderedReductions();
531349cc55cSDimitry Andric }
532349cc55cSDimitry Andric 
5330b57cec5SDimitry Andric bool TargetTransformInfo::hasDivRemOp(Type *DataType, bool IsSigned) const {
5340b57cec5SDimitry Andric   return TTIImpl->hasDivRemOp(DataType, IsSigned);
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric 
5370b57cec5SDimitry Andric bool TargetTransformInfo::hasVolatileVariant(Instruction *I,
5380b57cec5SDimitry Andric                                              unsigned AddrSpace) const {
5390b57cec5SDimitry Andric   return TTIImpl->hasVolatileVariant(I, AddrSpace);
5400b57cec5SDimitry Andric }
5410b57cec5SDimitry Andric 
5420b57cec5SDimitry Andric bool TargetTransformInfo::prefersVectorizedAddressing() const {
5430b57cec5SDimitry Andric   return TTIImpl->prefersVectorizedAddressing();
5440b57cec5SDimitry Andric }
5450b57cec5SDimitry Andric 
546fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getScalingFactorCost(
547*0fca6ea1SDimitry Andric     Type *Ty, GlobalValue *BaseGV, StackOffset BaseOffset, bool HasBaseReg,
548fe6060f1SDimitry Andric     int64_t Scale, unsigned AddrSpace) const {
549fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getScalingFactorCost(
550fe6060f1SDimitry Andric       Ty, BaseGV, BaseOffset, HasBaseReg, Scale, AddrSpace);
5510b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
5520b57cec5SDimitry Andric   return Cost;
5530b57cec5SDimitry Andric }
5540b57cec5SDimitry Andric 
5550b57cec5SDimitry Andric bool TargetTransformInfo::LSRWithInstrQueries() const {
5560b57cec5SDimitry Andric   return TTIImpl->LSRWithInstrQueries();
5570b57cec5SDimitry Andric }
5580b57cec5SDimitry Andric 
5590b57cec5SDimitry Andric bool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const {
5600b57cec5SDimitry Andric   return TTIImpl->isTruncateFree(Ty1, Ty2);
5610b57cec5SDimitry Andric }
5620b57cec5SDimitry Andric 
5630b57cec5SDimitry Andric bool TargetTransformInfo::isProfitableToHoist(Instruction *I) const {
5640b57cec5SDimitry Andric   return TTIImpl->isProfitableToHoist(I);
5650b57cec5SDimitry Andric }
5660b57cec5SDimitry Andric 
5670b57cec5SDimitry Andric bool TargetTransformInfo::useAA() const { return TTIImpl->useAA(); }
5680b57cec5SDimitry Andric 
5690b57cec5SDimitry Andric bool TargetTransformInfo::isTypeLegal(Type *Ty) const {
5700b57cec5SDimitry Andric   return TTIImpl->isTypeLegal(Ty);
5710b57cec5SDimitry Andric }
5720b57cec5SDimitry Andric 
57381ad6265SDimitry Andric unsigned TargetTransformInfo::getRegUsageForType(Type *Ty) const {
574e8d8bef9SDimitry Andric   return TTIImpl->getRegUsageForType(Ty);
575e8d8bef9SDimitry Andric }
576e8d8bef9SDimitry Andric 
5770b57cec5SDimitry Andric bool TargetTransformInfo::shouldBuildLookupTables() const {
5780b57cec5SDimitry Andric   return TTIImpl->shouldBuildLookupTables();
5790b57cec5SDimitry Andric }
580fe6060f1SDimitry Andric 
5815ffd83dbSDimitry Andric bool TargetTransformInfo::shouldBuildLookupTablesForConstant(
5825ffd83dbSDimitry Andric     Constant *C) const {
5830b57cec5SDimitry Andric   return TTIImpl->shouldBuildLookupTablesForConstant(C);
5840b57cec5SDimitry Andric }
5850b57cec5SDimitry Andric 
586fe6060f1SDimitry Andric bool TargetTransformInfo::shouldBuildRelLookupTables() const {
587fe6060f1SDimitry Andric   return TTIImpl->shouldBuildRelLookupTables();
588fe6060f1SDimitry Andric }
589fe6060f1SDimitry Andric 
5900b57cec5SDimitry Andric bool TargetTransformInfo::useColdCCForColdCall(Function &F) const {
5910b57cec5SDimitry Andric   return TTIImpl->useColdCCForColdCall(F);
5920b57cec5SDimitry Andric }
5930b57cec5SDimitry Andric 
594bdd1243dSDimitry Andric InstructionCost TargetTransformInfo::getScalarizationOverhead(
595bdd1243dSDimitry Andric     VectorType *Ty, const APInt &DemandedElts, bool Insert, bool Extract,
596bdd1243dSDimitry Andric     TTI::TargetCostKind CostKind) const {
597bdd1243dSDimitry Andric   return TTIImpl->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract,
598bdd1243dSDimitry Andric                                            CostKind);
5990b57cec5SDimitry Andric }
6000b57cec5SDimitry Andric 
601fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getOperandsScalarizationOverhead(
602bdd1243dSDimitry Andric     ArrayRef<const Value *> Args, ArrayRef<Type *> Tys,
603bdd1243dSDimitry Andric     TTI::TargetCostKind CostKind) const {
604bdd1243dSDimitry Andric   return TTIImpl->getOperandsScalarizationOverhead(Args, Tys, CostKind);
6050b57cec5SDimitry Andric }
6060b57cec5SDimitry Andric 
6070b57cec5SDimitry Andric bool TargetTransformInfo::supportsEfficientVectorElementLoadStore() const {
6080b57cec5SDimitry Andric   return TTIImpl->supportsEfficientVectorElementLoadStore();
6090b57cec5SDimitry Andric }
6100b57cec5SDimitry Andric 
61181ad6265SDimitry Andric bool TargetTransformInfo::supportsTailCalls() const {
61281ad6265SDimitry Andric   return TTIImpl->supportsTailCalls();
61381ad6265SDimitry Andric }
61481ad6265SDimitry Andric 
615bdd1243dSDimitry Andric bool TargetTransformInfo::supportsTailCallFor(const CallBase *CB) const {
616bdd1243dSDimitry Andric   return TTIImpl->supportsTailCallFor(CB);
617bdd1243dSDimitry Andric }
618bdd1243dSDimitry Andric 
6195ffd83dbSDimitry Andric bool TargetTransformInfo::enableAggressiveInterleaving(
6205ffd83dbSDimitry Andric     bool LoopHasReductions) const {
6210b57cec5SDimitry Andric   return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
6220b57cec5SDimitry Andric }
6230b57cec5SDimitry Andric 
6240b57cec5SDimitry Andric TargetTransformInfo::MemCmpExpansionOptions
6250b57cec5SDimitry Andric TargetTransformInfo::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
6260b57cec5SDimitry Andric   return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
6270b57cec5SDimitry Andric }
6280b57cec5SDimitry Andric 
629bdd1243dSDimitry Andric bool TargetTransformInfo::enableSelectOptimize() const {
630bdd1243dSDimitry Andric   return TTIImpl->enableSelectOptimize();
631bdd1243dSDimitry Andric }
632bdd1243dSDimitry Andric 
6337a6dacacSDimitry Andric bool TargetTransformInfo::shouldTreatInstructionLikeSelect(
6347a6dacacSDimitry Andric     const Instruction *I) const {
6357a6dacacSDimitry Andric   return TTIImpl->shouldTreatInstructionLikeSelect(I);
6367a6dacacSDimitry Andric }
6377a6dacacSDimitry Andric 
6380b57cec5SDimitry Andric bool TargetTransformInfo::enableInterleavedAccessVectorization() const {
6390b57cec5SDimitry Andric   return TTIImpl->enableInterleavedAccessVectorization();
6400b57cec5SDimitry Andric }
6410b57cec5SDimitry Andric 
6420b57cec5SDimitry Andric bool TargetTransformInfo::enableMaskedInterleavedAccessVectorization() const {
6430b57cec5SDimitry Andric   return TTIImpl->enableMaskedInterleavedAccessVectorization();
6440b57cec5SDimitry Andric }
6450b57cec5SDimitry Andric 
6460b57cec5SDimitry Andric bool TargetTransformInfo::isFPVectorizationPotentiallyUnsafe() const {
6470b57cec5SDimitry Andric   return TTIImpl->isFPVectorizationPotentiallyUnsafe();
6480b57cec5SDimitry Andric }
6490b57cec5SDimitry Andric 
650bdd1243dSDimitry Andric bool
651bdd1243dSDimitry Andric TargetTransformInfo::allowsMisalignedMemoryAccesses(LLVMContext &Context,
6520b57cec5SDimitry Andric                                                     unsigned BitWidth,
6530b57cec5SDimitry Andric                                                     unsigned AddressSpace,
654fe6060f1SDimitry Andric                                                     Align Alignment,
655bdd1243dSDimitry Andric                                                     unsigned *Fast) const {
6565ffd83dbSDimitry Andric   return TTIImpl->allowsMisalignedMemoryAccesses(Context, BitWidth,
6575ffd83dbSDimitry Andric                                                  AddressSpace, Alignment, Fast);
6580b57cec5SDimitry Andric }
6590b57cec5SDimitry Andric 
6600b57cec5SDimitry Andric TargetTransformInfo::PopcntSupportKind
6610b57cec5SDimitry Andric TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
6620b57cec5SDimitry Andric   return TTIImpl->getPopcntSupport(IntTyWidthInBit);
6630b57cec5SDimitry Andric }
6640b57cec5SDimitry Andric 
6650b57cec5SDimitry Andric bool TargetTransformInfo::haveFastSqrt(Type *Ty) const {
6660b57cec5SDimitry Andric   return TTIImpl->haveFastSqrt(Ty);
6670b57cec5SDimitry Andric }
6680b57cec5SDimitry Andric 
669bdd1243dSDimitry Andric bool TargetTransformInfo::isExpensiveToSpeculativelyExecute(
670bdd1243dSDimitry Andric     const Instruction *I) const {
671bdd1243dSDimitry Andric   return TTIImpl->isExpensiveToSpeculativelyExecute(I);
672bdd1243dSDimitry Andric }
673bdd1243dSDimitry Andric 
6740b57cec5SDimitry Andric bool TargetTransformInfo::isFCmpOrdCheaperThanFCmpZero(Type *Ty) const {
6750b57cec5SDimitry Andric   return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
6760b57cec5SDimitry Andric }
6770b57cec5SDimitry Andric 
678fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getFPOpCost(Type *Ty) const {
679fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getFPOpCost(Ty);
6800b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
6810b57cec5SDimitry Andric   return Cost;
6820b57cec5SDimitry Andric }
6830b57cec5SDimitry Andric 
684fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getIntImmCodeSizeCost(unsigned Opcode,
685fe6060f1SDimitry Andric                                                            unsigned Idx,
6860b57cec5SDimitry Andric                                                            const APInt &Imm,
6870b57cec5SDimitry Andric                                                            Type *Ty) const {
688fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getIntImmCodeSizeCost(Opcode, Idx, Imm, Ty);
6890b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
6900b57cec5SDimitry Andric   return Cost;
6910b57cec5SDimitry Andric }
6920b57cec5SDimitry Andric 
693fe6060f1SDimitry Andric InstructionCost
694fe6060f1SDimitry Andric TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty,
6955ffd83dbSDimitry Andric                                    TTI::TargetCostKind CostKind) const {
696fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getIntImmCost(Imm, Ty, CostKind);
6970b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
6980b57cec5SDimitry Andric   return Cost;
6990b57cec5SDimitry Andric }
7000b57cec5SDimitry Andric 
701fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getIntImmCostInst(
702fe6060f1SDimitry Andric     unsigned Opcode, unsigned Idx, const APInt &Imm, Type *Ty,
703fe6060f1SDimitry Andric     TTI::TargetCostKind CostKind, Instruction *Inst) const {
704fe6060f1SDimitry Andric   InstructionCost Cost =
705fe6060f1SDimitry Andric       TTIImpl->getIntImmCostInst(Opcode, Idx, Imm, Ty, CostKind, Inst);
7060b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
7070b57cec5SDimitry Andric   return Cost;
7080b57cec5SDimitry Andric }
7090b57cec5SDimitry Andric 
710fe6060f1SDimitry Andric InstructionCost
7115ffd83dbSDimitry Andric TargetTransformInfo::getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx,
7125ffd83dbSDimitry Andric                                          const APInt &Imm, Type *Ty,
7135ffd83dbSDimitry Andric                                          TTI::TargetCostKind CostKind) const {
714fe6060f1SDimitry Andric   InstructionCost Cost =
715fe6060f1SDimitry Andric       TTIImpl->getIntImmCostIntrin(IID, Idx, Imm, Ty, CostKind);
7160b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
7170b57cec5SDimitry Andric   return Cost;
7180b57cec5SDimitry Andric }
7190b57cec5SDimitry Andric 
7205f757f3fSDimitry Andric bool TargetTransformInfo::preferToKeepConstantsAttached(
7215f757f3fSDimitry Andric     const Instruction &Inst, const Function &Fn) const {
7225f757f3fSDimitry Andric   return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
7235f757f3fSDimitry Andric }
7245f757f3fSDimitry Andric 
7258bcb0991SDimitry Andric unsigned TargetTransformInfo::getNumberOfRegisters(unsigned ClassID) const {
7268bcb0991SDimitry Andric   return TTIImpl->getNumberOfRegisters(ClassID);
7278bcb0991SDimitry Andric }
7288bcb0991SDimitry Andric 
729*0fca6ea1SDimitry Andric bool TargetTransformInfo::hasConditionalLoadStoreForType(Type *Ty) const {
730*0fca6ea1SDimitry Andric   return TTIImpl->hasConditionalLoadStoreForType(Ty);
731*0fca6ea1SDimitry Andric }
732*0fca6ea1SDimitry Andric 
7335ffd83dbSDimitry Andric unsigned TargetTransformInfo::getRegisterClassForType(bool Vector,
7345ffd83dbSDimitry Andric                                                       Type *Ty) const {
7358bcb0991SDimitry Andric   return TTIImpl->getRegisterClassForType(Vector, Ty);
7368bcb0991SDimitry Andric }
7378bcb0991SDimitry Andric 
7388bcb0991SDimitry Andric const char *TargetTransformInfo::getRegisterClassName(unsigned ClassID) const {
7398bcb0991SDimitry Andric   return TTIImpl->getRegisterClassName(ClassID);
7400b57cec5SDimitry Andric }
7410b57cec5SDimitry Andric 
742fe6060f1SDimitry Andric TypeSize TargetTransformInfo::getRegisterBitWidth(
743fe6060f1SDimitry Andric     TargetTransformInfo::RegisterKind K) const {
744fe6060f1SDimitry Andric   return TTIImpl->getRegisterBitWidth(K);
7450b57cec5SDimitry Andric }
7460b57cec5SDimitry Andric 
7470b57cec5SDimitry Andric unsigned TargetTransformInfo::getMinVectorRegisterBitWidth() const {
7480b57cec5SDimitry Andric   return TTIImpl->getMinVectorRegisterBitWidth();
7490b57cec5SDimitry Andric }
7500b57cec5SDimitry Andric 
751bdd1243dSDimitry Andric std::optional<unsigned> TargetTransformInfo::getMaxVScale() const {
752e8d8bef9SDimitry Andric   return TTIImpl->getMaxVScale();
753e8d8bef9SDimitry Andric }
754e8d8bef9SDimitry Andric 
755bdd1243dSDimitry Andric std::optional<unsigned> TargetTransformInfo::getVScaleForTuning() const {
756349cc55cSDimitry Andric   return TTIImpl->getVScaleForTuning();
757349cc55cSDimitry Andric }
758349cc55cSDimitry Andric 
75906c3fb27SDimitry Andric bool TargetTransformInfo::isVScaleKnownToBeAPowerOfTwo() const {
76006c3fb27SDimitry Andric   return TTIImpl->isVScaleKnownToBeAPowerOfTwo();
76106c3fb27SDimitry Andric }
76206c3fb27SDimitry Andric 
76381ad6265SDimitry Andric bool TargetTransformInfo::shouldMaximizeVectorBandwidth(
76481ad6265SDimitry Andric     TargetTransformInfo::RegisterKind K) const {
76581ad6265SDimitry Andric   return TTIImpl->shouldMaximizeVectorBandwidth(K);
7660b57cec5SDimitry Andric }
7670b57cec5SDimitry Andric 
768fe6060f1SDimitry Andric ElementCount TargetTransformInfo::getMinimumVF(unsigned ElemWidth,
769fe6060f1SDimitry Andric                                                bool IsScalable) const {
770fe6060f1SDimitry Andric   return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
7710b57cec5SDimitry Andric }
7720b57cec5SDimitry Andric 
773e8d8bef9SDimitry Andric unsigned TargetTransformInfo::getMaximumVF(unsigned ElemWidth,
774e8d8bef9SDimitry Andric                                            unsigned Opcode) const {
775e8d8bef9SDimitry Andric   return TTIImpl->getMaximumVF(ElemWidth, Opcode);
776e8d8bef9SDimitry Andric }
777e8d8bef9SDimitry Andric 
77881ad6265SDimitry Andric unsigned TargetTransformInfo::getStoreMinimumVF(unsigned VF, Type *ScalarMemTy,
77981ad6265SDimitry Andric                                                 Type *ScalarValTy) const {
78081ad6265SDimitry Andric   return TTIImpl->getStoreMinimumVF(VF, ScalarMemTy, ScalarValTy);
78181ad6265SDimitry Andric }
78281ad6265SDimitry Andric 
7830b57cec5SDimitry Andric bool TargetTransformInfo::shouldConsiderAddressTypePromotion(
7840b57cec5SDimitry Andric     const Instruction &I, bool &AllowPromotionWithoutCommonHeader) const {
7850b57cec5SDimitry Andric   return TTIImpl->shouldConsiderAddressTypePromotion(
7860b57cec5SDimitry Andric       I, AllowPromotionWithoutCommonHeader);
7870b57cec5SDimitry Andric }
7880b57cec5SDimitry Andric 
7890b57cec5SDimitry Andric unsigned TargetTransformInfo::getCacheLineSize() const {
79081ad6265SDimitry Andric   return CacheLineSize.getNumOccurrences() > 0 ? CacheLineSize
79181ad6265SDimitry Andric                                                : TTIImpl->getCacheLineSize();
7920b57cec5SDimitry Andric }
7930b57cec5SDimitry Andric 
794bdd1243dSDimitry Andric std::optional<unsigned>
7955ffd83dbSDimitry Andric TargetTransformInfo::getCacheSize(CacheLevel Level) const {
7960b57cec5SDimitry Andric   return TTIImpl->getCacheSize(Level);
7970b57cec5SDimitry Andric }
7980b57cec5SDimitry Andric 
799bdd1243dSDimitry Andric std::optional<unsigned>
8005ffd83dbSDimitry Andric TargetTransformInfo::getCacheAssociativity(CacheLevel Level) const {
8010b57cec5SDimitry Andric   return TTIImpl->getCacheAssociativity(Level);
8020b57cec5SDimitry Andric }
8030b57cec5SDimitry Andric 
8041db9f3b2SDimitry Andric std::optional<unsigned> TargetTransformInfo::getMinPageSize() const {
8051db9f3b2SDimitry Andric   return MinPageSize.getNumOccurrences() > 0 ? MinPageSize
8061db9f3b2SDimitry Andric                                              : TTIImpl->getMinPageSize();
8071db9f3b2SDimitry Andric }
8081db9f3b2SDimitry Andric 
8090b57cec5SDimitry Andric unsigned TargetTransformInfo::getPrefetchDistance() const {
8100b57cec5SDimitry Andric   return TTIImpl->getPrefetchDistance();
8110b57cec5SDimitry Andric }
8120b57cec5SDimitry Andric 
8135ffd83dbSDimitry Andric unsigned TargetTransformInfo::getMinPrefetchStride(
8145ffd83dbSDimitry Andric     unsigned NumMemAccesses, unsigned NumStridedMemAccesses,
8155ffd83dbSDimitry Andric     unsigned NumPrefetches, bool HasCall) const {
8165ffd83dbSDimitry Andric   return TTIImpl->getMinPrefetchStride(NumMemAccesses, NumStridedMemAccesses,
8175ffd83dbSDimitry Andric                                        NumPrefetches, HasCall);
8180b57cec5SDimitry Andric }
8190b57cec5SDimitry Andric 
8200b57cec5SDimitry Andric unsigned TargetTransformInfo::getMaxPrefetchIterationsAhead() const {
8210b57cec5SDimitry Andric   return TTIImpl->getMaxPrefetchIterationsAhead();
8220b57cec5SDimitry Andric }
8230b57cec5SDimitry Andric 
8245ffd83dbSDimitry Andric bool TargetTransformInfo::enableWritePrefetching() const {
8255ffd83dbSDimitry Andric   return TTIImpl->enableWritePrefetching();
8265ffd83dbSDimitry Andric }
8275ffd83dbSDimitry Andric 
828bdd1243dSDimitry Andric bool TargetTransformInfo::shouldPrefetchAddressSpace(unsigned AS) const {
829bdd1243dSDimitry Andric   return TTIImpl->shouldPrefetchAddressSpace(AS);
830bdd1243dSDimitry Andric }
831bdd1243dSDimitry Andric 
83206c3fb27SDimitry Andric unsigned TargetTransformInfo::getMaxInterleaveFactor(ElementCount VF) const {
8330b57cec5SDimitry Andric   return TTIImpl->getMaxInterleaveFactor(VF);
8340b57cec5SDimitry Andric }
8350b57cec5SDimitry Andric 
836bdd1243dSDimitry Andric TargetTransformInfo::OperandValueInfo
837bdd1243dSDimitry Andric TargetTransformInfo::getOperandInfo(const Value *V) {
8380b57cec5SDimitry Andric   OperandValueKind OpInfo = OK_AnyValue;
839bdd1243dSDimitry Andric   OperandValueProperties OpProps = OP_None;
8400b57cec5SDimitry Andric 
841bdd1243dSDimitry Andric   if (isa<ConstantInt>(V) || isa<ConstantFP>(V)) {
8425ffd83dbSDimitry Andric     if (const auto *CI = dyn_cast<ConstantInt>(V)) {
8430b57cec5SDimitry Andric       if (CI->getValue().isPowerOf2())
8440b57cec5SDimitry Andric         OpProps = OP_PowerOf2;
845bdd1243dSDimitry Andric       else if (CI->getValue().isNegatedPowerOf2())
846bdd1243dSDimitry Andric         OpProps = OP_NegatedPowerOf2;
847bdd1243dSDimitry Andric     }
848bdd1243dSDimitry Andric     return {OK_UniformConstantValue, OpProps};
8490b57cec5SDimitry Andric   }
8500b57cec5SDimitry Andric 
8510b57cec5SDimitry Andric   // A broadcast shuffle creates a uniform value.
8520b57cec5SDimitry Andric   // TODO: Add support for non-zero index broadcasts.
8530b57cec5SDimitry Andric   // TODO: Add support for different source vector width.
8545ffd83dbSDimitry Andric   if (const auto *ShuffleInst = dyn_cast<ShuffleVectorInst>(V))
8550b57cec5SDimitry Andric     if (ShuffleInst->isZeroEltSplat())
8560b57cec5SDimitry Andric       OpInfo = OK_UniformValue;
8570b57cec5SDimitry Andric 
8580b57cec5SDimitry Andric   const Value *Splat = getSplatValue(V);
8590b57cec5SDimitry Andric 
8600b57cec5SDimitry Andric   // Check for a splat of a constant or for a non uniform vector of constants
8610b57cec5SDimitry Andric   // and check if the constant(s) are all powers of two.
8620b57cec5SDimitry Andric   if (isa<ConstantVector>(V) || isa<ConstantDataVector>(V)) {
8630b57cec5SDimitry Andric     OpInfo = OK_NonUniformConstantValue;
8640b57cec5SDimitry Andric     if (Splat) {
8650b57cec5SDimitry Andric       OpInfo = OK_UniformConstantValue;
866bdd1243dSDimitry Andric       if (auto *CI = dyn_cast<ConstantInt>(Splat)) {
8670b57cec5SDimitry Andric         if (CI->getValue().isPowerOf2())
8680b57cec5SDimitry Andric           OpProps = OP_PowerOf2;
869bdd1243dSDimitry Andric         else if (CI->getValue().isNegatedPowerOf2())
870bdd1243dSDimitry Andric           OpProps = OP_NegatedPowerOf2;
871bdd1243dSDimitry Andric       }
8725ffd83dbSDimitry Andric     } else if (const auto *CDS = dyn_cast<ConstantDataSequential>(V)) {
873bdd1243dSDimitry Andric       bool AllPow2 = true, AllNegPow2 = true;
8740b57cec5SDimitry Andric       for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) {
875bdd1243dSDimitry Andric         if (auto *CI = dyn_cast<ConstantInt>(CDS->getElementAsConstant(I))) {
876bdd1243dSDimitry Andric           AllPow2 &= CI->getValue().isPowerOf2();
877bdd1243dSDimitry Andric           AllNegPow2 &= CI->getValue().isNegatedPowerOf2();
878bdd1243dSDimitry Andric           if (AllPow2 || AllNegPow2)
8790b57cec5SDimitry Andric             continue;
880bdd1243dSDimitry Andric         }
881bdd1243dSDimitry Andric         AllPow2 = AllNegPow2 = false;
8820b57cec5SDimitry Andric         break;
8830b57cec5SDimitry Andric       }
884bdd1243dSDimitry Andric       OpProps = AllPow2 ? OP_PowerOf2 : OpProps;
885bdd1243dSDimitry Andric       OpProps = AllNegPow2 ? OP_NegatedPowerOf2 : OpProps;
8860b57cec5SDimitry Andric     }
8870b57cec5SDimitry Andric   }
8880b57cec5SDimitry Andric 
8890b57cec5SDimitry Andric   // Check for a splat of a uniform value. This is not loop aware, so return
8900b57cec5SDimitry Andric   // true only for the obviously uniform cases (argument, globalvalue)
8910b57cec5SDimitry Andric   if (Splat && (isa<Argument>(Splat) || isa<GlobalValue>(Splat)))
8920b57cec5SDimitry Andric     OpInfo = OK_UniformValue;
8930b57cec5SDimitry Andric 
894bdd1243dSDimitry Andric   return {OpInfo, OpProps};
8950b57cec5SDimitry Andric }
8960b57cec5SDimitry Andric 
897fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getArithmeticInstrCost(
8985ffd83dbSDimitry Andric     unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
899bdd1243dSDimitry Andric     OperandValueInfo Op1Info, OperandValueInfo Op2Info,
900*0fca6ea1SDimitry Andric     ArrayRef<const Value *> Args, const Instruction *CxtI,
901*0fca6ea1SDimitry Andric     const TargetLibraryInfo *TLibInfo) const {
902*0fca6ea1SDimitry Andric 
903*0fca6ea1SDimitry Andric   // Use call cost for frem intructions that have platform specific vector math
904*0fca6ea1SDimitry Andric   // functions, as those will be replaced with calls later by SelectionDAG or
905*0fca6ea1SDimitry Andric   // ReplaceWithVecLib pass.
906*0fca6ea1SDimitry Andric   if (TLibInfo && Opcode == Instruction::FRem) {
907*0fca6ea1SDimitry Andric     VectorType *VecTy = dyn_cast<VectorType>(Ty);
908*0fca6ea1SDimitry Andric     LibFunc Func;
909*0fca6ea1SDimitry Andric     if (VecTy &&
910*0fca6ea1SDimitry Andric         TLibInfo->getLibFunc(Instruction::FRem, Ty->getScalarType(), Func) &&
911*0fca6ea1SDimitry Andric         TLibInfo->isFunctionVectorizable(TLibInfo->getName(Func),
912*0fca6ea1SDimitry Andric                                          VecTy->getElementCount()))
913*0fca6ea1SDimitry Andric       return getCallInstrCost(nullptr, VecTy, {VecTy, VecTy}, CostKind);
914*0fca6ea1SDimitry Andric   }
915*0fca6ea1SDimitry Andric 
916fe6060f1SDimitry Andric   InstructionCost Cost =
917bdd1243dSDimitry Andric       TTIImpl->getArithmeticInstrCost(Opcode, Ty, CostKind,
918bdd1243dSDimitry Andric                                       Op1Info, Op2Info,
919bdd1243dSDimitry Andric                                       Args, CxtI);
9200b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
9210b57cec5SDimitry Andric   return Cost;
9220b57cec5SDimitry Andric }
9230b57cec5SDimitry Andric 
924647cbc5dSDimitry Andric InstructionCost TargetTransformInfo::getAltInstrCost(
925647cbc5dSDimitry Andric     VectorType *VecTy, unsigned Opcode0, unsigned Opcode1,
926647cbc5dSDimitry Andric     const SmallBitVector &OpcodeMask, TTI::TargetCostKind CostKind) const {
927647cbc5dSDimitry Andric   InstructionCost Cost =
928647cbc5dSDimitry Andric       TTIImpl->getAltInstrCost(VecTy, Opcode0, Opcode1, OpcodeMask, CostKind);
929647cbc5dSDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
930647cbc5dSDimitry Andric   return Cost;
931647cbc5dSDimitry Andric }
932647cbc5dSDimitry Andric 
93381ad6265SDimitry Andric InstructionCost TargetTransformInfo::getShuffleCost(
934bdd1243dSDimitry Andric     ShuffleKind Kind, VectorType *Ty, ArrayRef<int> Mask,
935bdd1243dSDimitry Andric     TTI::TargetCostKind CostKind, int Index, VectorType *SubTp,
936*0fca6ea1SDimitry Andric     ArrayRef<const Value *> Args, const Instruction *CxtI) const {
937*0fca6ea1SDimitry Andric   InstructionCost Cost = TTIImpl->getShuffleCost(Kind, Ty, Mask, CostKind,
938*0fca6ea1SDimitry Andric                                                  Index, SubTp, Args, CxtI);
9390b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
9400b57cec5SDimitry Andric   return Cost;
9410b57cec5SDimitry Andric }
9420b57cec5SDimitry Andric 
943e8d8bef9SDimitry Andric TTI::CastContextHint
944e8d8bef9SDimitry Andric TargetTransformInfo::getCastContextHint(const Instruction *I) {
945e8d8bef9SDimitry Andric   if (!I)
946e8d8bef9SDimitry Andric     return CastContextHint::None;
947e8d8bef9SDimitry Andric 
948e8d8bef9SDimitry Andric   auto getLoadStoreKind = [](const Value *V, unsigned LdStOp, unsigned MaskedOp,
949e8d8bef9SDimitry Andric                              unsigned GatScatOp) {
950e8d8bef9SDimitry Andric     const Instruction *I = dyn_cast<Instruction>(V);
951e8d8bef9SDimitry Andric     if (!I)
952e8d8bef9SDimitry Andric       return CastContextHint::None;
953e8d8bef9SDimitry Andric 
954e8d8bef9SDimitry Andric     if (I->getOpcode() == LdStOp)
955e8d8bef9SDimitry Andric       return CastContextHint::Normal;
956e8d8bef9SDimitry Andric 
957e8d8bef9SDimitry Andric     if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
958e8d8bef9SDimitry Andric       if (II->getIntrinsicID() == MaskedOp)
959e8d8bef9SDimitry Andric         return TTI::CastContextHint::Masked;
960e8d8bef9SDimitry Andric       if (II->getIntrinsicID() == GatScatOp)
961e8d8bef9SDimitry Andric         return TTI::CastContextHint::GatherScatter;
962e8d8bef9SDimitry Andric     }
963e8d8bef9SDimitry Andric 
964e8d8bef9SDimitry Andric     return TTI::CastContextHint::None;
965e8d8bef9SDimitry Andric   };
966e8d8bef9SDimitry Andric 
967e8d8bef9SDimitry Andric   switch (I->getOpcode()) {
968e8d8bef9SDimitry Andric   case Instruction::ZExt:
969e8d8bef9SDimitry Andric   case Instruction::SExt:
970e8d8bef9SDimitry Andric   case Instruction::FPExt:
971e8d8bef9SDimitry Andric     return getLoadStoreKind(I->getOperand(0), Instruction::Load,
972e8d8bef9SDimitry Andric                             Intrinsic::masked_load, Intrinsic::masked_gather);
973e8d8bef9SDimitry Andric   case Instruction::Trunc:
974e8d8bef9SDimitry Andric   case Instruction::FPTrunc:
975e8d8bef9SDimitry Andric     if (I->hasOneUse())
976e8d8bef9SDimitry Andric       return getLoadStoreKind(*I->user_begin(), Instruction::Store,
977e8d8bef9SDimitry Andric                               Intrinsic::masked_store,
978e8d8bef9SDimitry Andric                               Intrinsic::masked_scatter);
979e8d8bef9SDimitry Andric     break;
980e8d8bef9SDimitry Andric   default:
981e8d8bef9SDimitry Andric     return CastContextHint::None;
982e8d8bef9SDimitry Andric   }
983e8d8bef9SDimitry Andric 
984e8d8bef9SDimitry Andric   return TTI::CastContextHint::None;
985e8d8bef9SDimitry Andric }
986e8d8bef9SDimitry Andric 
987fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getCastInstrCost(
988fe6060f1SDimitry Andric     unsigned Opcode, Type *Dst, Type *Src, CastContextHint CCH,
989fe6060f1SDimitry Andric     TTI::TargetCostKind CostKind, const Instruction *I) const {
9900b57cec5SDimitry Andric   assert((I == nullptr || I->getOpcode() == Opcode) &&
9910b57cec5SDimitry Andric          "Opcode should reflect passed instruction.");
992fe6060f1SDimitry Andric   InstructionCost Cost =
993fe6060f1SDimitry Andric       TTIImpl->getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I);
9940b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
9950b57cec5SDimitry Andric   return Cost;
9960b57cec5SDimitry Andric }
9970b57cec5SDimitry Andric 
998fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getExtractWithExtendCost(
999fe6060f1SDimitry Andric     unsigned Opcode, Type *Dst, VectorType *VecTy, unsigned Index) const {
1000fe6060f1SDimitry Andric   InstructionCost Cost =
1001fe6060f1SDimitry Andric       TTIImpl->getExtractWithExtendCost(Opcode, Dst, VecTy, Index);
10020b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10030b57cec5SDimitry Andric   return Cost;
10040b57cec5SDimitry Andric }
10050b57cec5SDimitry Andric 
1006fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getCFInstrCost(
1007fe6060f1SDimitry Andric     unsigned Opcode, TTI::TargetCostKind CostKind, const Instruction *I) const {
10080b57cec5SDimitry Andric   assert((I == nullptr || I->getOpcode() == Opcode) &&
10090b57cec5SDimitry Andric          "Opcode should reflect passed instruction.");
1010fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getCFInstrCost(Opcode, CostKind, I);
1011fe6060f1SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
1012fe6060f1SDimitry Andric   return Cost;
1013fe6060f1SDimitry Andric }
1014fe6060f1SDimitry Andric 
1015fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getCmpSelInstrCost(
1016fe6060f1SDimitry Andric     unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
1017fe6060f1SDimitry Andric     TTI::TargetCostKind CostKind, const Instruction *I) const {
1018fe6060f1SDimitry Andric   assert((I == nullptr || I->getOpcode() == Opcode) &&
1019fe6060f1SDimitry Andric          "Opcode should reflect passed instruction.");
1020fe6060f1SDimitry Andric   InstructionCost Cost =
1021e8d8bef9SDimitry Andric       TTIImpl->getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, I);
10220b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10230b57cec5SDimitry Andric   return Cost;
10240b57cec5SDimitry Andric }
10250b57cec5SDimitry Andric 
1026bdd1243dSDimitry Andric InstructionCost TargetTransformInfo::getVectorInstrCost(
1027bdd1243dSDimitry Andric     unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index,
1028bdd1243dSDimitry Andric     Value *Op0, Value *Op1) const {
1029bdd1243dSDimitry Andric   // FIXME: Assert that Opcode is either InsertElement or ExtractElement.
1030bdd1243dSDimitry Andric   // This is mentioned in the interface description and respected by all
1031bdd1243dSDimitry Andric   // callers, but never asserted upon.
1032bdd1243dSDimitry Andric   InstructionCost Cost =
1033bdd1243dSDimitry Andric       TTIImpl->getVectorInstrCost(Opcode, Val, CostKind, Index, Op0, Op1);
1034bdd1243dSDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
1035bdd1243dSDimitry Andric   return Cost;
1036bdd1243dSDimitry Andric }
1037bdd1243dSDimitry Andric 
1038bdd1243dSDimitry Andric InstructionCost
1039bdd1243dSDimitry Andric TargetTransformInfo::getVectorInstrCost(const Instruction &I, Type *Val,
1040bdd1243dSDimitry Andric                                         TTI::TargetCostKind CostKind,
10410b57cec5SDimitry Andric                                         unsigned Index) const {
1042bdd1243dSDimitry Andric   // FIXME: Assert that Opcode is either InsertElement or ExtractElement.
1043bdd1243dSDimitry Andric   // This is mentioned in the interface description and respected by all
1044bdd1243dSDimitry Andric   // callers, but never asserted upon.
1045bdd1243dSDimitry Andric   InstructionCost Cost = TTIImpl->getVectorInstrCost(I, Val, CostKind, Index);
10460b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10470b57cec5SDimitry Andric   return Cost;
10480b57cec5SDimitry Andric }
10490b57cec5SDimitry Andric 
1050349cc55cSDimitry Andric InstructionCost TargetTransformInfo::getReplicationShuffleCost(
1051349cc55cSDimitry Andric     Type *EltTy, int ReplicationFactor, int VF, const APInt &DemandedDstElts,
1052*0fca6ea1SDimitry Andric     TTI::TargetCostKind CostKind) const {
1053349cc55cSDimitry Andric   InstructionCost Cost = TTIImpl->getReplicationShuffleCost(
1054349cc55cSDimitry Andric       EltTy, ReplicationFactor, VF, DemandedDstElts, CostKind);
1055349cc55cSDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
1056349cc55cSDimitry Andric   return Cost;
1057349cc55cSDimitry Andric }
1058349cc55cSDimitry Andric 
1059fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getMemoryOpCost(
1060fe6060f1SDimitry Andric     unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
1061bdd1243dSDimitry Andric     TTI::TargetCostKind CostKind, TTI::OperandValueInfo OpInfo,
1062bdd1243dSDimitry Andric     const Instruction *I) const {
10630b57cec5SDimitry Andric   assert((I == nullptr || I->getOpcode() == Opcode) &&
10640b57cec5SDimitry Andric          "Opcode should reflect passed instruction.");
1065bdd1243dSDimitry Andric   InstructionCost Cost = TTIImpl->getMemoryOpCost(
1066bdd1243dSDimitry Andric       Opcode, Src, Alignment, AddressSpace, CostKind, OpInfo, I);
10670b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10680b57cec5SDimitry Andric   return Cost;
10690b57cec5SDimitry Andric }
10700b57cec5SDimitry Andric 
1071fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getMaskedMemoryOpCost(
10725ffd83dbSDimitry Andric     unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace,
10735ffd83dbSDimitry Andric     TTI::TargetCostKind CostKind) const {
1074fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getMaskedMemoryOpCost(Opcode, Src, Alignment,
1075fe6060f1SDimitry Andric                                                         AddressSpace, CostKind);
10760b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10770b57cec5SDimitry Andric   return Cost;
10780b57cec5SDimitry Andric }
10790b57cec5SDimitry Andric 
1080fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getGatherScatterOpCost(
10815ffd83dbSDimitry Andric     unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask,
10825ffd83dbSDimitry Andric     Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) const {
1083fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getGatherScatterOpCost(
1084fe6060f1SDimitry Andric       Opcode, DataTy, Ptr, VariableMask, Alignment, CostKind, I);
1085*0fca6ea1SDimitry Andric   assert((!Cost.isValid() || Cost >= 0) &&
1086*0fca6ea1SDimitry Andric          "TTI should not produce negative costs!");
1087*0fca6ea1SDimitry Andric   return Cost;
1088*0fca6ea1SDimitry Andric }
1089*0fca6ea1SDimitry Andric 
1090*0fca6ea1SDimitry Andric InstructionCost TargetTransformInfo::getStridedMemoryOpCost(
1091*0fca6ea1SDimitry Andric     unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask,
1092*0fca6ea1SDimitry Andric     Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) const {
1093*0fca6ea1SDimitry Andric   InstructionCost Cost = TTIImpl->getStridedMemoryOpCost(
1094*0fca6ea1SDimitry Andric       Opcode, DataTy, Ptr, VariableMask, Alignment, CostKind, I);
10950b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
10960b57cec5SDimitry Andric   return Cost;
10970b57cec5SDimitry Andric }
10980b57cec5SDimitry Andric 
1099fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getInterleavedMemoryOpCost(
11000b57cec5SDimitry Andric     unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
11015ffd83dbSDimitry Andric     Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
11025ffd83dbSDimitry Andric     bool UseMaskForCond, bool UseMaskForGaps) const {
1103fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getInterleavedMemoryOpCost(
11045ffd83dbSDimitry Andric       Opcode, VecTy, Factor, Indices, Alignment, AddressSpace, CostKind,
11055ffd83dbSDimitry Andric       UseMaskForCond, UseMaskForGaps);
11060b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11070b57cec5SDimitry Andric   return Cost;
11080b57cec5SDimitry Andric }
11090b57cec5SDimitry Andric 
1110fe6060f1SDimitry Andric InstructionCost
11115ffd83dbSDimitry Andric TargetTransformInfo::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
11125ffd83dbSDimitry Andric                                            TTI::TargetCostKind CostKind) const {
1113fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getIntrinsicInstrCost(ICA, CostKind);
11140b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11150b57cec5SDimitry Andric   return Cost;
11160b57cec5SDimitry Andric }
11170b57cec5SDimitry Andric 
1118fe6060f1SDimitry Andric InstructionCost
1119fe6060f1SDimitry Andric TargetTransformInfo::getCallInstrCost(Function *F, Type *RetTy,
11205ffd83dbSDimitry Andric                                       ArrayRef<Type *> Tys,
11215ffd83dbSDimitry Andric                                       TTI::TargetCostKind CostKind) const {
1122fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getCallInstrCost(F, RetTy, Tys, CostKind);
11230b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11240b57cec5SDimitry Andric   return Cost;
11250b57cec5SDimitry Andric }
11260b57cec5SDimitry Andric 
11270b57cec5SDimitry Andric unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {
11280b57cec5SDimitry Andric   return TTIImpl->getNumberOfParts(Tp);
11290b57cec5SDimitry Andric }
11300b57cec5SDimitry Andric 
1131fe6060f1SDimitry Andric InstructionCost
1132fe6060f1SDimitry Andric TargetTransformInfo::getAddressComputationCost(Type *Tp, ScalarEvolution *SE,
11330b57cec5SDimitry Andric                                                const SCEV *Ptr) const {
1134fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getAddressComputationCost(Tp, SE, Ptr);
11350b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11360b57cec5SDimitry Andric   return Cost;
11370b57cec5SDimitry Andric }
11380b57cec5SDimitry Andric 
1139fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getMemcpyCost(const Instruction *I) const {
1140fe6060f1SDimitry Andric   InstructionCost Cost = TTIImpl->getMemcpyCost(I);
11410b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11420b57cec5SDimitry Andric   return Cost;
11430b57cec5SDimitry Andric }
11440b57cec5SDimitry Andric 
114506c3fb27SDimitry Andric uint64_t TargetTransformInfo::getMaxMemIntrinsicInlineSizeThreshold() const {
114606c3fb27SDimitry Andric   return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
114706c3fb27SDimitry Andric }
114806c3fb27SDimitry Andric 
1149fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getArithmeticReductionCost(
1150bdd1243dSDimitry Andric     unsigned Opcode, VectorType *Ty, std::optional<FastMathFlags> FMF,
11515ffd83dbSDimitry Andric     TTI::TargetCostKind CostKind) const {
1152fe6060f1SDimitry Andric   InstructionCost Cost =
1153fe6060f1SDimitry Andric       TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF, CostKind);
11540b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11550b57cec5SDimitry Andric   return Cost;
11560b57cec5SDimitry Andric }
11570b57cec5SDimitry Andric 
1158fe6060f1SDimitry Andric InstructionCost TargetTransformInfo::getMinMaxReductionCost(
115906c3fb27SDimitry Andric     Intrinsic::ID IID, VectorType *Ty, FastMathFlags FMF,
11605ffd83dbSDimitry Andric     TTI::TargetCostKind CostKind) const {
1161fe6060f1SDimitry Andric   InstructionCost Cost =
116206c3fb27SDimitry Andric       TTIImpl->getMinMaxReductionCost(IID, Ty, FMF, CostKind);
11630b57cec5SDimitry Andric   assert(Cost >= 0 && "TTI should not produce negative costs!");
11640b57cec5SDimitry Andric   return Cost;
11650b57cec5SDimitry Andric }
11660b57cec5SDimitry Andric 
1167bdd1243dSDimitry Andric InstructionCost TargetTransformInfo::getExtendedReductionCost(
1168bdd1243dSDimitry Andric     unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty,
116906c3fb27SDimitry Andric     FastMathFlags FMF, TTI::TargetCostKind CostKind) const {
1170bdd1243dSDimitry Andric   return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF,
1171e8d8bef9SDimitry Andric                                            CostKind);
1172e8d8bef9SDimitry Andric }
1173e8d8bef9SDimitry Andric 
1174bdd1243dSDimitry Andric InstructionCost TargetTransformInfo::getMulAccReductionCost(
1175bdd1243dSDimitry Andric     bool IsUnsigned, Type *ResTy, VectorType *Ty,
1176bdd1243dSDimitry Andric     TTI::TargetCostKind CostKind) const {
1177bdd1243dSDimitry Andric   return TTIImpl->getMulAccReductionCost(IsUnsigned, ResTy, Ty, CostKind);
1178bdd1243dSDimitry Andric }
1179bdd1243dSDimitry Andric 
1180fe6060f1SDimitry Andric InstructionCost
11810b57cec5SDimitry Andric TargetTransformInfo::getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys) const {
11820b57cec5SDimitry Andric   return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
11830b57cec5SDimitry Andric }
11840b57cec5SDimitry Andric 
11850b57cec5SDimitry Andric bool TargetTransformInfo::getTgtMemIntrinsic(IntrinsicInst *Inst,
11860b57cec5SDimitry Andric                                              MemIntrinsicInfo &Info) const {
11870b57cec5SDimitry Andric   return TTIImpl->getTgtMemIntrinsic(Inst, Info);
11880b57cec5SDimitry Andric }
11890b57cec5SDimitry Andric 
11900b57cec5SDimitry Andric unsigned TargetTransformInfo::getAtomicMemIntrinsicMaxElementSize() const {
11910b57cec5SDimitry Andric   return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
11920b57cec5SDimitry Andric }
11930b57cec5SDimitry Andric 
11940b57cec5SDimitry Andric Value *TargetTransformInfo::getOrCreateResultFromMemIntrinsic(
11950b57cec5SDimitry Andric     IntrinsicInst *Inst, Type *ExpectedType) const {
11960b57cec5SDimitry Andric   return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
11970b57cec5SDimitry Andric }
11980b57cec5SDimitry Andric 
11995ffd83dbSDimitry Andric Type *TargetTransformInfo::getMemcpyLoopLoweringType(
12005ffd83dbSDimitry Andric     LLVMContext &Context, Value *Length, unsigned SrcAddrSpace,
120181ad6265SDimitry Andric     unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign,
1202bdd1243dSDimitry Andric     std::optional<uint32_t> AtomicElementSize) const {
12035ffd83dbSDimitry Andric   return TTIImpl->getMemcpyLoopLoweringType(Context, Length, SrcAddrSpace,
120481ad6265SDimitry Andric                                             DestAddrSpace, SrcAlign, DestAlign,
120581ad6265SDimitry Andric                                             AtomicElementSize);
12060b57cec5SDimitry Andric }
12070b57cec5SDimitry Andric 
12080b57cec5SDimitry Andric void TargetTransformInfo::getMemcpyLoopResidualLoweringType(
12090b57cec5SDimitry Andric     SmallVectorImpl<Type *> &OpsOut, LLVMContext &Context,
12105ffd83dbSDimitry Andric     unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace,
121181ad6265SDimitry Andric     unsigned SrcAlign, unsigned DestAlign,
1212bdd1243dSDimitry Andric     std::optional<uint32_t> AtomicCpySize) const {
121381ad6265SDimitry Andric   TTIImpl->getMemcpyLoopResidualLoweringType(
121481ad6265SDimitry Andric       OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign,
121581ad6265SDimitry Andric       DestAlign, AtomicCpySize);
12160b57cec5SDimitry Andric }
12170b57cec5SDimitry Andric 
12180b57cec5SDimitry Andric bool TargetTransformInfo::areInlineCompatible(const Function *Caller,
12190b57cec5SDimitry Andric                                               const Function *Callee) const {
12200b57cec5SDimitry Andric   return TTIImpl->areInlineCompatible(Caller, Callee);
12210b57cec5SDimitry Andric }
12220b57cec5SDimitry Andric 
12235f757f3fSDimitry Andric unsigned
12245f757f3fSDimitry Andric TargetTransformInfo::getInlineCallPenalty(const Function *F,
12255f757f3fSDimitry Andric                                           const CallBase &Call,
12265f757f3fSDimitry Andric                                           unsigned DefaultCallPenalty) const {
12275f757f3fSDimitry Andric   return TTIImpl->getInlineCallPenalty(F, Call, DefaultCallPenalty);
12285f757f3fSDimitry Andric }
12295f757f3fSDimitry Andric 
12300eae32dcSDimitry Andric bool TargetTransformInfo::areTypesABICompatible(
12310b57cec5SDimitry Andric     const Function *Caller, const Function *Callee,
12320eae32dcSDimitry Andric     const ArrayRef<Type *> &Types) const {
12330eae32dcSDimitry Andric   return TTIImpl->areTypesABICompatible(Caller, Callee, Types);
12340b57cec5SDimitry Andric }
12350b57cec5SDimitry Andric 
12360b57cec5SDimitry Andric bool TargetTransformInfo::isIndexedLoadLegal(MemIndexedMode Mode,
12370b57cec5SDimitry Andric                                              Type *Ty) const {
12380b57cec5SDimitry Andric   return TTIImpl->isIndexedLoadLegal(Mode, Ty);
12390b57cec5SDimitry Andric }
12400b57cec5SDimitry Andric 
12410b57cec5SDimitry Andric bool TargetTransformInfo::isIndexedStoreLegal(MemIndexedMode Mode,
12420b57cec5SDimitry Andric                                               Type *Ty) const {
12430b57cec5SDimitry Andric   return TTIImpl->isIndexedStoreLegal(Mode, Ty);
12440b57cec5SDimitry Andric }
12450b57cec5SDimitry Andric 
12460b57cec5SDimitry Andric unsigned TargetTransformInfo::getLoadStoreVecRegBitWidth(unsigned AS) const {
12470b57cec5SDimitry Andric   return TTIImpl->getLoadStoreVecRegBitWidth(AS);
12480b57cec5SDimitry Andric }
12490b57cec5SDimitry Andric 
12500b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeLoad(LoadInst *LI) const {
12510b57cec5SDimitry Andric   return TTIImpl->isLegalToVectorizeLoad(LI);
12520b57cec5SDimitry Andric }
12530b57cec5SDimitry Andric 
12540b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeStore(StoreInst *SI) const {
12550b57cec5SDimitry Andric   return TTIImpl->isLegalToVectorizeStore(SI);
12560b57cec5SDimitry Andric }
12570b57cec5SDimitry Andric 
12580b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeLoadChain(
12595ffd83dbSDimitry Andric     unsigned ChainSizeInBytes, Align Alignment, unsigned AddrSpace) const {
12600b57cec5SDimitry Andric   return TTIImpl->isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment,
12610b57cec5SDimitry Andric                                               AddrSpace);
12620b57cec5SDimitry Andric }
12630b57cec5SDimitry Andric 
12640b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeStoreChain(
12655ffd83dbSDimitry Andric     unsigned ChainSizeInBytes, Align Alignment, unsigned AddrSpace) const {
12660b57cec5SDimitry Andric   return TTIImpl->isLegalToVectorizeStoreChain(ChainSizeInBytes, Alignment,
12670b57cec5SDimitry Andric                                                AddrSpace);
12680b57cec5SDimitry Andric }
12690b57cec5SDimitry Andric 
1270fe6060f1SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeReduction(
1271fe6060f1SDimitry Andric     const RecurrenceDescriptor &RdxDesc, ElementCount VF) const {
1272fe6060f1SDimitry Andric   return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1273fe6060f1SDimitry Andric }
1274fe6060f1SDimitry Andric 
1275fe6060f1SDimitry Andric bool TargetTransformInfo::isElementTypeLegalForScalableVector(Type *Ty) const {
1276fe6060f1SDimitry Andric   return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1277fe6060f1SDimitry Andric }
1278fe6060f1SDimitry Andric 
12790b57cec5SDimitry Andric unsigned TargetTransformInfo::getLoadVectorFactor(unsigned VF,
12800b57cec5SDimitry Andric                                                   unsigned LoadSize,
12810b57cec5SDimitry Andric                                                   unsigned ChainSizeInBytes,
12820b57cec5SDimitry Andric                                                   VectorType *VecTy) const {
12830b57cec5SDimitry Andric   return TTIImpl->getLoadVectorFactor(VF, LoadSize, ChainSizeInBytes, VecTy);
12840b57cec5SDimitry Andric }
12850b57cec5SDimitry Andric 
12860b57cec5SDimitry Andric unsigned TargetTransformInfo::getStoreVectorFactor(unsigned VF,
12870b57cec5SDimitry Andric                                                    unsigned StoreSize,
12880b57cec5SDimitry Andric                                                    unsigned ChainSizeInBytes,
12890b57cec5SDimitry Andric                                                    VectorType *VecTy) const {
12900b57cec5SDimitry Andric   return TTIImpl->getStoreVectorFactor(VF, StoreSize, ChainSizeInBytes, VecTy);
12910b57cec5SDimitry Andric }
12920b57cec5SDimitry Andric 
1293*0fca6ea1SDimitry Andric bool TargetTransformInfo::preferFixedOverScalableIfEqualCost() const {
1294*0fca6ea1SDimitry Andric   return TTIImpl->preferFixedOverScalableIfEqualCost();
1295*0fca6ea1SDimitry Andric }
1296*0fca6ea1SDimitry Andric 
1297e8d8bef9SDimitry Andric bool TargetTransformInfo::preferInLoopReduction(unsigned Opcode, Type *Ty,
1298e8d8bef9SDimitry Andric                                                 ReductionFlags Flags) const {
1299e8d8bef9SDimitry Andric   return TTIImpl->preferInLoopReduction(Opcode, Ty, Flags);
1300e8d8bef9SDimitry Andric }
1301e8d8bef9SDimitry Andric 
1302e8d8bef9SDimitry Andric bool TargetTransformInfo::preferPredicatedReductionSelect(
1303e8d8bef9SDimitry Andric     unsigned Opcode, Type *Ty, ReductionFlags Flags) const {
1304e8d8bef9SDimitry Andric   return TTIImpl->preferPredicatedReductionSelect(Opcode, Ty, Flags);
1305e8d8bef9SDimitry Andric }
1306e8d8bef9SDimitry Andric 
1307bdd1243dSDimitry Andric bool TargetTransformInfo::preferEpilogueVectorization() const {
1308bdd1243dSDimitry Andric   return TTIImpl->preferEpilogueVectorization();
1309bdd1243dSDimitry Andric }
1310bdd1243dSDimitry Andric 
1311fe6060f1SDimitry Andric TargetTransformInfo::VPLegalization
1312fe6060f1SDimitry Andric TargetTransformInfo::getVPLegalizationStrategy(const VPIntrinsic &VPI) const {
1313fe6060f1SDimitry Andric   return TTIImpl->getVPLegalizationStrategy(VPI);
1314fe6060f1SDimitry Andric }
1315fe6060f1SDimitry Andric 
131606c3fb27SDimitry Andric bool TargetTransformInfo::hasArmWideBranch(bool Thumb) const {
131706c3fb27SDimitry Andric   return TTIImpl->hasArmWideBranch(Thumb);
131806c3fb27SDimitry Andric }
131906c3fb27SDimitry Andric 
132006c3fb27SDimitry Andric unsigned TargetTransformInfo::getMaxNumArgs() const {
132106c3fb27SDimitry Andric   return TTIImpl->getMaxNumArgs();
132206c3fb27SDimitry Andric }
132306c3fb27SDimitry Andric 
13240b57cec5SDimitry Andric bool TargetTransformInfo::shouldExpandReduction(const IntrinsicInst *II) const {
13250b57cec5SDimitry Andric   return TTIImpl->shouldExpandReduction(II);
13260b57cec5SDimitry Andric }
13270b57cec5SDimitry Andric 
1328*0fca6ea1SDimitry Andric TargetTransformInfo::ReductionShuffle
1329*0fca6ea1SDimitry Andric TargetTransformInfo::getPreferredExpandedReductionShuffle(
1330*0fca6ea1SDimitry Andric     const IntrinsicInst *II) const {
1331*0fca6ea1SDimitry Andric   return TTIImpl->getPreferredExpandedReductionShuffle(II);
1332*0fca6ea1SDimitry Andric }
1333*0fca6ea1SDimitry Andric 
13340b57cec5SDimitry Andric unsigned TargetTransformInfo::getGISelRematGlobalCost() const {
13350b57cec5SDimitry Andric   return TTIImpl->getGISelRematGlobalCost();
13360b57cec5SDimitry Andric }
13370b57cec5SDimitry Andric 
133861cfbce3SDimitry Andric unsigned TargetTransformInfo::getMinTripCountTailFoldingThreshold() const {
133961cfbce3SDimitry Andric   return TTIImpl->getMinTripCountTailFoldingThreshold();
134061cfbce3SDimitry Andric }
134161cfbce3SDimitry Andric 
1342e8d8bef9SDimitry Andric bool TargetTransformInfo::supportsScalableVectors() const {
1343e8d8bef9SDimitry Andric   return TTIImpl->supportsScalableVectors();
1344e8d8bef9SDimitry Andric }
1345e8d8bef9SDimitry Andric 
13460eae32dcSDimitry Andric bool TargetTransformInfo::enableScalableVectorization() const {
13470eae32dcSDimitry Andric   return TTIImpl->enableScalableVectorization();
13480eae32dcSDimitry Andric }
13490eae32dcSDimitry Andric 
13500eae32dcSDimitry Andric bool TargetTransformInfo::hasActiveVectorLength(unsigned Opcode, Type *DataType,
13510eae32dcSDimitry Andric                                                 Align Alignment) const {
13520eae32dcSDimitry Andric   return TTIImpl->hasActiveVectorLength(Opcode, DataType, Alignment);
1353fe6060f1SDimitry Andric }
1354fe6060f1SDimitry Andric 
135581ad6265SDimitry Andric TargetTransformInfo::Concept::~Concept() = default;
13560b57cec5SDimitry Andric 
13570b57cec5SDimitry Andric TargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {}
13580b57cec5SDimitry Andric 
13590b57cec5SDimitry Andric TargetIRAnalysis::TargetIRAnalysis(
13600b57cec5SDimitry Andric     std::function<Result(const Function &)> TTICallback)
13610b57cec5SDimitry Andric     : TTICallback(std::move(TTICallback)) {}
13620b57cec5SDimitry Andric 
13630b57cec5SDimitry Andric TargetIRAnalysis::Result TargetIRAnalysis::run(const Function &F,
13640b57cec5SDimitry Andric                                                FunctionAnalysisManager &) {
13650b57cec5SDimitry Andric   return TTICallback(F);
13660b57cec5SDimitry Andric }
13670b57cec5SDimitry Andric 
13680b57cec5SDimitry Andric AnalysisKey TargetIRAnalysis::Key;
13690b57cec5SDimitry Andric 
13700b57cec5SDimitry Andric TargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) {
1371*0fca6ea1SDimitry Andric   return Result(F.getDataLayout());
13720b57cec5SDimitry Andric }
13730b57cec5SDimitry Andric 
13740b57cec5SDimitry Andric // Register the basic pass.
13750b57cec5SDimitry Andric INITIALIZE_PASS(TargetTransformInfoWrapperPass, "tti",
13760b57cec5SDimitry Andric                 "Target Transform Information", false, true)
13770b57cec5SDimitry Andric char TargetTransformInfoWrapperPass::ID = 0;
13780b57cec5SDimitry Andric 
13790b57cec5SDimitry Andric void TargetTransformInfoWrapperPass::anchor() {}
13800b57cec5SDimitry Andric 
13810b57cec5SDimitry Andric TargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass()
13820b57cec5SDimitry Andric     : ImmutablePass(ID) {
13830b57cec5SDimitry Andric   initializeTargetTransformInfoWrapperPassPass(
13840b57cec5SDimitry Andric       *PassRegistry::getPassRegistry());
13850b57cec5SDimitry Andric }
13860b57cec5SDimitry Andric 
13870b57cec5SDimitry Andric TargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass(
13880b57cec5SDimitry Andric     TargetIRAnalysis TIRA)
13890b57cec5SDimitry Andric     : ImmutablePass(ID), TIRA(std::move(TIRA)) {
13900b57cec5SDimitry Andric   initializeTargetTransformInfoWrapperPassPass(
13910b57cec5SDimitry Andric       *PassRegistry::getPassRegistry());
13920b57cec5SDimitry Andric }
13930b57cec5SDimitry Andric 
13940b57cec5SDimitry Andric TargetTransformInfo &TargetTransformInfoWrapperPass::getTTI(const Function &F) {
13950b57cec5SDimitry Andric   FunctionAnalysisManager DummyFAM;
13960b57cec5SDimitry Andric   TTI = TIRA.run(F, DummyFAM);
13970b57cec5SDimitry Andric   return *TTI;
13980b57cec5SDimitry Andric }
13990b57cec5SDimitry Andric 
14000b57cec5SDimitry Andric ImmutablePass *
14010b57cec5SDimitry Andric llvm::createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA) {
14020b57cec5SDimitry Andric   return new TargetTransformInfoWrapperPass(std::move(TIRA));
14030b57cec5SDimitry Andric }
1404