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" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CallSite.h" 121e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/DataLayout.h" 131e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instruction.h" 141e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instructions.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IntrinsicInst.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Operator.h" 17cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/Support/ErrorHandling.h" 18cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 19cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotemusing namespace llvm; 20cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "tti" 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth// Setup the analysis group to manage the TargetTransformInfo passes. 247bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthINITIALIZE_ANALYSIS_GROUP(TargetTransformInfo, "Target Information", NoTTI) 25cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotemchar TargetTransformInfo::ID = 0; 26cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 277bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthTargetTransformInfo::~TargetTransformInfo() { 287bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 297bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 30aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid TargetTransformInfo::pushTTIStack(Pass *P) { 31aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth TopTTI = this; 32aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PrevTTI = &P->getAnalysis<TargetTransformInfo>(); 33aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 34aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // Walk up the chain and update the top TTI pointer. 35aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI) 36aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PTTI->TopTTI = this; 37aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth} 38aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 397bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthvoid TargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const { 407bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth AU.addRequired<TargetTransformInfo>(); 417bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 427bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 431e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getOperationCost(unsigned Opcode, Type *Ty, 441e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth Type *OpTy) const { 451e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getOperationCost(Opcode, Ty, OpTy); 461e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 471e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 481e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getGEPCost( 491e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth const Value *Ptr, ArrayRef<const Value *> Operands) const { 501e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getGEPCost(Ptr, Operands); 511e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 521e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 5313086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost(FunctionType *FTy, 5413086a658ae06046ded902229f9918b8bad505bdChandler Carruth int NumArgs) const { 5513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(FTy, NumArgs); 5613086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 5713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 5813086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost(const Function *F, 5913086a658ae06046ded902229f9918b8bad505bdChandler Carruth int NumArgs) const { 6013086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(F, NumArgs); 6113086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 6213086a658ae06046ded902229f9918b8bad505bdChandler Carruth 6313086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost( 6413086a658ae06046ded902229f9918b8bad505bdChandler Carruth const Function *F, ArrayRef<const Value *> Arguments) const { 6513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(F, Arguments); 6613086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 6713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 6813086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getIntrinsicCost( 6913086a658ae06046ded902229f9918b8bad505bdChandler Carruth Intrinsic::ID IID, Type *RetTy, ArrayRef<Type *> ParamTys) const { 7013086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getIntrinsicCost(IID, RetTy, ParamTys); 7113086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 7213086a658ae06046ded902229f9918b8bad505bdChandler Carruth 7313086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getIntrinsicCost( 7413086a658ae06046ded902229f9918b8bad505bdChandler Carruth Intrinsic::ID IID, Type *RetTy, ArrayRef<const Value *> Arguments) const { 7513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getIntrinsicCost(IID, RetTy, Arguments); 7613086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 7713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 781e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getUserCost(const User *U) const { 791e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getUserCost(U); 801e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 811e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 8257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellardbool TargetTransformInfo::hasBranchDivergence() const { 8357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard return PrevTTI->hasBranchDivergence(); 8457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard} 8557e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard 8613086a658ae06046ded902229f9918b8bad505bdChandler Carruthbool TargetTransformInfo::isLoweredToCall(const Function *F) const { 8713086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->isLoweredToCall(F); 8813086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 8913086a658ae06046ded902229f9918b8bad505bdChandler Carruth 904f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkelvoid TargetTransformInfo::getUnrollingPreferences(Loop *L, 914f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel UnrollingPreferences &UP) const { 924f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel PrevTTI->getUnrollingPreferences(L, UP); 934f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel} 944f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel 957bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const { 967bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalAddImmediate(Imm); 977bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const { 1007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalICmpImmediate(Imm); 1017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, 1047bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int64_t BaseOffset, 1057bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool HasBaseReg, 1067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int64_t Scale) const { 1077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, 1087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Scale); 1097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 11106f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombetint TargetTransformInfo::getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, 11206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int64_t BaseOffset, 11306f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet bool HasBaseReg, 11406f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int64_t Scale) const { 11506f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return PrevTTI->getScalingFactorCost(Ty, BaseGV, BaseOffset, HasBaseReg, 11606f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet Scale); 11706f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet} 11806f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 1197bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const { 1207bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isTruncateFree(Ty1, Ty2); 1217bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTypeLegal(Type *Ty) const { 1247bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isTypeLegal(Ty); 1257bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1267bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1277bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufAlignment() const { 1287bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getJumpBufAlignment(); 1297bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1307bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1317bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufSize() const { 1327bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getJumpBufSize(); 1337bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1347bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1357bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::shouldBuildLookupTables() const { 1367bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->shouldBuildLookupTables(); 1377bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1387bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 139d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::PopcntSupportKind 140d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const { 141d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler Carruth return PrevTTI->getPopcntSupport(IntTyWidthInBit); 1427bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1437bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 144a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandifordbool TargetTransformInfo::haveFastSqrt(Type *Ty) const { 145a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford return PrevTTI->haveFastSqrt(Ty); 146a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford} 147a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford 1487bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const { 1497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getIntImmCost(Imm, Ty); 1507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned TargetTransformInfo::getIntImmCost(unsigned Opc, unsigned Idx, 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const APInt &Imm, Type *Ty) const { 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PrevTTI->getIntImmCost(Opc, Idx, Imm, Ty); 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned TargetTransformInfo::getIntImmCost(Intrinsic::ID IID, unsigned Idx, 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const APInt &Imm, Type *Ty) const { 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PrevTTI->getIntImmCost(IID, Idx, Imm, Ty); 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1627bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const { 1637bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getNumberOfRegisters(Vector); 1647bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1657bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 16614925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotemunsigned TargetTransformInfo::getRegisterBitWidth(bool Vector) const { 16714925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem return PrevTTI->getRegisterBitWidth(Vector); 16814925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem} 16914925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem 17083be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotemunsigned TargetTransformInfo::getMaximumUnrollFactor() const { 17183be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem return PrevTTI->getMaximumUnrollFactor(); 17283be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem} 17383be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem 1747bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode, 1756bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer Type *Ty, 1766bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer OperandValueKind Op1Info, 1776bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer OperandValueKind Op2Info) const { 1786bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer return PrevTTI->getArithmeticInstrCost(Opcode, Ty, Op1Info, Op2Info); 1797bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1807bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1817bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp, 1827bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int Index, Type *SubTp) const { 1837bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp); 1847bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1857bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1867bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst, 1877bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *Src) const { 1887bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCastInstrCost(Opcode, Dst, Src); 1897bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1907bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1917bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const { 1927bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCFInstrCost(Opcode); 1937bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1947bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1957bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, 1967bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *CondTy) const { 1977bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy); 1987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val, 2017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Index) const { 2027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getVectorInstrCost(Opcode, Val, Index); 2037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2047bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2057bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src, 2067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Alignment, 2077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned AddressSpace) const { 2087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace); 2097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth ; 2107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2117bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2127bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned 2137bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthTargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID, 2147bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *RetTy, 2157bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth ArrayRef<Type *> Tys) const { 2167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys); 2177bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2187bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2197bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const { 2207bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getNumberOfParts(Tp); 2217bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 223c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighoferunsigned TargetTransformInfo::getAddressComputationCost(Type *Tp, 224c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighofer bool IsComplex) const { 225c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighofer return PrevTTI->getAddressComputationCost(Tp, IsComplex); 226fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer} 2277bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 22865457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighoferunsigned TargetTransformInfo::getReductionCost(unsigned Opcode, Type *Ty, 22965457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer bool IsPairwise) const { 23065457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer return PrevTTI->getReductionCost(Opcode, Ty, IsPairwise); 23165457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer} 23265457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer 2337bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthnamespace { 2347bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct NoTTI final : ImmutablePass, TargetTransformInfo { 2361e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth const DataLayout *DL; 2371e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines NoTTI() : ImmutablePass(ID), DL(nullptr) { 239aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth initializeNoTTIPass(*PassRegistry::getPassRegistry()); 2407bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2417bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void initializePass() override { 243aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // Note that this subclass is special, and must *not* call initializeTTI as 244aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // it does not chain. 24513086a658ae06046ded902229f9918b8bad505bdChandler Carruth TopTTI = this; 246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PrevTTI = nullptr; 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>(); 248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DL = DLP ? &DLP->getDataLayout() : nullptr; 2497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void getAnalysisUsage(AnalysisUsage &AU) const override { 2527bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth // Note that this subclass is special, and must *not* call 2537bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth // TTI::getAnalysisUsage as it breaks the recursion. 2547bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2567bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth /// Pass identification. 2577bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth static char ID; 2587bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2597bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth /// Provide necessary pointer adjustments for the two base classes. 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void *getAdjustedAnalysisPointer(const void *ID) override { 2617bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth if (ID == &TargetTransformInfo::ID) 2627bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return (TargetTransformInfo*)this; 2637bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return this; 2647bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2657bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getOperationCost(unsigned Opcode, Type *Ty, 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *OpTy) const override { 2681e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth switch (Opcode) { 2691e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth default: 2701e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // By default, just classify everything as 'basic'. 2711e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2721e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2731e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::GetElementPtr: 2741e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth llvm_unreachable("Use getGEPCost for GEP operations!"); 2751e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2761e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::BitCast: 2771e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth assert(OpTy && "Cast instructions must provide the operand type"); 2781e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (Ty == OpTy || (Ty->isPointerTy() && OpTy->isPointerTy())) 2791e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Identity and pointer-to-pointer casts are free. 2801e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2811e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2821e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise, the default basic cost is used. 2831e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2841e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 285f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault case Instruction::IntToPtr: { 286f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault if (!DL) 287f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault return TCC_Basic; 288f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault 2891e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // An inttoptr cast is free so long as the input is a legal integer type 2901e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // which doesn't contain values outside the range of a pointer. 291f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault unsigned OpSize = OpTy->getScalarSizeInBits(); 292f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault if (DL->isLegalInteger(OpSize) && 293f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault OpSize <= DL->getPointerTypeSizeInBits(Ty)) 2941e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2951e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2961e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise it's not a no-op. 2971e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 298f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault } 299f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault case Instruction::PtrToInt: { 300f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault if (!DL) 301f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault return TCC_Basic; 3021e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3031e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // A ptrtoint cast is free so long as the result is large enough to store 3041e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // the pointer, and a legal integer type. 305f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault unsigned DestSize = Ty->getScalarSizeInBits(); 306f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault if (DL->isLegalInteger(DestSize) && 307f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault DestSize >= DL->getPointerTypeSizeInBits(OpTy)) 3081e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 3091e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3101e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise it's not a no-op. 3111e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 312f9355c80d55110ebef66475717b4400f6bb0ad4eMatt Arsenault } 3131e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::Trunc: 3141e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // trunc to a native type is free (assuming the target has compare and 3151e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // shift-right of the same width). 3161e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (DL && DL->isLegalInteger(DL->getTypeSizeInBits(Ty))) 3171e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 3181e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3191e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 3201e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3211e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3221e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3231e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth unsigned getGEPCost(const Value *Ptr, 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<const Value *> Operands) const override { 3251e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // In the basic model, we just assume that all-constant GEPs will be folded 3261e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // into their uses via addressing modes. 3271e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth for (unsigned Idx = 0, Size = Operands.size(); Idx != Size; ++Idx) 3281e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (!isa<Constant>(Operands[Idx])) 3291e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 3301e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3311e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 3321e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3331e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getCallCost(FunctionType *FTy, int NumArgs = -1) const override 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { 33613086a658ae06046ded902229f9918b8bad505bdChandler Carruth assert(FTy && "FunctionType must be provided to this routine."); 33713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 33813086a658ae06046ded902229f9918b8bad505bdChandler Carruth // The target-independent implementation just measures the size of the 33913086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function by approximating that each argument will take on average one 34013086a658ae06046ded902229f9918b8bad505bdChandler Carruth // instruction to prepare. 34113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 34213086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (NumArgs < 0) 34313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Set the argument number to the number of explicit arguments in the 34413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function. 34513086a658ae06046ded902229f9918b8bad505bdChandler Carruth NumArgs = FTy->getNumParams(); 34613086a658ae06046ded902229f9918b8bad505bdChandler Carruth 34713086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic * (NumArgs + 1); 34813086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 34913086a658ae06046ded902229f9918b8bad505bdChandler Carruth 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getCallCost(const Function *F, int NumArgs = -1) const override 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { 35213086a658ae06046ded902229f9918b8bad505bdChandler Carruth assert(F && "A concrete function must be provided to this routine."); 35313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 35413086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (NumArgs < 0) 35513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Set the argument number to the number of explicit arguments in the 35613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function. 35713086a658ae06046ded902229f9918b8bad505bdChandler Carruth NumArgs = F->arg_size(); 35813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 35913086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Intrinsic::ID IID = (Intrinsic::ID)F->getIntrinsicID()) { 36013086a658ae06046ded902229f9918b8bad505bdChandler Carruth FunctionType *FTy = F->getFunctionType(); 36113086a658ae06046ded902229f9918b8bad505bdChandler Carruth SmallVector<Type *, 8> ParamTys(FTy->param_begin(), FTy->param_end()); 36213086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getIntrinsicCost(IID, FTy->getReturnType(), ParamTys); 36313086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 36413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 36513086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (!TopTTI->isLoweredToCall(F)) 36613086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic; // Give a basic cost if it will be lowered directly. 36713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 36813086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F->getFunctionType(), NumArgs); 36913086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 37013086a658ae06046ded902229f9918b8bad505bdChandler Carruth 37113086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getCallCost(const Function *F, 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<const Value *> Arguments) const override { 37313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Simply delegate to generic handling of the call. 37413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: We should use instsimplify or something else to catch calls which 37513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // will constant fold with these arguments. 37613086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F, Arguments.size()); 37713086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 37813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 37913086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<Type *> ParamTys) const override { 38113086a658ae06046ded902229f9918b8bad505bdChandler Carruth switch (IID) { 38213086a658ae06046ded902229f9918b8bad505bdChandler Carruth default: 38313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Intrinsics rarely (if ever) have normal argument setup constraints. 38413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Model them as having a basic instruction cost. 38513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: This is wrong for libc intrinsics. 38613086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic; 38713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 38813086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::dbg_declare: 38913086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::dbg_value: 39013086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::invariant_start: 39113086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::invariant_end: 39213086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::lifetime_start: 39313086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::lifetime_end: 39413086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::objectsize: 39513086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::ptr_annotation: 39613086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::var_annotation: 39713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These intrinsics don't actually represent code after lowering. 39813086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Free; 39913086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 40013086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 40113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<const Value *> Arguments) const override { 40513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Delegate to the generic intrinsic handling code. This mostly provides an 40613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // opportunity for targets to (for example) special case the cost of 40713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // certain intrinsics based on constants used as arguments. 40813086a658ae06046ded902229f9918b8bad505bdChandler Carruth SmallVector<Type *, 8> ParamTys; 40913086a658ae06046ded902229f9918b8bad505bdChandler Carruth ParamTys.reserve(Arguments.size()); 41013086a658ae06046ded902229f9918b8bad505bdChandler Carruth for (unsigned Idx = 0, Size = Arguments.size(); Idx != Size; ++Idx) 41113086a658ae06046ded902229f9918b8bad505bdChandler Carruth ParamTys.push_back(Arguments[Idx]->getType()); 41213086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getIntrinsicCost(IID, RetTy, ParamTys); 41313086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 41413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getUserCost(const User *U) const override { 416a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth if (isa<PHINode>(U)) 417a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth return TCC_Free; // Model all PHI nodes as free. 418a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const GEPOperator *GEP = dyn_cast<GEPOperator>(U)) { 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<const Value *, 4> Indices(GEP->idx_begin(), GEP->idx_end()); 42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TopTTI->getGEPCost(GEP->getPointerOperand(), Indices); 42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4231e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 42413086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (ImmutableCallSite CS = U) { 42513086a658ae06046ded902229f9918b8bad505bdChandler Carruth const Function *F = CS.getCalledFunction(); 42613086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (!F) { 42713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Just use the called value type. 42813086a658ae06046ded902229f9918b8bad505bdChandler Carruth Type *FTy = CS.getCalledValue()->getType()->getPointerElementType(); 42913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(cast<FunctionType>(FTy), CS.arg_size()); 4301e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 43113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<const Value *, 8> Arguments(CS.arg_begin(), CS.arg_end()); 43313086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F, Arguments); 4341e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4351e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 4361e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (const CastInst *CI = dyn_cast<CastInst>(U)) { 4371e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Result of a cmp instruction is often extended (to be used by other 4381e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // cmp instructions, logical or return instructions). These are usually 4391e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // nop on most sane targets. 4401e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (isa<CmpInst>(CI->getOperand(0))) 4411e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 4421e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4431e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 4441e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise delegate to the fully generic implementations. 4451e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return getOperationCost(Operator::getOpcode(U), U->getType(), 4461e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth U->getNumOperands() == 1 ? 447dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines U->getOperand(0)->getType() : nullptr); 4481e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasBranchDivergence() const override { return false; } 45157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isLoweredToCall(const Function *F) const override { 45313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: These should almost certainly not be handled here, and instead 45413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // handled with the help of TLI or the target itself. This was largely 45513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // ported from existing analysis heuristics here so that such refactorings 45613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // can take place in the future. 45713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 45813086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (F->isIntrinsic()) 45913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 46013086a658ae06046ded902229f9918b8bad505bdChandler Carruth 46113086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (F->hasLocalLinkage() || !F->hasName()) 46213086a658ae06046ded902229f9918b8bad505bdChandler Carruth return true; 46313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 46413086a658ae06046ded902229f9918b8bad505bdChandler Carruth StringRef Name = F->getName(); 46513086a658ae06046ded902229f9918b8bad505bdChandler Carruth 46613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These will all likely lower to a single selection DAG node. 46713086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Name == "copysign" || Name == "copysignf" || Name == "copysignl" || 46813086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "fabs" || Name == "fabsf" || Name == "fabsl" || Name == "sin" || 46913086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "sinf" || Name == "sinl" || Name == "cos" || Name == "cosf" || 47013086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "cosl" || Name == "sqrt" || Name == "sqrtf" || Name == "sqrtl") 47113086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 47213086a658ae06046ded902229f9918b8bad505bdChandler Carruth 47313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These are all likely to be optimized into something smaller. 47413086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Name == "pow" || Name == "powf" || Name == "powl" || Name == "exp2" || 47513086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "exp2l" || Name == "exp2f" || Name == "floor" || Name == 47613086a658ae06046ded902229f9918b8bad505bdChandler Carruth "floorf" || Name == "ceil" || Name == "round" || Name == "ffs" || 47713086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "ffsl" || Name == "abs" || Name == "labs" || Name == "llabs") 47813086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 47913086a658ae06046ded902229f9918b8bad505bdChandler Carruth 48013086a658ae06046ded902229f9918b8bad505bdChandler Carruth return true; 48113086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 48213086a658ae06046ded902229f9918b8bad505bdChandler Carruth 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getUnrollingPreferences(Loop *, UnrollingPreferences &) const override { 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4854f7e2c38e864d7eaeb407ac501478e9579624d1bHal Finkel 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isLegalAddImmediate(int64_t Imm) const override { 487aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4887bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4897bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isLegalICmpImmediate(int64_t Imm) const override { 491aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4927bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4937bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 4947bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool HasBaseReg, int64_t Scale) const override 49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { 497e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth // Guess that reg+reg addressing is allowed. This heuristic is taken from 498e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth // the implementation of LSR. 499e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth return !BaseGV && BaseOffset == 0 && Scale <= 1; 5007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 50206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, 50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool HasBaseReg, int64_t Scale) const override { 50406f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet // Guess that all legal addressing mode are free. 50506f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet if(isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, Scale)) 50606f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return 0; 50706f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return -1; 50806f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet } 50906f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTruncateFree(Type *Ty1, Type *Ty2) const override { 511aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 5127bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5137bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTypeLegal(Type *Ty) const override { 515aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 5167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5177bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 51836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getJumpBufAlignment() const override { 519aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 5207bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5217bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getJumpBufSize() const override { 523aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 5247bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5257bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool shouldBuildLookupTables() const override { 527aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return true; 5287bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5297bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PopcntSupportKind 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getPopcntSupport(unsigned IntTyWidthInBit) const override { 532d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler Carruth return PSK_Software; 5337bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5347bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 53536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool haveFastSqrt(Type *Ty) const override { 536a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford return false; 537a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford } 538a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford 53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getIntImmCost(const APInt &Imm, Type *Ty) const override { 54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TCC_Basic; 54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm, 54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Ty) const override { 54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TCC_Free; 54636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 54736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getIntImmCost(Intrinsic::ID IID, unsigned Idx, const APInt &Imm, 54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Ty) const override { 55036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TCC_Free; 5517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5527bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getNumberOfRegisters(bool Vector) const override { 554aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 8; 5557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5567bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getRegisterBitWidth(bool Vector) const override { 55814925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem return 32; 55914925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem } 56014925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem 56136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMaximumUnrollFactor() const override { 56283be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem return 1; 56383be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem } 56483be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem 5656bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty, OperandValueKind, 56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OperandValueKind) const override { 567aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5687bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5697bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getShuffleCost(ShuffleKind Kind, Type *Ty, 571dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int Index = 0, Type *SubTp = nullptr) const override { 572aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5737bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5747bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5757bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getCastInstrCost(unsigned Opcode, Type *Dst, 57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Src) const override { 577aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5787bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5797bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getCFInstrCost(unsigned Opcode) const override { 581aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5827bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5837bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5847bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, 585dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Type *CondTy = nullptr) const override { 586aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5877bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5887bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5897bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getVectorInstrCost(unsigned Opcode, Type *Val, 59036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Index = -1) const override { 591aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5927bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5937bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 59436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment, 59536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned AddressSpace) const override { 596aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5977bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 59936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getIntrinsicInstrCost(Intrinsic::ID ID, Type *RetTy, 60036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArrayRef<Type*> Tys) const override { 601aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 6027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 6037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 60436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getNumberOfParts(Type *Tp) const override { 605aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 6067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 607fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer 60836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getAddressComputationCost(Type *Tp, bool) const override { 609fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer return 0; 610fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer } 61165457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer 61236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getReductionCost(unsigned, Type *, bool) const override { 61365457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer return 1; 61465457b679ae240c1a37da82c5484dac478c47b6dArnold Schwaighofer } 6157bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth}; 6167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 6177bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} // end anonymous namespace 6187bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 619aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler CarruthINITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti", 6207bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth "No target information", true, true, true) 6217bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthchar NoTTI::ID = 0; 6227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 623aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler CarruthImmutablePass *llvm::createNoTargetTransformInfoPass() { 624aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return new NoTTI(); 6257bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 626