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