blob: 3ef74eb2d6431f8c8cb93701164e622f9ae5433f [file] [log] [blame]
Chandler Carruthbe049292013-01-07 03:08:10 +00001//===- llvm/Analysis/TargetTransformInfo.cpp ------------------------------===//
Nadav Rotemcbd9a192012-10-18 23:22:48 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruthaeef83c2013-01-07 01:37:14 +000010#define DEBUG_TYPE "tti"
Chandler Carruthbe049292013-01-07 03:08:10 +000011#include "llvm/Analysis/TargetTransformInfo.h"
Nadav Rotemcbd9a192012-10-18 23:22:48 +000012#include "llvm/Support/ErrorHandling.h"
13
14using namespace llvm;
15
Chandler Carruth7bdf6b02013-01-05 11:43:11 +000016// Setup the analysis group to manage the TargetTransformInfo passes.
17INITIALIZE_ANALYSIS_GROUP(TargetTransformInfo, "Target Information", NoTTI)
Nadav Rotemcbd9a192012-10-18 23:22:48 +000018char TargetTransformInfo::ID = 0;
19
Chandler Carruth7bdf6b02013-01-05 11:43:11 +000020TargetTransformInfo::~TargetTransformInfo() {
21}
22
Chandler Carruthaeef83c2013-01-07 01:37:14 +000023void TargetTransformInfo::pushTTIStack(Pass *P) {
24 TopTTI = this;
25 PrevTTI = &P->getAnalysis<TargetTransformInfo>();
26
27 // Walk up the chain and update the top TTI pointer.
28 for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI)
29 PTTI->TopTTI = this;
30}
31
32void TargetTransformInfo::popTTIStack() {
33 TopTTI = 0;
34
35 // Walk up the chain and update the top TTI pointer.
36 for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI)
37 PTTI->TopTTI = PrevTTI;
38
39 PrevTTI = 0;
40}
41
Chandler Carruth7bdf6b02013-01-05 11:43:11 +000042void TargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const {
43 AU.addRequired<TargetTransformInfo>();
44}
45
46bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
47 return PrevTTI->isLegalAddImmediate(Imm);
48}
49
50bool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const {
51 return PrevTTI->isLegalICmpImmediate(Imm);
52}
53
54bool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV,
55 int64_t BaseOffset,
56 bool HasBaseReg,
57 int64_t Scale) const {
58 return PrevTTI->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
59 Scale);
60}
61
62bool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const {
63 return PrevTTI->isTruncateFree(Ty1, Ty2);
64}
65
66bool TargetTransformInfo::isTypeLegal(Type *Ty) const {
67 return PrevTTI->isTypeLegal(Ty);
68}
69
70unsigned TargetTransformInfo::getJumpBufAlignment() const {
71 return PrevTTI->getJumpBufAlignment();
72}
73
74unsigned TargetTransformInfo::getJumpBufSize() const {
75 return PrevTTI->getJumpBufSize();
76}
77
78bool TargetTransformInfo::shouldBuildLookupTables() const {
79 return PrevTTI->shouldBuildLookupTables();
80}
81
Chandler Carruthd1b8ef92013-01-07 03:16:03 +000082TargetTransformInfo::PopcntSupportKind
83TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
84 return PrevTTI->getPopcntSupport(IntTyWidthInBit);
Chandler Carruth7bdf6b02013-01-05 11:43:11 +000085}
86
87unsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const {
88 return PrevTTI->getIntImmCost(Imm, Ty);
89}
90
91unsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const {
92 return PrevTTI->getNumberOfRegisters(Vector);
93}
94
Nadav Rotem14925e62013-01-09 22:29:00 +000095unsigned TargetTransformInfo::getRegisterBitWidth(bool Vector) const {
96 return PrevTTI->getRegisterBitWidth(Vector);
97}
98
Nadav Rotem83be7b02013-01-09 01:15:42 +000099unsigned TargetTransformInfo::getMaximumUnrollFactor() const {
100 return PrevTTI->getMaximumUnrollFactor();
101}
102
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000103unsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode,
104 Type *Ty) const {
105 return PrevTTI->getArithmeticInstrCost(Opcode, Ty);
106}
107
108unsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp,
109 int Index, Type *SubTp) const {
110 return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp);
111}
112
113unsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst,
114 Type *Src) const {
115 return PrevTTI->getCastInstrCost(Opcode, Dst, Src);
116}
117
118unsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const {
119 return PrevTTI->getCFInstrCost(Opcode);
120}
121
122unsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
123 Type *CondTy) const {
124 return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy);
125}
126
127unsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val,
128 unsigned Index) const {
129 return PrevTTI->getVectorInstrCost(Opcode, Val, Index);
130}
131
132unsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src,
133 unsigned Alignment,
134 unsigned AddressSpace) const {
135 return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace);
136 ;
137}
138
139unsigned
140TargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID,
141 Type *RetTy,
142 ArrayRef<Type *> Tys) const {
143 return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys);
144}
145
146unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {
147 return PrevTTI->getNumberOfParts(Tp);
148}
149
150
151namespace {
152
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000153struct NoTTI : ImmutablePass, TargetTransformInfo {
154 NoTTI() : ImmutablePass(ID) {
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000155 initializeNoTTIPass(*PassRegistry::getPassRegistry());
156 }
157
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000158 virtual void initializePass() {
159 // Note that this subclass is special, and must *not* call initializeTTI as
160 // it does not chain.
161 PrevTTI = 0;
162 }
163
164 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000165 // Note that this subclass is special, and must *not* call
166 // TTI::getAnalysisUsage as it breaks the recursion.
167 }
168
169 /// Pass identification.
170 static char ID;
171
172 /// Provide necessary pointer adjustments for the two base classes.
173 virtual void *getAdjustedAnalysisPointer(const void *ID) {
174 if (ID == &TargetTransformInfo::ID)
175 return (TargetTransformInfo*)this;
176 return this;
177 }
178
179
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000180 bool isLegalAddImmediate(int64_t Imm) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000181 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000182 }
183
184 bool isLegalICmpImmediate(int64_t Imm) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000185 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000186 }
187
188 bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
189 bool HasBaseReg, int64_t Scale) const {
Chandler Carruthe4ba75f2013-01-07 14:41:08 +0000190 // Guess that reg+reg addressing is allowed. This heuristic is taken from
191 // the implementation of LSR.
192 return !BaseGV && BaseOffset == 0 && Scale <= 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000193 }
194
195 bool isTruncateFree(Type *Ty1, Type *Ty2) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000196 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000197 }
198
199 bool isTypeLegal(Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000200 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000201 }
202
203 unsigned getJumpBufAlignment() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000204 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000205 }
206
207 unsigned getJumpBufSize() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000208 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000209 }
210
211 bool shouldBuildLookupTables() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000212 return true;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000213 }
214
Chandler Carruthd1b8ef92013-01-07 03:16:03 +0000215 PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const {
216 return PSK_Software;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000217 }
218
219 unsigned getIntImmCost(const APInt &Imm, Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000220 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000221 }
222
223 unsigned getNumberOfRegisters(bool Vector) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000224 return 8;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000225 }
226
Nadav Rotem14925e62013-01-09 22:29:00 +0000227 unsigned getRegisterBitWidth(bool Vector) const {
228 return 32;
229 }
230
Nadav Rotem83be7b02013-01-09 01:15:42 +0000231 unsigned getMaximumUnrollFactor() const {
232 return 1;
233 }
234
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000235 unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000236 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000237 }
238
239 unsigned getShuffleCost(ShuffleKind Kind, Type *Tp,
240 int Index = 0, Type *SubTp = 0) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000241 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000242 }
243
244 unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
245 Type *Src) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000246 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000247 }
248
249 unsigned getCFInstrCost(unsigned Opcode) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000250 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000251 }
252
253 unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
254 Type *CondTy = 0) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000255 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000256 }
257
258 unsigned getVectorInstrCost(unsigned Opcode, Type *Val,
259 unsigned Index = -1) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000260 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000261 }
262
263 unsigned getMemoryOpCost(unsigned Opcode, Type *Src,
264 unsigned Alignment,
265 unsigned AddressSpace) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000266 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000267 }
268
269 unsigned getIntrinsicInstrCost(Intrinsic::ID ID,
270 Type *RetTy,
271 ArrayRef<Type*> Tys) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000272 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000273 }
274
275 unsigned getNumberOfParts(Type *Tp) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000276 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000277 }
278};
279
280} // end anonymous namespace
281
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000282INITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti",
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000283 "No target information", true, true, true)
284char NoTTI::ID = 0;
285
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000286ImmutablePass *llvm::createNoTargetTransformInfoPass() {
287 return new NoTTI();
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000288}