1be04929f7fd76a921540e9901f24563e51dc1219Chandler Carruth//===- llvm/Analysis/TargetTransformInfo.cpp ------------------------------===// 2cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// 3cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// The LLVM Compiler Infrastructure 4cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// 5cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// This file is distributed under the University of Illinois Open Source 6cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// License. See LICENSE.TXT for details. 7cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem// 8cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem//===----------------------------------------------------------------------===// 9cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 10be04929f7fd76a921540e9901f24563e51dc1219Chandler Carruth#include "llvm/Analysis/TargetTransformInfo.h" 11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/TargetTransformInfoImpl.h" 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CallSite.h" 131e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/DataLayout.h" 141e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instruction.h" 151e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instructions.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IntrinsicInst.h" 17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Module.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Operator.h" 19cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/Support/ErrorHandling.h" 20cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 21cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotemusing namespace llvm; 22cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "tti" 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace { 26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// \brief No-op implementation of the TTI interface using the utility base 27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// classes. 28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// 29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// This is used when no target specific information is available. 30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstruct NoTTIImpl : TargetTransformInfoImplCRTPBase<NoTTIImpl> { 31cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar explicit NoTTIImpl(const DataLayout &DL) 32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : TargetTransformInfoImplCRTPBase<NoTTIImpl>(DL) {} 33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}; 347bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 357bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 36cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarTargetTransformInfo::TargetTransformInfo(const DataLayout &DL) 37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : TTIImpl(new Model<NoTTIImpl>(NoTTIImpl(DL))) {} 38aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 39ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfo::~TargetTransformInfo() {} 40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 41ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfo::TargetTransformInfo(TargetTransformInfo &&Arg) 42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : TTIImpl(std::move(Arg.TTIImpl)) {} 43aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 44ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfo &TargetTransformInfo::operator=(TargetTransformInfo &&RHS) { 45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TTIImpl = std::move(RHS.TTIImpl); 46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return *this; 477bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 487bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 49cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getOperationCost(unsigned Opcode, Type *Ty, 50cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Type *OpTy) const { 51cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getOperationCost(Opcode, Ty, OpTy); 52cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 53cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 541e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 551e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 56cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCallCost(FunctionType *FTy, int NumArgs) const { 57cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCallCost(FTy, NumArgs); 58cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 59cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 6013086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 6113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 62cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCallCost(const Function *F, 63cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ArrayRef<const Value *> Arguments) const { 64cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCallCost(F, Arguments); 65cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 66cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 6713086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 6813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 69cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getIntrinsicCost( 70cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Intrinsic::ID IID, Type *RetTy, ArrayRef<const Value *> Arguments) const { 71cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getIntrinsicCost(IID, RetTy, Arguments); 72cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 73cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 7413086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 7513086a658ae06046ded902229f9918b8bad505bdChandler Carruth 76cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getUserCost(const User *U) const { 77cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getUserCost(U); 78cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 79cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 801e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 811e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 8257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellardbool TargetTransformInfo::hasBranchDivergence() const { 83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->hasBranchDivergence(); 8457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard} 8557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard 860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarbool TargetTransformInfo::isSourceOfDivergence(const Value *V) const { 870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return TTIImpl->isSourceOfDivergence(V); 880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar} 890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 9013086a658ae06046ded902229f9918b8bad505bdChandler Carruthbool TargetTransformInfo::isLoweredToCall(const Function *F) const { 91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isLoweredToCall(F); 9213086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 9313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid TargetTransformInfo::getUnrollingPreferences( 95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Loop *L, UnrollingPreferences &UP) const { 96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getUnrollingPreferences(L, UP); 974f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel} 984f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel 997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const { 100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isLegalAddImmediate(Imm); 1017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const { 104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isLegalICmpImmediate(Imm); 1057bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, 1087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int64_t BaseOffset, 1097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool HasBaseReg, 1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t Scale, 1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned AddrSpace) const { 112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, 1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Scale, AddrSpace); 1147bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1157bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 116cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::isLegalMaskedStore(Type *DataType) const { 117cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->isLegalMaskedStore(DataType); 118cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 119cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 120cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::isLegalMaskedLoad(Type *DataType) const { 121cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->isLegalMaskedLoad(DataType); 122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 124cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::isLegalMaskedGather(Type *DataType) const { 125cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->isLegalMaskedGather(DataType); 126cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 127cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 128cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::isLegalMaskedScatter(Type *DataType) const { 129cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->isLegalMaskedGather(DataType); 130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 13206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombetint TargetTransformInfo::getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, 13306f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int64_t BaseOffset, 13406f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet bool HasBaseReg, 1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t Scale, 1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned AddrSpace) const { 137cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getScalingFactorCost(Ty, BaseGV, BaseOffset, HasBaseReg, 138cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Scale, AddrSpace); 139cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 140cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 14106f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet} 14206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 1437bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const { 144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isTruncateFree(Ty1, Ty2); 145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 146ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 147ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool TargetTransformInfo::isProfitableToHoist(Instruction *I) const { 148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isProfitableToHoist(I); 1497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTypeLegal(Type *Ty) const { 152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->isTypeLegal(Ty); 1537bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1547bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufAlignment() const { 156ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getJumpBufAlignment(); 1577bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1587bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1597bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufSize() const { 160ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getJumpBufSize(); 1617bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1627bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1637bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::shouldBuildLookupTables() const { 164ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->shouldBuildLookupTables(); 1657bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1667bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool TargetTransformInfo::enableAggressiveInterleaving(bool LoopHasReductions) const { 1684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return TTIImpl->enableAggressiveInterleaving(LoopHasReductions); 1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 1704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 171cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::enableInterleavedAccessVectorization() const { 172cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->enableInterleavedAccessVectorization(); 173cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 174cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 175d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::PopcntSupportKind 176d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const { 177ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getPopcntSupport(IntTyWidthInBit); 1787bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1797bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 180a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandifordbool TargetTransformInfo::haveFastSqrt(Type *Ty) const { 181ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->haveFastSqrt(Ty); 182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 183ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 184cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getFPOpCost(Type *Ty) const { 185cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getFPOpCost(Ty); 186cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 187cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 188a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford} 189a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford 190cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const { 191cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getIntImmCost(Imm, Ty); 192cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 193cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 1947bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1957bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 196cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getIntImmCost(unsigned Opcode, unsigned Idx, 197cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const APInt &Imm, Type *Ty) const { 198cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getIntImmCost(Opcode, Idx, Imm, Ty); 199cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 200cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 203cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getIntImmCost(Intrinsic::ID IID, unsigned Idx, 204cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const APInt &Imm, Type *Ty) const { 205cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getIntImmCost(IID, Idx, Imm, Ty); 206cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 207cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const { 211ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getNumberOfRegisters(Vector); 2127bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2137bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 21414925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotemunsigned TargetTransformInfo::getRegisterBitWidth(bool Vector) const { 215ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getRegisterBitWidth(Vector); 21614925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem} 21714925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem 2186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarunsigned TargetTransformInfo::getMaxInterleaveFactor(unsigned VF) const { 2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return TTIImpl->getMaxInterleaveFactor(VF); 22083be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem} 22183be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem 222cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getArithmeticInstrCost( 223ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned Opcode, Type *Ty, OperandValueKind Opd1Info, 224ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines OperandValueKind Opd2Info, OperandValueProperties Opd1PropInfo, 22537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines OperandValueProperties Opd2PropInfo) const { 226cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getArithmeticInstrCost(Opcode, Ty, Opd1Info, Opd2Info, 227cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Opd1PropInfo, Opd2PropInfo); 228cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 229cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2307bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2317bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 232cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Ty, int Index, 233cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Type *SubTp) const { 234cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getShuffleCost(Kind, Ty, Index, SubTp); 235cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 236cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2377bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2387bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 239cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst, 240cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Type *Src) const { 241cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCastInstrCost(Opcode, Dst, Src); 242cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 243cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2447bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2457bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 246cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCFInstrCost(unsigned Opcode) const { 247cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCFInstrCost(Opcode); 248cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 249cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 252cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, 253cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Type *CondTy) const { 254cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCmpSelInstrCost(Opcode, ValTy, CondTy); 255cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 256cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2577bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2587bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 259cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val, 260cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned Index) const { 261cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getVectorInstrCost(Opcode, Val, Index); 262cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 263cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2647bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2657bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 266cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src, 267cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned Alignment, 268cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned AddressSpace) const { 269cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace); 270cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 271cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2727bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2737bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 274cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getMaskedMemoryOpCost(unsigned Opcode, Type *Src, 275cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned Alignment, 276cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned AddressSpace) const { 277cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = 278cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar TTIImpl->getMaskedMemoryOpCost(Opcode, Src, Alignment, AddressSpace); 279cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 280cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 281ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 282ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 283cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getInterleavedMemoryOpCost( 2846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices, 2856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned Alignment, unsigned AddressSpace) const { 286cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getInterleavedMemoryOpCost(Opcode, VecTy, Factor, Indices, 287cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Alignment, AddressSpace); 288cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 289cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 2916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 292cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID, Type *RetTy, 293cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ArrayRef<Type *> Tys) const { 294cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getIntrinsicInstrCost(ID, RetTy, Tys); 295cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 296cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 2977bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 299cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getCallInstrCost(Function *F, Type *RetTy, 300cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ArrayRef<Type *> Tys) const { 301cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getCallInstrCost(F, RetTy, Tys); 302cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 303cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 3044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 3054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 3067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const { 307ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getNumberOfParts(Tp); 3087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 3097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 310cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getAddressComputationCost(Type *Tp, 311cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool IsComplex) const { 312cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getAddressComputationCost(Tp, IsComplex); 313cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 314cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 315fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer} 3167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 317cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarint TargetTransformInfo::getReductionCost(unsigned Opcode, Type *Ty, 318cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool IsPairwiseForm) const { 319cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int Cost = TTIImpl->getReductionCost(Opcode, Ty, IsPairwiseForm); 320cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Cost >= 0 && "TTI should not produce negative costs!"); 321cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Cost; 32265457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer} 32365457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer 324ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesunsigned 325ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfo::getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys) const { 326ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getCostOfKeepingLiveOverCall(Tys); 32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 329ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool TargetTransformInfo::getTgtMemIntrinsic(IntrinsicInst *Inst, 330ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MemIntrinsicInfo &Info) const { 331ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getTgtMemIntrinsic(Inst, Info); 332ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 3337bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 334ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesValue *TargetTransformInfo::getOrCreateResultFromMemIntrinsic( 335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines IntrinsicInst *Inst, Type *ExpectedType) const { 336ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTIImpl->getOrCreateResultFromMemIntrinsic(Inst, ExpectedType); 337ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 33837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 339cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarbool TargetTransformInfo::areInlineCompatible(const Function *Caller, 340cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const Function *Callee) const { 341cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return TTIImpl->areInlineCompatible(Caller, Callee); 342cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 343cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 344ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfo::Concept::~Concept() {} 345ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 346ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetIRAnalysis::TargetIRAnalysis() : TTICallback(&getDefaultTTI) {} 3477bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 348ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetIRAnalysis::TargetIRAnalysis( 349cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar std::function<Result(const Function &)> TTICallback) 350ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : TTICallback(TTICallback) {} 351ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 352cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarTargetIRAnalysis::Result TargetIRAnalysis::run(const Function &F) { 353ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return TTICallback(F); 354ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 3557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 356ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineschar TargetIRAnalysis::PassID; 357ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 358cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarTargetIRAnalysis::Result TargetIRAnalysis::getDefaultTTI(const Function &F) { 359cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Result(F.getParent()->getDataLayout()); 360ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 361ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 362ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// Register the basic pass. 363ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS(TargetTransformInfoWrapperPass, "tti", 364ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines "Target Transform Information", false, true) 365ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineschar TargetTransformInfoWrapperPass::ID = 0; 366ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 367ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid TargetTransformInfoWrapperPass::anchor() {} 368ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 369ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass() 370ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : ImmutablePass(ID) { 371ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines initializeTargetTransformInfoWrapperPassPass( 372ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines *PassRegistry::getPassRegistry()); 373ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 374ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 375ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesTargetTransformInfoWrapperPass::TargetTransformInfoWrapperPass( 376ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TargetIRAnalysis TIRA) 377ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : ImmutablePass(ID), TIRA(std::move(TIRA)) { 378ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines initializeTargetTransformInfoWrapperPassPass( 379ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines *PassRegistry::getPassRegistry()); 380ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 381ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 382cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarTargetTransformInfo &TargetTransformInfoWrapperPass::getTTI(const Function &F) { 383ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TTI = TIRA.run(F); 384ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return *TTI; 385ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 3867bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 387ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesImmutablePass * 388ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesllvm::createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA) { 389ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return new TargetTransformInfoWrapperPass(std::move(TIRA)); 3907bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 391