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> {
NoTTIImpl__anonf4b1d5920111::NoTTIImpl560b57cec5SDimitry Andric explicit NoTTIImpl(const DataLayout &DL)
570b57cec5SDimitry Andric : TargetTransformInfoImplCRTPBase<NoTTIImpl>(DL) {}
580b57cec5SDimitry Andric };
595ffd83dbSDimitry Andric } // namespace
600b57cec5SDimitry Andric
canAnalyze(LoopInfo & LI)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
IntrinsicCostAttributes(Intrinsic::ID Id,const CallBase & CI,InstructionCost ScalarizationCost,bool TypeBasedOnly)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
IntrinsicCostAttributes(Intrinsic::ID Id,Type * RTy,ArrayRef<Type * > Tys,FastMathFlags Flags,const IntrinsicInst * I,InstructionCost ScalarCost)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
IntrinsicCostAttributes(Intrinsic::ID Id,Type * Ty,ArrayRef<const Value * > Args)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
IntrinsicCostAttributes(Intrinsic::ID Id,Type * RTy,ArrayRef<const Value * > Args,ArrayRef<Type * > Tys,FastMathFlags Flags,const IntrinsicInst * I,InstructionCost ScalarCost)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
HardwareLoopInfo(Loop * L)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
isHardwareLoopCandidate(ScalarEvolution & SE,LoopInfo & LI,DominatorTree & DT,bool ForceNestedLoop,bool ForceHardwareLoopPHI)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
TargetTransformInfo(const DataLayout & DL)2030b57cec5SDimitry Andric TargetTransformInfo::TargetTransformInfo(const DataLayout &DL)
2040b57cec5SDimitry Andric : TTIImpl(new Model<NoTTIImpl>(NoTTIImpl(DL))) {}
2050b57cec5SDimitry Andric
20681ad6265SDimitry Andric TargetTransformInfo::~TargetTransformInfo() = default;
2070b57cec5SDimitry Andric
TargetTransformInfo(TargetTransformInfo && Arg)2080b57cec5SDimitry Andric TargetTransformInfo::TargetTransformInfo(TargetTransformInfo &&Arg)
2090b57cec5SDimitry Andric : TTIImpl(std::move(Arg.TTIImpl)) {}
2100b57cec5SDimitry Andric
operator =(TargetTransformInfo && RHS)2110b57cec5SDimitry Andric TargetTransformInfo &TargetTransformInfo::operator=(TargetTransformInfo &&RHS) {
2120b57cec5SDimitry Andric TTIImpl = std::move(RHS.TTIImpl);
2130b57cec5SDimitry Andric return *this;
2140b57cec5SDimitry Andric }
2150b57cec5SDimitry Andric
getInliningThresholdMultiplier() const2160b57cec5SDimitry Andric unsigned TargetTransformInfo::getInliningThresholdMultiplier() const {
2170b57cec5SDimitry Andric return TTIImpl->getInliningThresholdMultiplier();
2180b57cec5SDimitry Andric }
2190b57cec5SDimitry Andric
220e8d8bef9SDimitry Andric unsigned
getInliningCostBenefitAnalysisSavingsMultiplier() const2215f757f3fSDimitry Andric TargetTransformInfo::getInliningCostBenefitAnalysisSavingsMultiplier() const {
2225f757f3fSDimitry Andric return TTIImpl->getInliningCostBenefitAnalysisSavingsMultiplier();
2235f757f3fSDimitry Andric }
2245f757f3fSDimitry Andric
2255f757f3fSDimitry Andric unsigned
getInliningCostBenefitAnalysisProfitableMultiplier() const2265f757f3fSDimitry Andric TargetTransformInfo::getInliningCostBenefitAnalysisProfitableMultiplier()
2275f757f3fSDimitry Andric const {
2285f757f3fSDimitry Andric return TTIImpl->getInliningCostBenefitAnalysisProfitableMultiplier();
2295f757f3fSDimitry Andric }
2305f757f3fSDimitry Andric
2315f757f3fSDimitry Andric unsigned
adjustInliningThreshold(const CallBase * CB) const232e8d8bef9SDimitry Andric TargetTransformInfo::adjustInliningThreshold(const CallBase *CB) const {
233e8d8bef9SDimitry Andric return TTIImpl->adjustInliningThreshold(CB);
234e8d8bef9SDimitry Andric }
235e8d8bef9SDimitry Andric
getCallerAllocaCost(const CallBase * CB,const AllocaInst * AI) const23606c3fb27SDimitry Andric unsigned TargetTransformInfo::getCallerAllocaCost(const CallBase *CB,
23706c3fb27SDimitry Andric const AllocaInst *AI) const {
23806c3fb27SDimitry Andric return TTIImpl->getCallerAllocaCost(CB, AI);
23906c3fb27SDimitry Andric }
24006c3fb27SDimitry Andric
getInlinerVectorBonusPercent() const2410b57cec5SDimitry Andric int TargetTransformInfo::getInlinerVectorBonusPercent() const {
2420b57cec5SDimitry Andric return TTIImpl->getInlinerVectorBonusPercent();
2430b57cec5SDimitry Andric }
2440b57cec5SDimitry Andric
getGEPCost(Type * PointeeType,const Value * Ptr,ArrayRef<const Value * > Operands,Type * AccessType,TTI::TargetCostKind CostKind) const24506c3fb27SDimitry 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
getPointersChainCost(ArrayRef<const Value * > Ptrs,const Value * Base,const TTI::PointersChainInfo & Info,Type * AccessTy,TTI::TargetCostKind CostKind) const25106c3fb27SDimitry 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
getEstimatedNumberOfCaseClusters(const SwitchInst & SI,unsigned & JTSize,ProfileSummaryInfo * PSI,BlockFrequencyInfo * BFI) const2605ffd83dbSDimitry 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
getInstructionCost(const User * U,ArrayRef<const Value * > Operands,enum TargetCostKind CostKind) const267bdd1243dSDimitry 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
getPredictableBranchThreshold() const276fe6060f1SDimitry Andric BranchProbability TargetTransformInfo::getPredictableBranchThreshold() const {
27706c3fb27SDimitry Andric return PredictableBranchThreshold.getNumOccurrences() > 0
27806c3fb27SDimitry Andric ? BranchProbability(PredictableBranchThreshold, 100)
27906c3fb27SDimitry Andric : TTIImpl->getPredictableBranchThreshold();
280fe6060f1SDimitry Andric }
281fe6060f1SDimitry Andric
getBranchMispredictPenalty() const282*0fca6ea1SDimitry Andric InstructionCost TargetTransformInfo::getBranchMispredictPenalty() const {
283*0fca6ea1SDimitry Andric return TTIImpl->getBranchMispredictPenalty();
284*0fca6ea1SDimitry Andric }
285*0fca6ea1SDimitry Andric
hasBranchDivergence(const Function * F) const28606c3fb27SDimitry Andric bool TargetTransformInfo::hasBranchDivergence(const Function *F) const {
28706c3fb27SDimitry Andric return TTIImpl->hasBranchDivergence(F);
2885ffd83dbSDimitry Andric }
2895ffd83dbSDimitry Andric
isSourceOfDivergence(const Value * V) const2900b57cec5SDimitry Andric bool TargetTransformInfo::isSourceOfDivergence(const Value *V) const {
2910b57cec5SDimitry Andric return TTIImpl->isSourceOfDivergence(V);
2920b57cec5SDimitry Andric }
2930b57cec5SDimitry Andric
isAlwaysUniform(const Value * V) const2940b57cec5SDimitry Andric bool llvm::TargetTransformInfo::isAlwaysUniform(const Value *V) const {
2950b57cec5SDimitry Andric return TTIImpl->isAlwaysUniform(V);
2960b57cec5SDimitry Andric }
2970b57cec5SDimitry Andric
isValidAddrSpaceCast(unsigned FromAS,unsigned ToAS) const29806c3fb27SDimitry Andric bool llvm::TargetTransformInfo::isValidAddrSpaceCast(unsigned FromAS,
29906c3fb27SDimitry Andric unsigned ToAS) const {
30006c3fb27SDimitry Andric return TTIImpl->isValidAddrSpaceCast(FromAS, ToAS);
30106c3fb27SDimitry Andric }
30206c3fb27SDimitry Andric
addrspacesMayAlias(unsigned FromAS,unsigned ToAS) const30306c3fb27SDimitry Andric bool llvm::TargetTransformInfo::addrspacesMayAlias(unsigned FromAS,
30406c3fb27SDimitry Andric unsigned ToAS) const {
30506c3fb27SDimitry Andric return TTIImpl->addrspacesMayAlias(FromAS, ToAS);
30606c3fb27SDimitry Andric }
30706c3fb27SDimitry Andric
getFlatAddressSpace() const3080b57cec5SDimitry Andric unsigned TargetTransformInfo::getFlatAddressSpace() const {
3090b57cec5SDimitry Andric return TTIImpl->getFlatAddressSpace();
3100b57cec5SDimitry Andric }
3110b57cec5SDimitry Andric
collectFlatAddressOperands(SmallVectorImpl<int> & OpIndexes,Intrinsic::ID IID) const3128bcb0991SDimitry Andric bool TargetTransformInfo::collectFlatAddressOperands(
3138bcb0991SDimitry Andric SmallVectorImpl<int> &OpIndexes, Intrinsic::ID IID) const {
3148bcb0991SDimitry Andric return TTIImpl->collectFlatAddressOperands(OpIndexes, IID);
3158bcb0991SDimitry Andric }
3168bcb0991SDimitry Andric
isNoopAddrSpaceCast(unsigned FromAS,unsigned ToAS) const3175ffd83dbSDimitry Andric bool TargetTransformInfo::isNoopAddrSpaceCast(unsigned FromAS,
3185ffd83dbSDimitry Andric unsigned ToAS) const {
3195ffd83dbSDimitry Andric return TTIImpl->isNoopAddrSpaceCast(FromAS, ToAS);
3205ffd83dbSDimitry Andric }
3215ffd83dbSDimitry Andric
canHaveNonUndefGlobalInitializerInAddressSpace(unsigned AS) const322349cc55cSDimitry Andric bool TargetTransformInfo::canHaveNonUndefGlobalInitializerInAddressSpace(
323349cc55cSDimitry Andric unsigned AS) const {
324349cc55cSDimitry Andric return TTIImpl->canHaveNonUndefGlobalInitializerInAddressSpace(AS);
325349cc55cSDimitry Andric }
326349cc55cSDimitry Andric
getAssumedAddrSpace(const Value * V) const327e8d8bef9SDimitry Andric unsigned TargetTransformInfo::getAssumedAddrSpace(const Value *V) const {
328e8d8bef9SDimitry Andric return TTIImpl->getAssumedAddrSpace(V);
329e8d8bef9SDimitry Andric }
330e8d8bef9SDimitry Andric
isSingleThreaded() const331bdd1243dSDimitry Andric bool TargetTransformInfo::isSingleThreaded() const {
332bdd1243dSDimitry Andric return TTIImpl->isSingleThreaded();
333bdd1243dSDimitry Andric }
334bdd1243dSDimitry Andric
335349cc55cSDimitry Andric std::pair<const Value *, unsigned>
getPredicatedAddrSpace(const Value * V) const336349cc55cSDimitry Andric TargetTransformInfo::getPredicatedAddrSpace(const Value *V) const {
337349cc55cSDimitry Andric return TTIImpl->getPredicatedAddrSpace(V);
338349cc55cSDimitry Andric }
339349cc55cSDimitry Andric
rewriteIntrinsicWithAddressSpace(IntrinsicInst * II,Value * OldV,Value * NewV) const3405ffd83dbSDimitry 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
isLoweredToCall(const Function * F) const3450b57cec5SDimitry Andric bool TargetTransformInfo::isLoweredToCall(const Function *F) const {
3460b57cec5SDimitry Andric return TTIImpl->isLoweredToCall(F);
3470b57cec5SDimitry Andric }
3480b57cec5SDimitry Andric
isHardwareLoopProfitable(Loop * L,ScalarEvolution & SE,AssumptionCache & AC,TargetLibraryInfo * LibInfo,HardwareLoopInfo & HWLoopInfo) const3490b57cec5SDimitry 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
preferPredicateOverEpilogue(TailFoldingInfo * TFI) const3555ffd83dbSDimitry Andric bool TargetTransformInfo::preferPredicateOverEpilogue(
35606c3fb27SDimitry Andric TailFoldingInfo *TFI) const {
35706c3fb27SDimitry Andric return TTIImpl->preferPredicateOverEpilogue(TFI);
358480093f4SDimitry Andric }
359480093f4SDimitry Andric
getPreferredTailFoldingStyle(bool IVUpdateMayOverflow) const36006c3fb27SDimitry Andric TailFoldingStyle TargetTransformInfo::getPreferredTailFoldingStyle(
36106c3fb27SDimitry Andric bool IVUpdateMayOverflow) const {
36206c3fb27SDimitry Andric return TTIImpl->getPreferredTailFoldingStyle(IVUpdateMayOverflow);
3635ffd83dbSDimitry Andric }
3645ffd83dbSDimitry Andric
365bdd1243dSDimitry Andric std::optional<Instruction *>
instCombineIntrinsic(InstCombiner & IC,IntrinsicInst & II) const366e8d8bef9SDimitry Andric TargetTransformInfo::instCombineIntrinsic(InstCombiner &IC,
367e8d8bef9SDimitry Andric IntrinsicInst &II) const {
368e8d8bef9SDimitry Andric return TTIImpl->instCombineIntrinsic(IC, II);
369e8d8bef9SDimitry Andric }
370e8d8bef9SDimitry Andric
simplifyDemandedUseBitsIntrinsic(InstCombiner & IC,IntrinsicInst & II,APInt DemandedMask,KnownBits & Known,bool & KnownBitsComputed) const371bdd1243dSDimitry 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
simplifyDemandedVectorEltsIntrinsic(InstCombiner & IC,IntrinsicInst & II,APInt DemandedElts,APInt & UndefElts,APInt & UndefElts2,APInt & UndefElts3,std::function<void (Instruction *,unsigned,APInt,APInt &)> SimplifyAndSetOp) const378bdd1243dSDimitry 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
getUnrollingPreferences(Loop * L,ScalarEvolution & SE,UnrollingPreferences & UP,OptimizationRemarkEmitter * ORE) const3880b57cec5SDimitry 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
getPeelingPreferences(Loop * L,ScalarEvolution & SE,PeelingPreferences & PP) const3945ffd83dbSDimitry 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
isLegalAddImmediate(int64_t Imm) const3990b57cec5SDimitry Andric bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
4000b57cec5SDimitry Andric return TTIImpl->isLegalAddImmediate(Imm);
4010b57cec5SDimitry Andric }
4020b57cec5SDimitry Andric
isLegalAddScalableImmediate(int64_t Imm) const403*0fca6ea1SDimitry Andric bool TargetTransformInfo::isLegalAddScalableImmediate(int64_t Imm) const {
404*0fca6ea1SDimitry Andric return TTIImpl->isLegalAddScalableImmediate(Imm);
405*0fca6ea1SDimitry Andric }
406*0fca6ea1SDimitry Andric
isLegalICmpImmediate(int64_t Imm) const4070b57cec5SDimitry Andric bool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const {
4080b57cec5SDimitry Andric return TTIImpl->isLegalICmpImmediate(Imm);
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric
isLegalAddressingMode(Type * Ty,GlobalValue * BaseGV,int64_t BaseOffset,bool HasBaseReg,int64_t Scale,unsigned AddrSpace,Instruction * I,int64_t ScalableOffset) const4110b57cec5SDimitry 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
isLSRCostLess(const LSRCost & C1,const LSRCost & C2) const42181ad6265SDimitry Andric bool TargetTransformInfo::isLSRCostLess(const LSRCost &C1,
42281ad6265SDimitry Andric const LSRCost &C2) const {
4230b57cec5SDimitry Andric return TTIImpl->isLSRCostLess(C1, C2);
4240b57cec5SDimitry Andric }
4250b57cec5SDimitry Andric
isNumRegsMajorCostOfLSR() const426e8d8bef9SDimitry Andric bool TargetTransformInfo::isNumRegsMajorCostOfLSR() const {
427e8d8bef9SDimitry Andric return TTIImpl->isNumRegsMajorCostOfLSR();
428e8d8bef9SDimitry Andric }
429e8d8bef9SDimitry Andric
shouldFoldTerminatingConditionAfterLSR() const4305f757f3fSDimitry Andric bool TargetTransformInfo::shouldFoldTerminatingConditionAfterLSR() const {
4315f757f3fSDimitry Andric return TTIImpl->shouldFoldTerminatingConditionAfterLSR();
4325f757f3fSDimitry Andric }
4335f757f3fSDimitry Andric
shouldDropLSRSolutionIfLessProfitable() const434*0fca6ea1SDimitry Andric bool TargetTransformInfo::shouldDropLSRSolutionIfLessProfitable() const {
435*0fca6ea1SDimitry Andric return TTIImpl->shouldDropLSRSolutionIfLessProfitable();
436*0fca6ea1SDimitry Andric }
437*0fca6ea1SDimitry Andric
isProfitableLSRChainElement(Instruction * I) const4385ffd83dbSDimitry Andric bool TargetTransformInfo::isProfitableLSRChainElement(Instruction *I) const {
4395ffd83dbSDimitry Andric return TTIImpl->isProfitableLSRChainElement(I);
4405ffd83dbSDimitry Andric }
4415ffd83dbSDimitry Andric
canMacroFuseCmp() const4420b57cec5SDimitry Andric bool TargetTransformInfo::canMacroFuseCmp() const {
4430b57cec5SDimitry Andric return TTIImpl->canMacroFuseCmp();
4440b57cec5SDimitry Andric }
4450b57cec5SDimitry Andric
canSaveCmp(Loop * L,BranchInst ** BI,ScalarEvolution * SE,LoopInfo * LI,DominatorTree * DT,AssumptionCache * AC,TargetLibraryInfo * LibInfo) const4460b57cec5SDimitry 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
getPreferredAddressingMode(const Loop * L,ScalarEvolution * SE) const454fe6060f1SDimitry Andric TargetTransformInfo::getPreferredAddressingMode(const Loop *L,
455fe6060f1SDimitry Andric ScalarEvolution *SE) const {
456fe6060f1SDimitry Andric return TTIImpl->getPreferredAddressingMode(L, SE);
4570b57cec5SDimitry Andric }
4580b57cec5SDimitry Andric
isLegalMaskedStore(Type * DataType,Align Alignment) const4598bcb0991SDimitry Andric bool TargetTransformInfo::isLegalMaskedStore(Type *DataType,
4605ffd83dbSDimitry Andric Align Alignment) const {
4618bcb0991SDimitry Andric return TTIImpl->isLegalMaskedStore(DataType, Alignment);
4620b57cec5SDimitry Andric }
4630b57cec5SDimitry Andric
isLegalMaskedLoad(Type * DataType,Align Alignment) const4648bcb0991SDimitry Andric bool TargetTransformInfo::isLegalMaskedLoad(Type *DataType,
4655ffd83dbSDimitry Andric Align Alignment) const {
4668bcb0991SDimitry Andric return TTIImpl->isLegalMaskedLoad(DataType, Alignment);
4670b57cec5SDimitry Andric }
4680b57cec5SDimitry Andric
isLegalNTStore(Type * DataType,Align Alignment) const4690b57cec5SDimitry Andric bool TargetTransformInfo::isLegalNTStore(Type *DataType,
4708bcb0991SDimitry Andric Align Alignment) const {
4710b57cec5SDimitry Andric return TTIImpl->isLegalNTStore(DataType, Alignment);
4720b57cec5SDimitry Andric }
4730b57cec5SDimitry Andric
isLegalNTLoad(Type * DataType,Align Alignment) const4748bcb0991SDimitry Andric bool TargetTransformInfo::isLegalNTLoad(Type *DataType, Align Alignment) const {
4750b57cec5SDimitry Andric return TTIImpl->isLegalNTLoad(DataType, Alignment);
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric
isLegalBroadcastLoad(Type * ElementTy,ElementCount NumElements) const47881ad6265SDimitry Andric bool TargetTransformInfo::isLegalBroadcastLoad(Type *ElementTy,
47981ad6265SDimitry Andric ElementCount NumElements) const {
48081ad6265SDimitry Andric return TTIImpl->isLegalBroadcastLoad(ElementTy, NumElements);
48181ad6265SDimitry Andric }
48281ad6265SDimitry Andric
isLegalMaskedGather(Type * DataType,Align Alignment) const483480093f4SDimitry Andric bool TargetTransformInfo::isLegalMaskedGather(Type *DataType,
4845ffd83dbSDimitry Andric Align Alignment) const {
485480093f4SDimitry Andric return TTIImpl->isLegalMaskedGather(DataType, Alignment);
4860b57cec5SDimitry Andric }
4870b57cec5SDimitry Andric
isLegalAltInstr(VectorType * VecTy,unsigned Opcode0,unsigned Opcode1,const SmallBitVector & OpcodeMask) const48881ad6265SDimitry 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
isLegalMaskedScatter(Type * DataType,Align Alignment) const494480093f4SDimitry Andric bool TargetTransformInfo::isLegalMaskedScatter(Type *DataType,
4955ffd83dbSDimitry Andric Align Alignment) const {
496480093f4SDimitry Andric return TTIImpl->isLegalMaskedScatter(DataType, Alignment);
4970b57cec5SDimitry Andric }
4980b57cec5SDimitry Andric
forceScalarizeMaskedGather(VectorType * DataType,Align Alignment) const49904eeddc0SDimitry Andric bool TargetTransformInfo::forceScalarizeMaskedGather(VectorType *DataType,
50004eeddc0SDimitry Andric Align Alignment) const {
50104eeddc0SDimitry Andric return TTIImpl->forceScalarizeMaskedGather(DataType, Alignment);
50204eeddc0SDimitry Andric }
50304eeddc0SDimitry Andric
forceScalarizeMaskedScatter(VectorType * DataType,Align Alignment) const50404eeddc0SDimitry Andric bool TargetTransformInfo::forceScalarizeMaskedScatter(VectorType *DataType,
50504eeddc0SDimitry Andric Align Alignment) const {
50604eeddc0SDimitry Andric return TTIImpl->forceScalarizeMaskedScatter(DataType, Alignment);
50704eeddc0SDimitry Andric }
50804eeddc0SDimitry Andric
isLegalMaskedCompressStore(Type * DataType,Align Alignment) const509*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
isLegalMaskedExpandLoad(Type * DataType,Align Alignment) const514*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
isLegalStridedLoadStore(Type * DataType,Align Alignment) const519*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
isLegalMaskedVectorHistogram(Type * AddrType,Type * DataType) const524*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
enableOrderedReductions() const529349cc55cSDimitry Andric bool TargetTransformInfo::enableOrderedReductions() const {
530349cc55cSDimitry Andric return TTIImpl->enableOrderedReductions();
531349cc55cSDimitry Andric }
532349cc55cSDimitry Andric
hasDivRemOp(Type * DataType,bool IsSigned) const5330b57cec5SDimitry Andric bool TargetTransformInfo::hasDivRemOp(Type *DataType, bool IsSigned) const {
5340b57cec5SDimitry Andric return TTIImpl->hasDivRemOp(DataType, IsSigned);
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric
hasVolatileVariant(Instruction * I,unsigned AddrSpace) const5370b57cec5SDimitry Andric bool TargetTransformInfo::hasVolatileVariant(Instruction *I,
5380b57cec5SDimitry Andric unsigned AddrSpace) const {
5390b57cec5SDimitry Andric return TTIImpl->hasVolatileVariant(I, AddrSpace);
5400b57cec5SDimitry Andric }
5410b57cec5SDimitry Andric
prefersVectorizedAddressing() const5420b57cec5SDimitry Andric bool TargetTransformInfo::prefersVectorizedAddressing() const {
5430b57cec5SDimitry Andric return TTIImpl->prefersVectorizedAddressing();
5440b57cec5SDimitry Andric }
5450b57cec5SDimitry Andric
getScalingFactorCost(Type * Ty,GlobalValue * BaseGV,StackOffset BaseOffset,bool HasBaseReg,int64_t Scale,unsigned AddrSpace) const546fe6060f1SDimitry 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
LSRWithInstrQueries() const5550b57cec5SDimitry Andric bool TargetTransformInfo::LSRWithInstrQueries() const {
5560b57cec5SDimitry Andric return TTIImpl->LSRWithInstrQueries();
5570b57cec5SDimitry Andric }
5580b57cec5SDimitry Andric
isTruncateFree(Type * Ty1,Type * Ty2) const5590b57cec5SDimitry Andric bool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const {
5600b57cec5SDimitry Andric return TTIImpl->isTruncateFree(Ty1, Ty2);
5610b57cec5SDimitry Andric }
5620b57cec5SDimitry Andric
isProfitableToHoist(Instruction * I) const5630b57cec5SDimitry Andric bool TargetTransformInfo::isProfitableToHoist(Instruction *I) const {
5640b57cec5SDimitry Andric return TTIImpl->isProfitableToHoist(I);
5650b57cec5SDimitry Andric }
5660b57cec5SDimitry Andric
useAA() const5670b57cec5SDimitry Andric bool TargetTransformInfo::useAA() const { return TTIImpl->useAA(); }
5680b57cec5SDimitry Andric
isTypeLegal(Type * Ty) const5690b57cec5SDimitry Andric bool TargetTransformInfo::isTypeLegal(Type *Ty) const {
5700b57cec5SDimitry Andric return TTIImpl->isTypeLegal(Ty);
5710b57cec5SDimitry Andric }
5720b57cec5SDimitry Andric
getRegUsageForType(Type * Ty) const57381ad6265SDimitry Andric unsigned TargetTransformInfo::getRegUsageForType(Type *Ty) const {
574e8d8bef9SDimitry Andric return TTIImpl->getRegUsageForType(Ty);
575e8d8bef9SDimitry Andric }
576e8d8bef9SDimitry Andric
shouldBuildLookupTables() const5770b57cec5SDimitry Andric bool TargetTransformInfo::shouldBuildLookupTables() const {
5780b57cec5SDimitry Andric return TTIImpl->shouldBuildLookupTables();
5790b57cec5SDimitry Andric }
580fe6060f1SDimitry Andric
shouldBuildLookupTablesForConstant(Constant * C) const5815ffd83dbSDimitry Andric bool TargetTransformInfo::shouldBuildLookupTablesForConstant(
5825ffd83dbSDimitry Andric Constant *C) const {
5830b57cec5SDimitry Andric return TTIImpl->shouldBuildLookupTablesForConstant(C);
5840b57cec5SDimitry Andric }
5850b57cec5SDimitry Andric
shouldBuildRelLookupTables() const586fe6060f1SDimitry Andric bool TargetTransformInfo::shouldBuildRelLookupTables() const {
587fe6060f1SDimitry Andric return TTIImpl->shouldBuildRelLookupTables();
588fe6060f1SDimitry Andric }
589fe6060f1SDimitry Andric
useColdCCForColdCall(Function & F) const5900b57cec5SDimitry Andric bool TargetTransformInfo::useColdCCForColdCall(Function &F) const {
5910b57cec5SDimitry Andric return TTIImpl->useColdCCForColdCall(F);
5920b57cec5SDimitry Andric }
5930b57cec5SDimitry Andric
getScalarizationOverhead(VectorType * Ty,const APInt & DemandedElts,bool Insert,bool Extract,TTI::TargetCostKind CostKind) const594bdd1243dSDimitry 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
getOperandsScalarizationOverhead(ArrayRef<const Value * > Args,ArrayRef<Type * > Tys,TTI::TargetCostKind CostKind) const601fe6060f1SDimitry 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
supportsEfficientVectorElementLoadStore() const6070b57cec5SDimitry Andric bool TargetTransformInfo::supportsEfficientVectorElementLoadStore() const {
6080b57cec5SDimitry Andric return TTIImpl->supportsEfficientVectorElementLoadStore();
6090b57cec5SDimitry Andric }
6100b57cec5SDimitry Andric
supportsTailCalls() const61181ad6265SDimitry Andric bool TargetTransformInfo::supportsTailCalls() const {
61281ad6265SDimitry Andric return TTIImpl->supportsTailCalls();
61381ad6265SDimitry Andric }
61481ad6265SDimitry Andric
supportsTailCallFor(const CallBase * CB) const615bdd1243dSDimitry Andric bool TargetTransformInfo::supportsTailCallFor(const CallBase *CB) const {
616bdd1243dSDimitry Andric return TTIImpl->supportsTailCallFor(CB);
617bdd1243dSDimitry Andric }
618bdd1243dSDimitry Andric
enableAggressiveInterleaving(bool LoopHasReductions) const6195ffd83dbSDimitry Andric bool TargetTransformInfo::enableAggressiveInterleaving(
6205ffd83dbSDimitry Andric bool LoopHasReductions) const {
6210b57cec5SDimitry Andric return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
6220b57cec5SDimitry Andric }
6230b57cec5SDimitry Andric
6240b57cec5SDimitry Andric TargetTransformInfo::MemCmpExpansionOptions
enableMemCmpExpansion(bool OptSize,bool IsZeroCmp) const6250b57cec5SDimitry Andric TargetTransformInfo::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
6260b57cec5SDimitry Andric return TTIImpl->enableMemCmpExpansion(OptSize, IsZeroCmp);
6270b57cec5SDimitry Andric }
6280b57cec5SDimitry Andric
enableSelectOptimize() const629bdd1243dSDimitry Andric bool TargetTransformInfo::enableSelectOptimize() const {
630bdd1243dSDimitry Andric return TTIImpl->enableSelectOptimize();
631bdd1243dSDimitry Andric }
632bdd1243dSDimitry Andric
shouldTreatInstructionLikeSelect(const Instruction * I) const6337a6dacacSDimitry Andric bool TargetTransformInfo::shouldTreatInstructionLikeSelect(
6347a6dacacSDimitry Andric const Instruction *I) const {
6357a6dacacSDimitry Andric return TTIImpl->shouldTreatInstructionLikeSelect(I);
6367a6dacacSDimitry Andric }
6377a6dacacSDimitry Andric
enableInterleavedAccessVectorization() const6380b57cec5SDimitry Andric bool TargetTransformInfo::enableInterleavedAccessVectorization() const {
6390b57cec5SDimitry Andric return TTIImpl->enableInterleavedAccessVectorization();
6400b57cec5SDimitry Andric }
6410b57cec5SDimitry Andric
enableMaskedInterleavedAccessVectorization() const6420b57cec5SDimitry Andric bool TargetTransformInfo::enableMaskedInterleavedAccessVectorization() const {
6430b57cec5SDimitry Andric return TTIImpl->enableMaskedInterleavedAccessVectorization();
6440b57cec5SDimitry Andric }
6450b57cec5SDimitry Andric
isFPVectorizationPotentiallyUnsafe() const6460b57cec5SDimitry Andric bool TargetTransformInfo::isFPVectorizationPotentiallyUnsafe() const {
6470b57cec5SDimitry Andric return TTIImpl->isFPVectorizationPotentiallyUnsafe();
6480b57cec5SDimitry Andric }
6490b57cec5SDimitry Andric
650bdd1243dSDimitry Andric bool
allowsMisalignedMemoryAccesses(LLVMContext & Context,unsigned BitWidth,unsigned AddressSpace,Align Alignment,unsigned * Fast) const651bdd1243dSDimitry 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
getPopcntSupport(unsigned IntTyWidthInBit) const6610b57cec5SDimitry Andric TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
6620b57cec5SDimitry Andric return TTIImpl->getPopcntSupport(IntTyWidthInBit);
6630b57cec5SDimitry Andric }
6640b57cec5SDimitry Andric
haveFastSqrt(Type * Ty) const6650b57cec5SDimitry Andric bool TargetTransformInfo::haveFastSqrt(Type *Ty) const {
6660b57cec5SDimitry Andric return TTIImpl->haveFastSqrt(Ty);
6670b57cec5SDimitry Andric }
6680b57cec5SDimitry Andric
isExpensiveToSpeculativelyExecute(const Instruction * I) const669bdd1243dSDimitry Andric bool TargetTransformInfo::isExpensiveToSpeculativelyExecute(
670bdd1243dSDimitry Andric const Instruction *I) const {
671bdd1243dSDimitry Andric return TTIImpl->isExpensiveToSpeculativelyExecute(I);
672bdd1243dSDimitry Andric }
673bdd1243dSDimitry Andric
isFCmpOrdCheaperThanFCmpZero(Type * Ty) const6740b57cec5SDimitry Andric bool TargetTransformInfo::isFCmpOrdCheaperThanFCmpZero(Type *Ty) const {
6750b57cec5SDimitry Andric return TTIImpl->isFCmpOrdCheaperThanFCmpZero(Ty);
6760b57cec5SDimitry Andric }
6770b57cec5SDimitry Andric
getFPOpCost(Type * Ty) const678fe6060f1SDimitry 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
getIntImmCodeSizeCost(unsigned Opcode,unsigned Idx,const APInt & Imm,Type * Ty) const684fe6060f1SDimitry 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
getIntImmCost(const APInt & Imm,Type * Ty,TTI::TargetCostKind CostKind) const694fe6060f1SDimitry 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
getIntImmCostInst(unsigned Opcode,unsigned Idx,const APInt & Imm,Type * Ty,TTI::TargetCostKind CostKind,Instruction * Inst) const701fe6060f1SDimitry 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
getIntImmCostIntrin(Intrinsic::ID IID,unsigned Idx,const APInt & Imm,Type * Ty,TTI::TargetCostKind CostKind) const7115ffd83dbSDimitry 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
preferToKeepConstantsAttached(const Instruction & Inst,const Function & Fn) const7205f757f3fSDimitry Andric bool TargetTransformInfo::preferToKeepConstantsAttached(
7215f757f3fSDimitry Andric const Instruction &Inst, const Function &Fn) const {
7225f757f3fSDimitry Andric return TTIImpl->preferToKeepConstantsAttached(Inst, Fn);
7235f757f3fSDimitry Andric }
7245f757f3fSDimitry Andric
getNumberOfRegisters(unsigned ClassID) const7258bcb0991SDimitry Andric unsigned TargetTransformInfo::getNumberOfRegisters(unsigned ClassID) const {
7268bcb0991SDimitry Andric return TTIImpl->getNumberOfRegisters(ClassID);
7278bcb0991SDimitry Andric }
7288bcb0991SDimitry Andric
hasConditionalLoadStoreForType(Type * Ty) const729*0fca6ea1SDimitry Andric bool TargetTransformInfo::hasConditionalLoadStoreForType(Type *Ty) const {
730*0fca6ea1SDimitry Andric return TTIImpl->hasConditionalLoadStoreForType(Ty);
731*0fca6ea1SDimitry Andric }
732*0fca6ea1SDimitry Andric
getRegisterClassForType(bool Vector,Type * Ty) const7335ffd83dbSDimitry Andric unsigned TargetTransformInfo::getRegisterClassForType(bool Vector,
7345ffd83dbSDimitry Andric Type *Ty) const {
7358bcb0991SDimitry Andric return TTIImpl->getRegisterClassForType(Vector, Ty);
7368bcb0991SDimitry Andric }
7378bcb0991SDimitry Andric
getRegisterClassName(unsigned ClassID) const7388bcb0991SDimitry Andric const char *TargetTransformInfo::getRegisterClassName(unsigned ClassID) const {
7398bcb0991SDimitry Andric return TTIImpl->getRegisterClassName(ClassID);
7400b57cec5SDimitry Andric }
7410b57cec5SDimitry Andric
getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const742fe6060f1SDimitry Andric TypeSize TargetTransformInfo::getRegisterBitWidth(
743fe6060f1SDimitry Andric TargetTransformInfo::RegisterKind K) const {
744fe6060f1SDimitry Andric return TTIImpl->getRegisterBitWidth(K);
7450b57cec5SDimitry Andric }
7460b57cec5SDimitry Andric
getMinVectorRegisterBitWidth() const7470b57cec5SDimitry Andric unsigned TargetTransformInfo::getMinVectorRegisterBitWidth() const {
7480b57cec5SDimitry Andric return TTIImpl->getMinVectorRegisterBitWidth();
7490b57cec5SDimitry Andric }
7500b57cec5SDimitry Andric
getMaxVScale() const751bdd1243dSDimitry Andric std::optional<unsigned> TargetTransformInfo::getMaxVScale() const {
752e8d8bef9SDimitry Andric return TTIImpl->getMaxVScale();
753e8d8bef9SDimitry Andric }
754e8d8bef9SDimitry Andric
getVScaleForTuning() const755bdd1243dSDimitry Andric std::optional<unsigned> TargetTransformInfo::getVScaleForTuning() const {
756349cc55cSDimitry Andric return TTIImpl->getVScaleForTuning();
757349cc55cSDimitry Andric }
758349cc55cSDimitry Andric
isVScaleKnownToBeAPowerOfTwo() const75906c3fb27SDimitry Andric bool TargetTransformInfo::isVScaleKnownToBeAPowerOfTwo() const {
76006c3fb27SDimitry Andric return TTIImpl->isVScaleKnownToBeAPowerOfTwo();
76106c3fb27SDimitry Andric }
76206c3fb27SDimitry Andric
shouldMaximizeVectorBandwidth(TargetTransformInfo::RegisterKind K) const76381ad6265SDimitry Andric bool TargetTransformInfo::shouldMaximizeVectorBandwidth(
76481ad6265SDimitry Andric TargetTransformInfo::RegisterKind K) const {
76581ad6265SDimitry Andric return TTIImpl->shouldMaximizeVectorBandwidth(K);
7660b57cec5SDimitry Andric }
7670b57cec5SDimitry Andric
getMinimumVF(unsigned ElemWidth,bool IsScalable) const768fe6060f1SDimitry Andric ElementCount TargetTransformInfo::getMinimumVF(unsigned ElemWidth,
769fe6060f1SDimitry Andric bool IsScalable) const {
770fe6060f1SDimitry Andric return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
7710b57cec5SDimitry Andric }
7720b57cec5SDimitry Andric
getMaximumVF(unsigned ElemWidth,unsigned Opcode) const773e8d8bef9SDimitry Andric unsigned TargetTransformInfo::getMaximumVF(unsigned ElemWidth,
774e8d8bef9SDimitry Andric unsigned Opcode) const {
775e8d8bef9SDimitry Andric return TTIImpl->getMaximumVF(ElemWidth, Opcode);
776e8d8bef9SDimitry Andric }
777e8d8bef9SDimitry Andric
getStoreMinimumVF(unsigned VF,Type * ScalarMemTy,Type * ScalarValTy) const77881ad6265SDimitry 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
shouldConsiderAddressTypePromotion(const Instruction & I,bool & AllowPromotionWithoutCommonHeader) const7830b57cec5SDimitry 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
getCacheLineSize() const7890b57cec5SDimitry 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>
getCacheSize(CacheLevel Level) const7955ffd83dbSDimitry Andric TargetTransformInfo::getCacheSize(CacheLevel Level) const {
7960b57cec5SDimitry Andric return TTIImpl->getCacheSize(Level);
7970b57cec5SDimitry Andric }
7980b57cec5SDimitry Andric
799bdd1243dSDimitry Andric std::optional<unsigned>
getCacheAssociativity(CacheLevel Level) const8005ffd83dbSDimitry Andric TargetTransformInfo::getCacheAssociativity(CacheLevel Level) const {
8010b57cec5SDimitry Andric return TTIImpl->getCacheAssociativity(Level);
8020b57cec5SDimitry Andric }
8030b57cec5SDimitry Andric
getMinPageSize() const8041db9f3b2SDimitry Andric std::optional<unsigned> TargetTransformInfo::getMinPageSize() const {
8051db9f3b2SDimitry Andric return MinPageSize.getNumOccurrences() > 0 ? MinPageSize
8061db9f3b2SDimitry Andric : TTIImpl->getMinPageSize();
8071db9f3b2SDimitry Andric }
8081db9f3b2SDimitry Andric
getPrefetchDistance() const8090b57cec5SDimitry Andric unsigned TargetTransformInfo::getPrefetchDistance() const {
8100b57cec5SDimitry Andric return TTIImpl->getPrefetchDistance();
8110b57cec5SDimitry Andric }
8120b57cec5SDimitry Andric
getMinPrefetchStride(unsigned NumMemAccesses,unsigned NumStridedMemAccesses,unsigned NumPrefetches,bool HasCall) const8135ffd83dbSDimitry 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
getMaxPrefetchIterationsAhead() const8200b57cec5SDimitry Andric unsigned TargetTransformInfo::getMaxPrefetchIterationsAhead() const {
8210b57cec5SDimitry Andric return TTIImpl->getMaxPrefetchIterationsAhead();
8220b57cec5SDimitry Andric }
8230b57cec5SDimitry Andric
enableWritePrefetching() const8245ffd83dbSDimitry Andric bool TargetTransformInfo::enableWritePrefetching() const {
8255ffd83dbSDimitry Andric return TTIImpl->enableWritePrefetching();
8265ffd83dbSDimitry Andric }
8275ffd83dbSDimitry Andric
shouldPrefetchAddressSpace(unsigned AS) const828bdd1243dSDimitry Andric bool TargetTransformInfo::shouldPrefetchAddressSpace(unsigned AS) const {
829bdd1243dSDimitry Andric return TTIImpl->shouldPrefetchAddressSpace(AS);
830bdd1243dSDimitry Andric }
831bdd1243dSDimitry Andric
getMaxInterleaveFactor(ElementCount VF) const83206c3fb27SDimitry Andric unsigned TargetTransformInfo::getMaxInterleaveFactor(ElementCount VF) const {
8330b57cec5SDimitry Andric return TTIImpl->getMaxInterleaveFactor(VF);
8340b57cec5SDimitry Andric }
8350b57cec5SDimitry Andric
836bdd1243dSDimitry Andric TargetTransformInfo::OperandValueInfo
getOperandInfo(const Value * V)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
getArithmeticInstrCost(unsigned Opcode,Type * Ty,TTI::TargetCostKind CostKind,OperandValueInfo Op1Info,OperandValueInfo Op2Info,ArrayRef<const Value * > Args,const Instruction * CxtI,const TargetLibraryInfo * TLibInfo) const897fe6060f1SDimitry 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
getAltInstrCost(VectorType * VecTy,unsigned Opcode0,unsigned Opcode1,const SmallBitVector & OpcodeMask,TTI::TargetCostKind CostKind) const924647cbc5dSDimitry 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
getShuffleCost(ShuffleKind Kind,VectorType * Ty,ArrayRef<int> Mask,TTI::TargetCostKind CostKind,int Index,VectorType * SubTp,ArrayRef<const Value * > Args,const Instruction * CxtI) const93381ad6265SDimitry 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
getCastContextHint(const Instruction * I)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
getCastInstrCost(unsigned Opcode,Type * Dst,Type * Src,CastContextHint CCH,TTI::TargetCostKind CostKind,const Instruction * I) const987fe6060f1SDimitry 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
getExtractWithExtendCost(unsigned Opcode,Type * Dst,VectorType * VecTy,unsigned Index) const998fe6060f1SDimitry 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
getCFInstrCost(unsigned Opcode,TTI::TargetCostKind CostKind,const Instruction * I) const1006fe6060f1SDimitry 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
getCmpSelInstrCost(unsigned Opcode,Type * ValTy,Type * CondTy,CmpInst::Predicate VecPred,TTI::TargetCostKind CostKind,const Instruction * I) const1015fe6060f1SDimitry 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
getVectorInstrCost(unsigned Opcode,Type * Val,TTI::TargetCostKind CostKind,unsigned Index,Value * Op0,Value * Op1) const1026bdd1243dSDimitry 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
getVectorInstrCost(const Instruction & I,Type * Val,TTI::TargetCostKind CostKind,unsigned Index) const1039bdd1243dSDimitry 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
getReplicationShuffleCost(Type * EltTy,int ReplicationFactor,int VF,const APInt & DemandedDstElts,TTI::TargetCostKind CostKind) const1050349cc55cSDimitry 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
getMemoryOpCost(unsigned Opcode,Type * Src,Align Alignment,unsigned AddressSpace,TTI::TargetCostKind CostKind,TTI::OperandValueInfo OpInfo,const Instruction * I) const1059fe6060f1SDimitry 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
getMaskedMemoryOpCost(unsigned Opcode,Type * Src,Align Alignment,unsigned AddressSpace,TTI::TargetCostKind CostKind) const1071fe6060f1SDimitry 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
getGatherScatterOpCost(unsigned Opcode,Type * DataTy,const Value * Ptr,bool VariableMask,Align Alignment,TTI::TargetCostKind CostKind,const Instruction * I) const1080fe6060f1SDimitry 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
getStridedMemoryOpCost(unsigned Opcode,Type * DataTy,const Value * Ptr,bool VariableMask,Align Alignment,TTI::TargetCostKind CostKind,const Instruction * I) const1090*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
getInterleavedMemoryOpCost(unsigned Opcode,Type * VecTy,unsigned Factor,ArrayRef<unsigned> Indices,Align Alignment,unsigned AddressSpace,TTI::TargetCostKind CostKind,bool UseMaskForCond,bool UseMaskForGaps) const1099fe6060f1SDimitry 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
getIntrinsicInstrCost(const IntrinsicCostAttributes & ICA,TTI::TargetCostKind CostKind) const11115ffd83dbSDimitry 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
getCallInstrCost(Function * F,Type * RetTy,ArrayRef<Type * > Tys,TTI::TargetCostKind CostKind) const1119fe6060f1SDimitry 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
getNumberOfParts(Type * Tp) const11270b57cec5SDimitry Andric unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {
11280b57cec5SDimitry Andric return TTIImpl->getNumberOfParts(Tp);
11290b57cec5SDimitry Andric }
11300b57cec5SDimitry Andric
1131fe6060f1SDimitry Andric InstructionCost
getAddressComputationCost(Type * Tp,ScalarEvolution * SE,const SCEV * Ptr) const1132fe6060f1SDimitry 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
getMemcpyCost(const Instruction * I) const1139fe6060f1SDimitry 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
getMaxMemIntrinsicInlineSizeThreshold() const114506c3fb27SDimitry Andric uint64_t TargetTransformInfo::getMaxMemIntrinsicInlineSizeThreshold() const {
114606c3fb27SDimitry Andric return TTIImpl->getMaxMemIntrinsicInlineSizeThreshold();
114706c3fb27SDimitry Andric }
114806c3fb27SDimitry Andric
getArithmeticReductionCost(unsigned Opcode,VectorType * Ty,std::optional<FastMathFlags> FMF,TTI::TargetCostKind CostKind) const1149fe6060f1SDimitry 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
getMinMaxReductionCost(Intrinsic::ID IID,VectorType * Ty,FastMathFlags FMF,TTI::TargetCostKind CostKind) const1158fe6060f1SDimitry 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
getExtendedReductionCost(unsigned Opcode,bool IsUnsigned,Type * ResTy,VectorType * Ty,FastMathFlags FMF,TTI::TargetCostKind CostKind) const1167bdd1243dSDimitry 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
getMulAccReductionCost(bool IsUnsigned,Type * ResTy,VectorType * Ty,TTI::TargetCostKind CostKind) const1174bdd1243dSDimitry 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
getCostOfKeepingLiveOverCall(ArrayRef<Type * > Tys) const11810b57cec5SDimitry Andric TargetTransformInfo::getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys) const {
11820b57cec5SDimitry Andric return TTIImpl->getCostOfKeepingLiveOverCall(Tys);
11830b57cec5SDimitry Andric }
11840b57cec5SDimitry Andric
getTgtMemIntrinsic(IntrinsicInst * Inst,MemIntrinsicInfo & Info) const11850b57cec5SDimitry Andric bool TargetTransformInfo::getTgtMemIntrinsic(IntrinsicInst *Inst,
11860b57cec5SDimitry Andric MemIntrinsicInfo &Info) const {
11870b57cec5SDimitry Andric return TTIImpl->getTgtMemIntrinsic(Inst, Info);
11880b57cec5SDimitry Andric }
11890b57cec5SDimitry Andric
getAtomicMemIntrinsicMaxElementSize() const11900b57cec5SDimitry Andric unsigned TargetTransformInfo::getAtomicMemIntrinsicMaxElementSize() const {
11910b57cec5SDimitry Andric return TTIImpl->getAtomicMemIntrinsicMaxElementSize();
11920b57cec5SDimitry Andric }
11930b57cec5SDimitry Andric
getOrCreateResultFromMemIntrinsic(IntrinsicInst * Inst,Type * ExpectedType) const11940b57cec5SDimitry Andric Value *TargetTransformInfo::getOrCreateResultFromMemIntrinsic(
11950b57cec5SDimitry Andric IntrinsicInst *Inst, Type *ExpectedType) const {
11960b57cec5SDimitry Andric return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType);
11970b57cec5SDimitry Andric }
11980b57cec5SDimitry Andric
getMemcpyLoopLoweringType(LLVMContext & Context,Value * Length,unsigned SrcAddrSpace,unsigned DestAddrSpace,unsigned SrcAlign,unsigned DestAlign,std::optional<uint32_t> AtomicElementSize) const11995ffd83dbSDimitry 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
getMemcpyLoopResidualLoweringType(SmallVectorImpl<Type * > & OpsOut,LLVMContext & Context,unsigned RemainingBytes,unsigned SrcAddrSpace,unsigned DestAddrSpace,unsigned SrcAlign,unsigned DestAlign,std::optional<uint32_t> AtomicCpySize) const12080b57cec5SDimitry 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
areInlineCompatible(const Function * Caller,const Function * Callee) const12180b57cec5SDimitry 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
getInlineCallPenalty(const Function * F,const CallBase & Call,unsigned DefaultCallPenalty) const12245f757f3fSDimitry 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
areTypesABICompatible(const Function * Caller,const Function * Callee,const ArrayRef<Type * > & Types) const12300eae32dcSDimitry 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
isIndexedLoadLegal(MemIndexedMode Mode,Type * Ty) const12360b57cec5SDimitry Andric bool TargetTransformInfo::isIndexedLoadLegal(MemIndexedMode Mode,
12370b57cec5SDimitry Andric Type *Ty) const {
12380b57cec5SDimitry Andric return TTIImpl->isIndexedLoadLegal(Mode, Ty);
12390b57cec5SDimitry Andric }
12400b57cec5SDimitry Andric
isIndexedStoreLegal(MemIndexedMode Mode,Type * Ty) const12410b57cec5SDimitry Andric bool TargetTransformInfo::isIndexedStoreLegal(MemIndexedMode Mode,
12420b57cec5SDimitry Andric Type *Ty) const {
12430b57cec5SDimitry Andric return TTIImpl->isIndexedStoreLegal(Mode, Ty);
12440b57cec5SDimitry Andric }
12450b57cec5SDimitry Andric
getLoadStoreVecRegBitWidth(unsigned AS) const12460b57cec5SDimitry Andric unsigned TargetTransformInfo::getLoadStoreVecRegBitWidth(unsigned AS) const {
12470b57cec5SDimitry Andric return TTIImpl->getLoadStoreVecRegBitWidth(AS);
12480b57cec5SDimitry Andric }
12490b57cec5SDimitry Andric
isLegalToVectorizeLoad(LoadInst * LI) const12500b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeLoad(LoadInst *LI) const {
12510b57cec5SDimitry Andric return TTIImpl->isLegalToVectorizeLoad(LI);
12520b57cec5SDimitry Andric }
12530b57cec5SDimitry Andric
isLegalToVectorizeStore(StoreInst * SI) const12540b57cec5SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeStore(StoreInst *SI) const {
12550b57cec5SDimitry Andric return TTIImpl->isLegalToVectorizeStore(SI);
12560b57cec5SDimitry Andric }
12570b57cec5SDimitry Andric
isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes,Align Alignment,unsigned AddrSpace) const12580b57cec5SDimitry 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
isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes,Align Alignment,unsigned AddrSpace) const12640b57cec5SDimitry 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
isLegalToVectorizeReduction(const RecurrenceDescriptor & RdxDesc,ElementCount VF) const1270fe6060f1SDimitry Andric bool TargetTransformInfo::isLegalToVectorizeReduction(
1271fe6060f1SDimitry Andric const RecurrenceDescriptor &RdxDesc, ElementCount VF) const {
1272fe6060f1SDimitry Andric return TTIImpl->isLegalToVectorizeReduction(RdxDesc, VF);
1273fe6060f1SDimitry Andric }
1274fe6060f1SDimitry Andric
isElementTypeLegalForScalableVector(Type * Ty) const1275fe6060f1SDimitry Andric bool TargetTransformInfo::isElementTypeLegalForScalableVector(Type *Ty) const {
1276fe6060f1SDimitry Andric return TTIImpl->isElementTypeLegalForScalableVector(Ty);
1277fe6060f1SDimitry Andric }
1278fe6060f1SDimitry Andric
getLoadVectorFactor(unsigned VF,unsigned LoadSize,unsigned ChainSizeInBytes,VectorType * VecTy) const12790b57cec5SDimitry 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
getStoreVectorFactor(unsigned VF,unsigned StoreSize,unsigned ChainSizeInBytes,VectorType * VecTy) const12860b57cec5SDimitry 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
preferFixedOverScalableIfEqualCost() const1293*0fca6ea1SDimitry Andric bool TargetTransformInfo::preferFixedOverScalableIfEqualCost() const {
1294*0fca6ea1SDimitry Andric return TTIImpl->preferFixedOverScalableIfEqualCost();
1295*0fca6ea1SDimitry Andric }
1296*0fca6ea1SDimitry Andric
preferInLoopReduction(unsigned Opcode,Type * Ty,ReductionFlags Flags) const1297e8d8bef9SDimitry 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
preferPredicatedReductionSelect(unsigned Opcode,Type * Ty,ReductionFlags Flags) const1302e8d8bef9SDimitry 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
preferEpilogueVectorization() const1307bdd1243dSDimitry Andric bool TargetTransformInfo::preferEpilogueVectorization() const {
1308bdd1243dSDimitry Andric return TTIImpl->preferEpilogueVectorization();
1309bdd1243dSDimitry Andric }
1310bdd1243dSDimitry Andric
1311fe6060f1SDimitry Andric TargetTransformInfo::VPLegalization
getVPLegalizationStrategy(const VPIntrinsic & VPI) const1312fe6060f1SDimitry Andric TargetTransformInfo::getVPLegalizationStrategy(const VPIntrinsic &VPI) const {
1313fe6060f1SDimitry Andric return TTIImpl->getVPLegalizationStrategy(VPI);
1314fe6060f1SDimitry Andric }
1315fe6060f1SDimitry Andric
hasArmWideBranch(bool Thumb) const131606c3fb27SDimitry Andric bool TargetTransformInfo::hasArmWideBranch(bool Thumb) const {
131706c3fb27SDimitry Andric return TTIImpl->hasArmWideBranch(Thumb);
131806c3fb27SDimitry Andric }
131906c3fb27SDimitry Andric
getMaxNumArgs() const132006c3fb27SDimitry Andric unsigned TargetTransformInfo::getMaxNumArgs() const {
132106c3fb27SDimitry Andric return TTIImpl->getMaxNumArgs();
132206c3fb27SDimitry Andric }
132306c3fb27SDimitry Andric
shouldExpandReduction(const IntrinsicInst * II) const13240b57cec5SDimitry Andric bool TargetTransformInfo::shouldExpandReduction(const IntrinsicInst *II) const {
13250b57cec5SDimitry Andric return TTIImpl->shouldExpandReduction(II);
13260b57cec5SDimitry Andric }
13270b57cec5SDimitry Andric
1328*0fca6ea1SDimitry Andric TargetTransformInfo::ReductionShuffle
getPreferredExpandedReductionShuffle(const IntrinsicInst * II) const1329*0fca6ea1SDimitry Andric TargetTransformInfo::getPreferredExpandedReductionShuffle(
1330*0fca6ea1SDimitry Andric const IntrinsicInst *II) const {
1331*0fca6ea1SDimitry Andric return TTIImpl->getPreferredExpandedReductionShuffle(II);
1332*0fca6ea1SDimitry Andric }
1333*0fca6ea1SDimitry Andric
getGISelRematGlobalCost() const13340b57cec5SDimitry Andric unsigned TargetTransformInfo::getGISelRematGlobalCost() const {
13350b57cec5SDimitry Andric return TTIImpl->getGISelRematGlobalCost();
13360b57cec5SDimitry Andric }
13370b57cec5SDimitry Andric
getMinTripCountTailFoldingThreshold() const133861cfbce3SDimitry Andric unsigned TargetTransformInfo::getMinTripCountTailFoldingThreshold() const {
133961cfbce3SDimitry Andric return TTIImpl->getMinTripCountTailFoldingThreshold();
134061cfbce3SDimitry Andric }
134161cfbce3SDimitry Andric
supportsScalableVectors() const1342e8d8bef9SDimitry Andric bool TargetTransformInfo::supportsScalableVectors() const {
1343e8d8bef9SDimitry Andric return TTIImpl->supportsScalableVectors();
1344e8d8bef9SDimitry Andric }
1345e8d8bef9SDimitry Andric
enableScalableVectorization() const13460eae32dcSDimitry Andric bool TargetTransformInfo::enableScalableVectorization() const {
13470eae32dcSDimitry Andric return TTIImpl->enableScalableVectorization();
13480eae32dcSDimitry Andric }
13490eae32dcSDimitry Andric
hasActiveVectorLength(unsigned Opcode,Type * DataType,Align Alignment) const13500eae32dcSDimitry 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
TargetIRAnalysis()13570b57cec5SDimitry Andric TargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {}
13580b57cec5SDimitry Andric
TargetIRAnalysis(std::function<Result (const Function &)> TTICallback)13590b57cec5SDimitry Andric TargetIRAnalysis::TargetIRAnalysis(
13600b57cec5SDimitry Andric std::function<Result(const Function &)> TTICallback)
13610b57cec5SDimitry Andric : TTICallback(std::move(TTICallback)) {}
13620b57cec5SDimitry Andric
run(const Function & F,FunctionAnalysisManager &)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
getDefaultTTI(const Function & F)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
anchor()13790b57cec5SDimitry Andric void TargetTransformInfoWrapperPass::anchor() {}
13800b57cec5SDimitry Andric
TargetTransformInfoWrapperPass()13810b57cec5SDimitry Andric TargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass()
13820b57cec5SDimitry Andric : ImmutablePass(ID) {
13830b57cec5SDimitry Andric initializeTargetTransformInfoWrapperPassPass(
13840b57cec5SDimitry Andric *PassRegistry::getPassRegistry());
13850b57cec5SDimitry Andric }
13860b57cec5SDimitry Andric
TargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)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
getTTI(const Function & F)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 *
createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)14010b57cec5SDimitry Andric llvm::createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA) {
14020b57cec5SDimitry Andric return new TargetTransformInfoWrapperPass(std::move(TIRA));
14030b57cec5SDimitry Andric }
1404