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