blob: 8714aae8eaa06f825538de9200f564ae7dce382d [file] [log] [blame]
Chandler Carruthc2c50cd2013-01-02 09:10:48 +00001//===- llvm/IR/TargetTransformInfo.cpp --------------------------*- C++ -*-===//
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"
Nadav Rotemcbd9a192012-10-18 23:22:48 +000011#include "llvm/TargetTransformInfo.h"
12#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
82TargetTransformInfo::PopcntHwSupport
83TargetTransformInfo::getPopcntHwSupport(unsigned IntTyWidthInBit) const {
84 return PrevTTI->getPopcntHwSupport(IntTyWidthInBit);
85}
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
95unsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode,
96 Type *Ty) const {
97 return PrevTTI->getArithmeticInstrCost(Opcode, Ty);
98}
99
100unsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp,
101 int Index, Type *SubTp) const {
102 return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp);
103}
104
105unsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst,
106 Type *Src) const {
107 return PrevTTI->getCastInstrCost(Opcode, Dst, Src);
108}
109
110unsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const {
111 return PrevTTI->getCFInstrCost(Opcode);
112}
113
114unsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
115 Type *CondTy) const {
116 return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy);
117}
118
119unsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val,
120 unsigned Index) const {
121 return PrevTTI->getVectorInstrCost(Opcode, Val, Index);
122}
123
124unsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src,
125 unsigned Alignment,
126 unsigned AddressSpace) const {
127 return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace);
128 ;
129}
130
131unsigned
132TargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID,
133 Type *RetTy,
134 ArrayRef<Type *> Tys) const {
135 return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys);
136}
137
138unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {
139 return PrevTTI->getNumberOfParts(Tp);
140}
141
142
143namespace {
144
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000145struct NoTTI : ImmutablePass, TargetTransformInfo {
146 NoTTI() : ImmutablePass(ID) {
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000147 initializeNoTTIPass(*PassRegistry::getPassRegistry());
148 }
149
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000150 virtual void initializePass() {
151 // Note that this subclass is special, and must *not* call initializeTTI as
152 // it does not chain.
153 PrevTTI = 0;
154 }
155
156 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000157 // Note that this subclass is special, and must *not* call
158 // TTI::getAnalysisUsage as it breaks the recursion.
159 }
160
161 /// Pass identification.
162 static char ID;
163
164 /// Provide necessary pointer adjustments for the two base classes.
165 virtual void *getAdjustedAnalysisPointer(const void *ID) {
166 if (ID == &TargetTransformInfo::ID)
167 return (TargetTransformInfo*)this;
168 return this;
169 }
170
171
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000172 bool isLegalAddImmediate(int64_t Imm) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000173 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000174 }
175
176 bool isLegalICmpImmediate(int64_t Imm) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000177 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000178 }
179
180 bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
181 bool HasBaseReg, int64_t Scale) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000182 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000183 }
184
185 bool isTruncateFree(Type *Ty1, Type *Ty2) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000186 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000187 }
188
189 bool isTypeLegal(Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000190 return false;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000191 }
192
193 unsigned getJumpBufAlignment() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000194 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000195 }
196
197 unsigned getJumpBufSize() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000198 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000199 }
200
201 bool shouldBuildLookupTables() const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000202 return true;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000203 }
204
205 PopcntHwSupport getPopcntHwSupport(unsigned IntTyWidthInBit) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000206 return None;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000207 }
208
209 unsigned getIntImmCost(const APInt &Imm, Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000210 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000211 }
212
213 unsigned getNumberOfRegisters(bool Vector) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000214 return 8;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000215 }
216
217 unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000218 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000219 }
220
221 unsigned getShuffleCost(ShuffleKind Kind, Type *Tp,
222 int Index = 0, Type *SubTp = 0) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000223 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000224 }
225
226 unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
227 Type *Src) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000228 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000229 }
230
231 unsigned getCFInstrCost(unsigned Opcode) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000232 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000233 }
234
235 unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
236 Type *CondTy = 0) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000237 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000238 }
239
240 unsigned getVectorInstrCost(unsigned Opcode, Type *Val,
241 unsigned Index = -1) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000242 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000243 }
244
245 unsigned getMemoryOpCost(unsigned Opcode, Type *Src,
246 unsigned Alignment,
247 unsigned AddressSpace) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000248 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000249 }
250
251 unsigned getIntrinsicInstrCost(Intrinsic::ID ID,
252 Type *RetTy,
253 ArrayRef<Type*> Tys) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000254 return 1;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000255 }
256
257 unsigned getNumberOfParts(Type *Tp) const {
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000258 return 0;
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000259 }
260};
261
262} // end anonymous namespace
263
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000264INITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti",
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000265 "No target information", true, true, true)
266char NoTTI::ID = 0;
267
Chandler Carruthaeef83c2013-01-07 01:37:14 +0000268ImmutablePass *llvm::createNoTargetTransformInfoPass() {
269 return new NoTTI();
Chandler Carruth7bdf6b02013-01-05 11:43:11 +0000270}