TargetTransformInfo.cpp revision a8a7099c1849fcbb4a68642a292fd0250aa46505
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 10aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth#define DEBUG_TYPE "tti" 11be04929f7fd76a921540e9901f24563e51dc1219Chandler Carruth#include "llvm/Analysis/TargetTransformInfo.h" 121e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/DataLayout.h" 131e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Operator.h" 141e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instruction.h" 151e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/IntrinsicInst.h" 161e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth#include "llvm/IR/Instructions.h" 1713086a658ae06046ded902229f9918b8bad505bdChandler Carruth#include "llvm/Support/CallSite.h" 18cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem#include "llvm/Support/ErrorHandling.h" 19cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 20cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotemusing namespace llvm; 21cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth// Setup the analysis group to manage the TargetTransformInfo passes. 237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthINITIALIZE_ANALYSIS_GROUP(TargetTransformInfo, "Target Information", NoTTI) 24cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotemchar TargetTransformInfo::ID = 0; 25cbd9a19b5d6ff93efa82c467508ede78b8af3bacNadav Rotem 267bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthTargetTransformInfo::~TargetTransformInfo() { 277bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 287bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 29aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid TargetTransformInfo::pushTTIStack(Pass *P) { 30aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth TopTTI = this; 31aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PrevTTI = &P->getAnalysis<TargetTransformInfo>(); 32aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 33aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // Walk up the chain and update the top TTI pointer. 34aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI) 35aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PTTI->TopTTI = this; 36aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth} 37aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 38aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthvoid TargetTransformInfo::popTTIStack() { 39aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth TopTTI = 0; 40aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 41aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // Walk up the chain and update the top TTI pointer. 42aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI) 43aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PTTI->TopTTI = PrevTTI; 44aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 45aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PrevTTI = 0; 46aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth} 47aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth 487bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthvoid TargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const { 497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth AU.addRequired<TargetTransformInfo>(); 507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 521e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getOperationCost(unsigned Opcode, Type *Ty, 531e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth Type *OpTy) const { 541e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getOperationCost(Opcode, Ty, OpTy); 551e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 561e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 571e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getGEPCost( 581e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth const Value *Ptr, ArrayRef<const Value *> Operands) const { 591e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getGEPCost(Ptr, Operands); 601e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 611e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 6213086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost(FunctionType *FTy, 6313086a658ae06046ded902229f9918b8bad505bdChandler Carruth int NumArgs) const { 6413086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(FTy, NumArgs); 6513086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 6613086a658ae06046ded902229f9918b8bad505bdChandler Carruth 6713086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost(const Function *F, 6813086a658ae06046ded902229f9918b8bad505bdChandler Carruth int NumArgs) const { 6913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(F, NumArgs); 7013086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 7113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 7213086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getCallCost( 7313086a658ae06046ded902229f9918b8bad505bdChandler Carruth const Function *F, ArrayRef<const Value *> Arguments) const { 7413086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getCallCost(F, Arguments); 7513086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 7613086a658ae06046ded902229f9918b8bad505bdChandler Carruth 7713086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getIntrinsicCost( 7813086a658ae06046ded902229f9918b8bad505bdChandler Carruth Intrinsic::ID IID, Type *RetTy, ArrayRef<Type *> ParamTys) const { 7913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getIntrinsicCost(IID, RetTy, ParamTys); 8013086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 8113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 8213086a658ae06046ded902229f9918b8bad505bdChandler Carruthunsigned TargetTransformInfo::getIntrinsicCost( 8313086a658ae06046ded902229f9918b8bad505bdChandler Carruth Intrinsic::ID IID, Type *RetTy, ArrayRef<const Value *> Arguments) const { 8413086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->getIntrinsicCost(IID, RetTy, Arguments); 8513086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 8613086a658ae06046ded902229f9918b8bad505bdChandler Carruth 871e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruthunsigned TargetTransformInfo::getUserCost(const User *U) const { 881e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return PrevTTI->getUserCost(U); 891e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth} 901e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 9157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellardbool TargetTransformInfo::hasBranchDivergence() const { 9257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard return PrevTTI->hasBranchDivergence(); 9357e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard} 9457e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard 9513086a658ae06046ded902229f9918b8bad505bdChandler Carruthbool TargetTransformInfo::isLoweredToCall(const Function *F) const { 9613086a658ae06046ded902229f9918b8bad505bdChandler Carruth return PrevTTI->isLoweredToCall(F); 9713086a658ae06046ded902229f9918b8bad505bdChandler Carruth} 9813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const { 1007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalAddImmediate(Imm); 1017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const { 1047bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalICmpImmediate(Imm); 1057bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, 1087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int64_t BaseOffset, 1097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool HasBaseReg, 1107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int64_t Scale) const { 1117bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, 1127bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Scale); 1137bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1147bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 11506f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombetint TargetTransformInfo::getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, 11606f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int64_t BaseOffset, 11706f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet bool HasBaseReg, 11806f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int64_t Scale) const { 11906f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return PrevTTI->getScalingFactorCost(Ty, BaseGV, BaseOffset, HasBaseReg, 12006f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet Scale); 12106f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet} 12206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 1237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const { 1247bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isTruncateFree(Ty1, Ty2); 1257bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1267bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1277bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::isTypeLegal(Type *Ty) const { 1287bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->isTypeLegal(Ty); 1297bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1307bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1317bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufAlignment() const { 1327bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getJumpBufAlignment(); 1337bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1347bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1357bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getJumpBufSize() const { 1367bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getJumpBufSize(); 1377bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1387bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1397bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthbool TargetTransformInfo::shouldBuildLookupTables() const { 1407bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->shouldBuildLookupTables(); 1417bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1427bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 143d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::PopcntSupportKind 144d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler CarruthTargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const { 145d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler Carruth return PrevTTI->getPopcntSupport(IntTyWidthInBit); 1467bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1477bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 148a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandifordbool TargetTransformInfo::haveFastSqrt(Type *Ty) const { 149a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford return PrevTTI->haveFastSqrt(Ty); 150a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford} 151a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford 1527bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const { 1537bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getIntImmCost(Imm, Ty); 1547bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1567bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const { 1577bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getNumberOfRegisters(Vector); 1587bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1597bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 16014925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotemunsigned TargetTransformInfo::getRegisterBitWidth(bool Vector) const { 16114925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem return PrevTTI->getRegisterBitWidth(Vector); 16214925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem} 16314925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem 16483be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotemunsigned TargetTransformInfo::getMaximumUnrollFactor() const { 16583be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem return PrevTTI->getMaximumUnrollFactor(); 16683be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem} 16783be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem 1687bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode, 1696bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer Type *Ty, 1706bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer OperandValueKind Op1Info, 1716bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer OperandValueKind Op2Info) const { 1726bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer return PrevTTI->getArithmeticInstrCost(Opcode, Ty, Op1Info, Op2Info); 1737bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1747bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1757bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp, 1767bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int Index, Type *SubTp) const { 1777bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp); 1787bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1797bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1807bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst, 1817bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *Src) const { 1827bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCastInstrCost(Opcode, Dst, Src); 1837bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1847bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1857bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const { 1867bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCFInstrCost(Opcode); 1877bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1887bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1897bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, 1907bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *CondTy) const { 1917bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy); 1927bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1937bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1947bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val, 1957bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Index) const { 1967bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getVectorInstrCost(Opcode, Val, Index); 1977bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 1987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 1997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src, 2007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Alignment, 2017bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned AddressSpace) const { 2027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace); 2037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth ; 2047bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2057bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned 2077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler CarruthTargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID, 2087bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *RetTy, 2097bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth ArrayRef<Type *> Tys) const { 2107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys); 2117bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2127bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2137bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthunsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const { 2147bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return PrevTTI->getNumberOfParts(Tp); 2157bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 2167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 217c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighoferunsigned TargetTransformInfo::getAddressComputationCost(Type *Tp, 218c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighofer bool IsComplex) const { 219c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighofer return PrevTTI->getAddressComputationCost(Tp, IsComplex); 220fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer} 2217bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthnamespace { 2237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 224aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruthstruct NoTTI : ImmutablePass, TargetTransformInfo { 2251e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth const DataLayout *DL; 2261e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2271e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth NoTTI() : ImmutablePass(ID), DL(0) { 228aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth initializeNoTTIPass(*PassRegistry::getPassRegistry()); 2297bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2307bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 231aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth virtual void initializePass() { 232aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // Note that this subclass is special, and must *not* call initializeTTI as 233aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth // it does not chain. 23413086a658ae06046ded902229f9918b8bad505bdChandler Carruth TopTTI = this; 235aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth PrevTTI = 0; 2361e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth DL = getAnalysisIfAvailable<DataLayout>(); 2377bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2387bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 239aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth virtual void getAnalysisUsage(AnalysisUsage &AU) const { 2407bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth // Note that this subclass is special, and must *not* call 2417bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth // TTI::getAnalysisUsage as it breaks the recursion. 2427bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2437bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2447bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth /// Pass identification. 2457bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth static char ID; 2467bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2477bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth /// Provide necessary pointer adjustments for the two base classes. 2487bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth virtual void *getAdjustedAnalysisPointer(const void *ID) { 2497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth if (ID == &TargetTransformInfo::ID) 2507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return (TargetTransformInfo*)this; 2517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth return this; 2527bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 2537bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 2541e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth unsigned getOperationCost(unsigned Opcode, Type *Ty, Type *OpTy) const { 2551e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth switch (Opcode) { 2561e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth default: 2571e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // By default, just classify everything as 'basic'. 2581e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2591e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2601e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::GetElementPtr: 2611e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth llvm_unreachable("Use getGEPCost for GEP operations!"); 2621e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2631e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::BitCast: 2641e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth assert(OpTy && "Cast instructions must provide the operand type"); 2651e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (Ty == OpTy || (Ty->isPointerTy() && OpTy->isPointerTy())) 2661e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Identity and pointer-to-pointer casts are free. 2671e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2681e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2691e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise, the default basic cost is used. 2701e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2711e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2721e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::IntToPtr: 2731e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // An inttoptr cast is free so long as the input is a legal integer type 2741e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // which doesn't contain values outside the range of a pointer. 2751e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (DL && DL->isLegalInteger(OpTy->getScalarSizeInBits()) && 2761e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth OpTy->getScalarSizeInBits() <= DL->getPointerSizeInBits()) 2771e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2781e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2791e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise it's not a no-op. 2801e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2811e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2821e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::PtrToInt: 2831e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // A ptrtoint cast is free so long as the result is large enough to store 2841e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // the pointer, and a legal integer type. 285ac5b3915aa64d287057752c2c90cfe04adacfa11Patrik Hagglund if (DL && DL->isLegalInteger(Ty->getScalarSizeInBits()) && 286ac5b3915aa64d287057752c2c90cfe04adacfa11Patrik Hagglund Ty->getScalarSizeInBits() >= DL->getPointerSizeInBits()) 2871e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2881e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2891e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise it's not a no-op. 2901e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2911e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2921e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth case Instruction::Trunc: 2931e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // trunc to a native type is free (assuming the target has compare and 2941e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // shift-right of the same width). 2951e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (DL && DL->isLegalInteger(DL->getTypeSizeInBits(Ty))) 2961e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 2971e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 2981e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 2991e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3001e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3011e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3021e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth unsigned getGEPCost(const Value *Ptr, 3031e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth ArrayRef<const Value *> Operands) const { 3041e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // In the basic model, we just assume that all-constant GEPs will be folded 3051e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // into their uses via addressing modes. 3061e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth for (unsigned Idx = 0, Size = Operands.size(); Idx != Size; ++Idx) 3071e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (!isa<Constant>(Operands[Idx])) 3081e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Basic; 3091e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 3101e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 3111e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 3121e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 31313086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getCallCost(FunctionType *FTy, int NumArgs = -1) const { 31413086a658ae06046ded902229f9918b8bad505bdChandler Carruth assert(FTy && "FunctionType must be provided to this routine."); 31513086a658ae06046ded902229f9918b8bad505bdChandler Carruth 31613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // The target-independent implementation just measures the size of the 31713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function by approximating that each argument will take on average one 31813086a658ae06046ded902229f9918b8bad505bdChandler Carruth // instruction to prepare. 31913086a658ae06046ded902229f9918b8bad505bdChandler Carruth 32013086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (NumArgs < 0) 32113086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Set the argument number to the number of explicit arguments in the 32213086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function. 32313086a658ae06046ded902229f9918b8bad505bdChandler Carruth NumArgs = FTy->getNumParams(); 32413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 32513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic * (NumArgs + 1); 32613086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 32713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 32813086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getCallCost(const Function *F, int NumArgs = -1) const { 32913086a658ae06046ded902229f9918b8bad505bdChandler Carruth assert(F && "A concrete function must be provided to this routine."); 33013086a658ae06046ded902229f9918b8bad505bdChandler Carruth 33113086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (NumArgs < 0) 33213086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Set the argument number to the number of explicit arguments in the 33313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // function. 33413086a658ae06046ded902229f9918b8bad505bdChandler Carruth NumArgs = F->arg_size(); 33513086a658ae06046ded902229f9918b8bad505bdChandler Carruth 33613086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Intrinsic::ID IID = (Intrinsic::ID)F->getIntrinsicID()) { 33713086a658ae06046ded902229f9918b8bad505bdChandler Carruth FunctionType *FTy = F->getFunctionType(); 33813086a658ae06046ded902229f9918b8bad505bdChandler Carruth SmallVector<Type *, 8> ParamTys(FTy->param_begin(), FTy->param_end()); 33913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getIntrinsicCost(IID, FTy->getReturnType(), ParamTys); 34013086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 34113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 34213086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (!TopTTI->isLoweredToCall(F)) 34313086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic; // Give a basic cost if it will be lowered directly. 34413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 34513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F->getFunctionType(), NumArgs); 34613086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 34713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 34813086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getCallCost(const Function *F, 34913086a658ae06046ded902229f9918b8bad505bdChandler Carruth ArrayRef<const Value *> Arguments) const { 35013086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Simply delegate to generic handling of the call. 35113086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: We should use instsimplify or something else to catch calls which 35213086a658ae06046ded902229f9918b8bad505bdChandler Carruth // will constant fold with these arguments. 35313086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F, Arguments.size()); 35413086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 35513086a658ae06046ded902229f9918b8bad505bdChandler Carruth 35613086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, 35713086a658ae06046ded902229f9918b8bad505bdChandler Carruth ArrayRef<Type *> ParamTys) const { 35813086a658ae06046ded902229f9918b8bad505bdChandler Carruth switch (IID) { 35913086a658ae06046ded902229f9918b8bad505bdChandler Carruth default: 36013086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Intrinsics rarely (if ever) have normal argument setup constraints. 36113086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Model them as having a basic instruction cost. 36213086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: This is wrong for libc intrinsics. 36313086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Basic; 36413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 36513086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::dbg_declare: 36613086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::dbg_value: 36713086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::invariant_start: 36813086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::invariant_end: 36913086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::lifetime_start: 37013086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::lifetime_end: 37113086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::objectsize: 37213086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::ptr_annotation: 37313086a658ae06046ded902229f9918b8bad505bdChandler Carruth case Intrinsic::var_annotation: 37413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These intrinsics don't actually represent code after lowering. 37513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TCC_Free; 37613086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 37713086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 37813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 37913086a658ae06046ded902229f9918b8bad505bdChandler Carruth unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy, 38013086a658ae06046ded902229f9918b8bad505bdChandler Carruth ArrayRef<const Value *> Arguments) const { 38113086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Delegate to the generic intrinsic handling code. This mostly provides an 38213086a658ae06046ded902229f9918b8bad505bdChandler Carruth // opportunity for targets to (for example) special case the cost of 38313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // certain intrinsics based on constants used as arguments. 38413086a658ae06046ded902229f9918b8bad505bdChandler Carruth SmallVector<Type *, 8> ParamTys; 38513086a658ae06046ded902229f9918b8bad505bdChandler Carruth ParamTys.reserve(Arguments.size()); 38613086a658ae06046ded902229f9918b8bad505bdChandler Carruth for (unsigned Idx = 0, Size = Arguments.size(); Idx != Size; ++Idx) 38713086a658ae06046ded902229f9918b8bad505bdChandler Carruth ParamTys.push_back(Arguments[Idx]->getType()); 38813086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getIntrinsicCost(IID, RetTy, ParamTys); 38913086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 39013086a658ae06046ded902229f9918b8bad505bdChandler Carruth 3911e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth unsigned getUserCost(const User *U) const { 392a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth if (isa<PHINode>(U)) 393a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth return TCC_Free; // Model all PHI nodes as free. 394a5157e68d183e1bdf010e94a15dc0c44b65f889bChandler Carruth 3951e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (const GEPOperator *GEP = dyn_cast<GEPOperator>(U)) 3961e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // In the basic model we just assume that all-constant GEPs will be 3971e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // folded into their uses via addressing modes. 3981e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return GEP->hasAllConstantIndices() ? TCC_Free : TCC_Basic; 3991e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 40013086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (ImmutableCallSite CS = U) { 40113086a658ae06046ded902229f9918b8bad505bdChandler Carruth const Function *F = CS.getCalledFunction(); 40213086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (!F) { 40313086a658ae06046ded902229f9918b8bad505bdChandler Carruth // Just use the called value type. 40413086a658ae06046ded902229f9918b8bad505bdChandler Carruth Type *FTy = CS.getCalledValue()->getType()->getPointerElementType(); 40513086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(cast<FunctionType>(FTy), CS.arg_size()); 4061e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 40713086a658ae06046ded902229f9918b8bad505bdChandler Carruth 40813086a658ae06046ded902229f9918b8bad505bdChandler Carruth SmallVector<const Value *, 8> Arguments; 40913086a658ae06046ded902229f9918b8bad505bdChandler Carruth for (ImmutableCallSite::arg_iterator AI = CS.arg_begin(), 41013086a658ae06046ded902229f9918b8bad505bdChandler Carruth AE = CS.arg_end(); 41113086a658ae06046ded902229f9918b8bad505bdChandler Carruth AI != AE; ++AI) 41213086a658ae06046ded902229f9918b8bad505bdChandler Carruth Arguments.push_back(*AI); 41313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 41413086a658ae06046ded902229f9918b8bad505bdChandler Carruth return TopTTI->getCallCost(F, Arguments); 4151e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4161e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 4171e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (const CastInst *CI = dyn_cast<CastInst>(U)) { 4181e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Result of a cmp instruction is often extended (to be used by other 4191e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // cmp instructions, logical or return instructions). These are usually 4201e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // nop on most sane targets. 4211e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth if (isa<CmpInst>(CI->getOperand(0))) 4221e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return TCC_Free; 4231e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4241e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth 4251e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth // Otherwise delegate to the fully generic implementations. 4261e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth return getOperationCost(Operator::getOpcode(U), U->getType(), 4271e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth U->getNumOperands() == 1 ? 4281e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth U->getOperand(0)->getType() : 0); 4291e05bd9e714934a71ff933ad15f0b884808b405fChandler Carruth } 4307bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 43157e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard bool hasBranchDivergence() const { return false; } 43257e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard 43313086a658ae06046ded902229f9918b8bad505bdChandler Carruth bool isLoweredToCall(const Function *F) const { 43413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // FIXME: These should almost certainly not be handled here, and instead 43513086a658ae06046ded902229f9918b8bad505bdChandler Carruth // handled with the help of TLI or the target itself. This was largely 43613086a658ae06046ded902229f9918b8bad505bdChandler Carruth // ported from existing analysis heuristics here so that such refactorings 43713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // can take place in the future. 43813086a658ae06046ded902229f9918b8bad505bdChandler Carruth 43913086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (F->isIntrinsic()) 44013086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 44113086a658ae06046ded902229f9918b8bad505bdChandler Carruth 44213086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (F->hasLocalLinkage() || !F->hasName()) 44313086a658ae06046ded902229f9918b8bad505bdChandler Carruth return true; 44413086a658ae06046ded902229f9918b8bad505bdChandler Carruth 44513086a658ae06046ded902229f9918b8bad505bdChandler Carruth StringRef Name = F->getName(); 44613086a658ae06046ded902229f9918b8bad505bdChandler Carruth 44713086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These will all likely lower to a single selection DAG node. 44813086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Name == "copysign" || Name == "copysignf" || Name == "copysignl" || 44913086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "fabs" || Name == "fabsf" || Name == "fabsl" || Name == "sin" || 45013086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "sinf" || Name == "sinl" || Name == "cos" || Name == "cosf" || 45113086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "cosl" || Name == "sqrt" || Name == "sqrtf" || Name == "sqrtl") 45213086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 45313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 45413086a658ae06046ded902229f9918b8bad505bdChandler Carruth // These are all likely to be optimized into something smaller. 45513086a658ae06046ded902229f9918b8bad505bdChandler Carruth if (Name == "pow" || Name == "powf" || Name == "powl" || Name == "exp2" || 45613086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "exp2l" || Name == "exp2f" || Name == "floor" || Name == 45713086a658ae06046ded902229f9918b8bad505bdChandler Carruth "floorf" || Name == "ceil" || Name == "round" || Name == "ffs" || 45813086a658ae06046ded902229f9918b8bad505bdChandler Carruth Name == "ffsl" || Name == "abs" || Name == "labs" || Name == "llabs") 45913086a658ae06046ded902229f9918b8bad505bdChandler Carruth return false; 46013086a658ae06046ded902229f9918b8bad505bdChandler Carruth 46113086a658ae06046ded902229f9918b8bad505bdChandler Carruth return true; 46213086a658ae06046ded902229f9918b8bad505bdChandler Carruth } 46313086a658ae06046ded902229f9918b8bad505bdChandler Carruth 4647bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isLegalAddImmediate(int64_t Imm) const { 465aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4667bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4677bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 4687bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isLegalICmpImmediate(int64_t Imm) const { 469aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4707bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4717bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 4727bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, 4737bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool HasBaseReg, int64_t Scale) const { 474e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth // Guess that reg+reg addressing is allowed. This heuristic is taken from 475e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth // the implementation of LSR. 476e4ba75f43e2ab1480d119d2d4eb878256274e0fbChandler Carruth return !BaseGV && BaseOffset == 0 && Scale <= 1; 4777bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4787bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 47906f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset, 48006f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet bool HasBaseReg, int64_t Scale) const { 48106f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet // Guess that all legal addressing mode are free. 48206f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet if(isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, Scale)) 48306f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return 0; 48406f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet return -1; 48506f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet } 48606f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 48706f5ebc5a1604b01689cf2d482dd05f956538af6Quentin Colombet 4887bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isTruncateFree(Type *Ty1, Type *Ty2) const { 489aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4907bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4917bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 4927bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool isTypeLegal(Type *Ty) const { 493aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return false; 4947bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4957bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 4967bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getJumpBufAlignment() const { 497aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 4987bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 4997bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5007bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getJumpBufSize() const { 501aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 5027bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5037bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5047bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth bool shouldBuildLookupTables() const { 505aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return true; 5067bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5077bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 508d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler Carruth PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const { 509d1b8ef97c47d347f2a2261a0d6de4872f248321fChandler Carruth return PSK_Software; 5107bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5117bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 512a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford bool haveFastSqrt(Type *Ty) const { 513a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford return false; 514a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford } 515a8a7099c1849fcbb4a68642a292fd0250aa46505Richard Sandiford 5167bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getIntImmCost(const APInt &Imm, Type *Ty) const { 517aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5187bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5197bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5207bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getNumberOfRegisters(bool Vector) const { 521aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 8; 5227bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5237bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 52414925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem unsigned getRegisterBitWidth(bool Vector) const { 52514925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem return 32; 52614925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem } 52714925e6b885f8bd8cf448627386d412831f4bf1bNadav Rotem 52883be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem unsigned getMaximumUnrollFactor() const { 52983be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem return 1; 53083be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem } 53183be7b0dd3ae9a3cb22d36ae4c1775972553b94bNadav Rotem 5326bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty, OperandValueKind, 5336bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer OperandValueKind) const { 534aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5357bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5367bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5377bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getShuffleCost(ShuffleKind Kind, Type *Tp, 5387bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth int Index = 0, Type *SubTp = 0) const { 539aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5407bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5417bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5427bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getCastInstrCost(unsigned Opcode, Type *Dst, 5437bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *Src) const { 544aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5457bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5467bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5477bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getCFInstrCost(unsigned Opcode) const { 548aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5497bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5507bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5517bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, 5527bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *CondTy = 0) const { 553aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5547bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5557bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5567bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getVectorInstrCost(unsigned Opcode, Type *Val, 5577bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Index = -1) const { 558aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5597bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5607bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5617bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getMemoryOpCost(unsigned Opcode, Type *Src, 5627bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned Alignment, 5637bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned AddressSpace) const { 564aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5657bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5667bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5677bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getIntrinsicInstrCost(Intrinsic::ID ID, 5687bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth Type *RetTy, 5697bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth ArrayRef<Type*> Tys) const { 570aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 1; 5717bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 5727bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5737bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth unsigned getNumberOfParts(Type *Tp) const { 574aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return 0; 5757bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth } 576fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer 577c0a11edba6ea46c782672ab3fb4e4ab3dc267a22Arnold Schwaighofer unsigned getAddressComputationCost(Type *Tp, bool) const { 578fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer return 0; 579fb55a8fd7c38aa09d9c243d48a8a72d890f36a3dArnold Schwaighofer } 5807bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth}; 5817bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 5827bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} // end anonymous namespace 5837bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 584aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler CarruthINITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti", 5857bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth "No target information", true, true, true) 5867bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruthchar NoTTI::ID = 0; 5877bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth 588aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler CarruthImmutablePass *llvm::createNoTargetTransformInfoPass() { 589aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth return new NoTTI(); 5907bdf6b00e04c177f22133b5d4be10cb246cb1e76Chandler Carruth} 591