blob: ac65437f0cc3f07ea843fd71e3715c923cedde15 [file] [log] [blame]
Chandler Carruthd3e73552013-01-07 03:08:10 +00001//===- llvm/Analysis/TargetTransformInfo.cpp ------------------------------===//
Nadav Rotem5dc203e2012-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 Carruth664e3542013-01-07 01:37:14 +000010#define DEBUG_TYPE "tti"
Chandler Carruthd3e73552013-01-07 03:08:10 +000011#include "llvm/Analysis/TargetTransformInfo.h"
Chandler Carruth511aa762013-01-21 01:27:39 +000012#include "llvm/IR/DataLayout.h"
Chandler Carruth511aa762013-01-21 01:27:39 +000013#include "llvm/IR/Instruction.h"
Chandler Carruth511aa762013-01-21 01:27:39 +000014#include "llvm/IR/Instructions.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000015#include "llvm/IR/IntrinsicInst.h"
16#include "llvm/IR/Operator.h"
Chandler Carruth0ba8db42013-01-22 11:26:02 +000017#include "llvm/Support/CallSite.h"
Nadav Rotem5dc203e2012-10-18 23:22:48 +000018#include "llvm/Support/ErrorHandling.h"
19
20using namespace llvm;
21
Chandler Carruth539edf42013-01-05 11:43:11 +000022// Setup the analysis group to manage the TargetTransformInfo passes.
23INITIALIZE_ANALYSIS_GROUP(TargetTransformInfo, "Target Information", NoTTI)
Nadav Rotem5dc203e2012-10-18 23:22:48 +000024char TargetTransformInfo::ID = 0;
25
Chandler Carruth539edf42013-01-05 11:43:11 +000026TargetTransformInfo::~TargetTransformInfo() {
27}
28
Chandler Carruth664e3542013-01-07 01:37:14 +000029void TargetTransformInfo::pushTTIStack(Pass *P) {
30 TopTTI = this;
31 PrevTTI = &P->getAnalysis<TargetTransformInfo>();
32
33 // Walk up the chain and update the top TTI pointer.
34 for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI)
35 PTTI->TopTTI = this;
36}
37
38void TargetTransformInfo::popTTIStack() {
39 TopTTI = 0;
40
41 // Walk up the chain and update the top TTI pointer.
42 for (TargetTransformInfo *PTTI = PrevTTI; PTTI; PTTI = PTTI->PrevTTI)
43 PTTI->TopTTI = PrevTTI;
44
45 PrevTTI = 0;
46}
47
Chandler Carruth539edf42013-01-05 11:43:11 +000048void TargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const {
49 AU.addRequired<TargetTransformInfo>();
50}
51
Chandler Carruth511aa762013-01-21 01:27:39 +000052unsigned TargetTransformInfo::getOperationCost(unsigned Opcode, Type *Ty,
53 Type *OpTy) const {
54 return PrevTTI->getOperationCost(Opcode, Ty, OpTy);
55}
56
57unsigned TargetTransformInfo::getGEPCost(
58 const Value *Ptr, ArrayRef<const Value *> Operands) const {
59 return PrevTTI->getGEPCost(Ptr, Operands);
60}
61
Chandler Carruth0ba8db42013-01-22 11:26:02 +000062unsigned TargetTransformInfo::getCallCost(FunctionType *FTy,
63 int NumArgs) const {
64 return PrevTTI->getCallCost(FTy, NumArgs);
65}
66
67unsigned TargetTransformInfo::getCallCost(const Function *F,
68 int NumArgs) const {
69 return PrevTTI->getCallCost(F, NumArgs);
70}
71
72unsigned TargetTransformInfo::getCallCost(
73 const Function *F, ArrayRef<const Value *> Arguments) const {
74 return PrevTTI->getCallCost(F, Arguments);
75}
76
77unsigned TargetTransformInfo::getIntrinsicCost(
78 Intrinsic::ID IID, Type *RetTy, ArrayRef<Type *> ParamTys) const {
79 return PrevTTI->getIntrinsicCost(IID, RetTy, ParamTys);
80}
81
82unsigned TargetTransformInfo::getIntrinsicCost(
83 Intrinsic::ID IID, Type *RetTy, ArrayRef<const Value *> Arguments) const {
84 return PrevTTI->getIntrinsicCost(IID, RetTy, Arguments);
85}
86
Chandler Carruth511aa762013-01-21 01:27:39 +000087unsigned TargetTransformInfo::getUserCost(const User *U) const {
88 return PrevTTI->getUserCost(U);
89}
90
Tom Stellard8b1e0212013-07-27 00:01:07 +000091bool TargetTransformInfo::hasBranchDivergence() const {
92 return PrevTTI->hasBranchDivergence();
93}
94
Chandler Carruth0ba8db42013-01-22 11:26:02 +000095bool TargetTransformInfo::isLoweredToCall(const Function *F) const {
96 return PrevTTI->isLoweredToCall(F);
97}
98
Hal Finkel8f2e7002013-09-11 19:25:43 +000099void TargetTransformInfo::getUnrollingPreferences(Loop *L,
100 UnrollingPreferences &UP) const {
101 PrevTTI->getUnrollingPreferences(L, UP);
102}
103
Chandler Carruth539edf42013-01-05 11:43:11 +0000104bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
105 return PrevTTI->isLegalAddImmediate(Imm);
106}
107
108bool TargetTransformInfo::isLegalICmpImmediate(int64_t Imm) const {
109 return PrevTTI->isLegalICmpImmediate(Imm);
110}
111
112bool TargetTransformInfo::isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV,
113 int64_t BaseOffset,
114 bool HasBaseReg,
115 int64_t Scale) const {
116 return PrevTTI->isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg,
117 Scale);
118}
119
Quentin Colombetbf490d42013-05-31 21:29:03 +0000120int TargetTransformInfo::getScalingFactorCost(Type *Ty, GlobalValue *BaseGV,
121 int64_t BaseOffset,
122 bool HasBaseReg,
123 int64_t Scale) const {
124 return PrevTTI->getScalingFactorCost(Ty, BaseGV, BaseOffset, HasBaseReg,
125 Scale);
126}
127
Chandler Carruth539edf42013-01-05 11:43:11 +0000128bool TargetTransformInfo::isTruncateFree(Type *Ty1, Type *Ty2) const {
129 return PrevTTI->isTruncateFree(Ty1, Ty2);
130}
131
132bool TargetTransformInfo::isTypeLegal(Type *Ty) const {
133 return PrevTTI->isTypeLegal(Ty);
134}
135
136unsigned TargetTransformInfo::getJumpBufAlignment() const {
137 return PrevTTI->getJumpBufAlignment();
138}
139
140unsigned TargetTransformInfo::getJumpBufSize() const {
141 return PrevTTI->getJumpBufSize();
142}
143
144bool TargetTransformInfo::shouldBuildLookupTables() const {
145 return PrevTTI->shouldBuildLookupTables();
146}
147
Chandler Carruth50a36cd2013-01-07 03:16:03 +0000148TargetTransformInfo::PopcntSupportKind
149TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
150 return PrevTTI->getPopcntSupport(IntTyWidthInBit);
Chandler Carruth539edf42013-01-05 11:43:11 +0000151}
152
Richard Sandiford37cd6cf2013-08-23 10:27:02 +0000153bool TargetTransformInfo::haveFastSqrt(Type *Ty) const {
154 return PrevTTI->haveFastSqrt(Ty);
155}
156
Chandler Carruth539edf42013-01-05 11:43:11 +0000157unsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const {
158 return PrevTTI->getIntImmCost(Imm, Ty);
159}
160
Juergen Ributzkaf26beda2014-01-25 02:02:55 +0000161unsigned TargetTransformInfo::getIntImmCost(unsigned Opcode, const APInt &Imm,
162 Type *Ty) const {
163 return PrevTTI->getIntImmCost(Opcode, Imm, Ty);
164}
165
166unsigned TargetTransformInfo::getIntImmCost(Intrinsic::ID IID, const APInt &Imm,
167 Type *Ty) const {
168 return PrevTTI->getIntImmCost(IID, Imm, Ty);
169}
170
Chandler Carruth539edf42013-01-05 11:43:11 +0000171unsigned TargetTransformInfo::getNumberOfRegisters(bool Vector) const {
172 return PrevTTI->getNumberOfRegisters(Vector);
173}
174
Nadav Rotemb1791a72013-01-09 22:29:00 +0000175unsigned TargetTransformInfo::getRegisterBitWidth(bool Vector) const {
176 return PrevTTI->getRegisterBitWidth(Vector);
177}
178
Nadav Rotemb696c362013-01-09 01:15:42 +0000179unsigned TargetTransformInfo::getMaximumUnrollFactor() const {
180 return PrevTTI->getMaximumUnrollFactor();
181}
182
Chandler Carruth539edf42013-01-05 11:43:11 +0000183unsigned TargetTransformInfo::getArithmeticInstrCost(unsigned Opcode,
Arnold Schwaighoferb9773872013-04-04 23:26:21 +0000184 Type *Ty,
185 OperandValueKind Op1Info,
186 OperandValueKind Op2Info) const {
187 return PrevTTI->getArithmeticInstrCost(Opcode, Ty, Op1Info, Op2Info);
Chandler Carruth539edf42013-01-05 11:43:11 +0000188}
189
190unsigned TargetTransformInfo::getShuffleCost(ShuffleKind Kind, Type *Tp,
191 int Index, Type *SubTp) const {
192 return PrevTTI->getShuffleCost(Kind, Tp, Index, SubTp);
193}
194
195unsigned TargetTransformInfo::getCastInstrCost(unsigned Opcode, Type *Dst,
196 Type *Src) const {
197 return PrevTTI->getCastInstrCost(Opcode, Dst, Src);
198}
199
200unsigned TargetTransformInfo::getCFInstrCost(unsigned Opcode) const {
201 return PrevTTI->getCFInstrCost(Opcode);
202}
203
204unsigned TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
205 Type *CondTy) const {
206 return PrevTTI->getCmpSelInstrCost(Opcode, ValTy, CondTy);
207}
208
209unsigned TargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val,
210 unsigned Index) const {
211 return PrevTTI->getVectorInstrCost(Opcode, Val, Index);
212}
213
214unsigned TargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src,
215 unsigned Alignment,
216 unsigned AddressSpace) const {
217 return PrevTTI->getMemoryOpCost(Opcode, Src, Alignment, AddressSpace);
218 ;
219}
220
221unsigned
222TargetTransformInfo::getIntrinsicInstrCost(Intrinsic::ID ID,
223 Type *RetTy,
224 ArrayRef<Type *> Tys) const {
225 return PrevTTI->getIntrinsicInstrCost(ID, RetTy, Tys);
226}
227
228unsigned TargetTransformInfo::getNumberOfParts(Type *Tp) const {
229 return PrevTTI->getNumberOfParts(Tp);
230}
231
Arnold Schwaighofer9da9a432013-07-12 19:16:02 +0000232unsigned TargetTransformInfo::getAddressComputationCost(Type *Tp,
233 bool IsComplex) const {
234 return PrevTTI->getAddressComputationCost(Tp, IsComplex);
Arnold Schwaighofer594fa2d2013-02-08 14:50:48 +0000235}
Chandler Carruth539edf42013-01-05 11:43:11 +0000236
Arnold Schwaighofercae87352013-09-17 18:06:50 +0000237unsigned TargetTransformInfo::getReductionCost(unsigned Opcode, Type *Ty,
238 bool IsPairwise) const {
239 return PrevTTI->getReductionCost(Opcode, Ty, IsPairwise);
240}
241
Chandler Carruth539edf42013-01-05 11:43:11 +0000242namespace {
243
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000244struct NoTTI LLVM_FINAL : ImmutablePass, TargetTransformInfo {
Chandler Carruth511aa762013-01-21 01:27:39 +0000245 const DataLayout *DL;
246
247 NoTTI() : ImmutablePass(ID), DL(0) {
Chandler Carruth539edf42013-01-05 11:43:11 +0000248 initializeNoTTIPass(*PassRegistry::getPassRegistry());
249 }
250
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000251 virtual void initializePass() LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000252 // Note that this subclass is special, and must *not* call initializeTTI as
253 // it does not chain.
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000254 TopTTI = this;
Chandler Carruth664e3542013-01-07 01:37:14 +0000255 PrevTTI = 0;
Chandler Carruth511aa762013-01-21 01:27:39 +0000256 DL = getAnalysisIfAvailable<DataLayout>();
Chandler Carruth664e3542013-01-07 01:37:14 +0000257 }
258
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000259 virtual void getAnalysisUsage(AnalysisUsage &AU) const LLVM_OVERRIDE {
Chandler Carruth539edf42013-01-05 11:43:11 +0000260 // Note that this subclass is special, and must *not* call
261 // TTI::getAnalysisUsage as it breaks the recursion.
262 }
263
264 /// Pass identification.
265 static char ID;
266
267 /// Provide necessary pointer adjustments for the two base classes.
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000268 virtual void *getAdjustedAnalysisPointer(const void *ID) LLVM_OVERRIDE {
Chandler Carruth539edf42013-01-05 11:43:11 +0000269 if (ID == &TargetTransformInfo::ID)
270 return (TargetTransformInfo*)this;
271 return this;
272 }
273
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000274 unsigned getOperationCost(unsigned Opcode, Type *Ty,
275 Type *OpTy) const LLVM_OVERRIDE {
Chandler Carruth511aa762013-01-21 01:27:39 +0000276 switch (Opcode) {
277 default:
278 // By default, just classify everything as 'basic'.
279 return TCC_Basic;
280
281 case Instruction::GetElementPtr:
282 llvm_unreachable("Use getGEPCost for GEP operations!");
283
284 case Instruction::BitCast:
285 assert(OpTy && "Cast instructions must provide the operand type");
286 if (Ty == OpTy || (Ty->isPointerTy() && OpTy->isPointerTy()))
287 // Identity and pointer-to-pointer casts are free.
288 return TCC_Free;
289
290 // Otherwise, the default basic cost is used.
291 return TCC_Basic;
292
Matt Arsenault54c3cbc2013-08-28 22:41:57 +0000293 case Instruction::IntToPtr: {
294 if (!DL)
295 return TCC_Basic;
296
Chandler Carruth511aa762013-01-21 01:27:39 +0000297 // An inttoptr cast is free so long as the input is a legal integer type
298 // which doesn't contain values outside the range of a pointer.
Matt Arsenault54c3cbc2013-08-28 22:41:57 +0000299 unsigned OpSize = OpTy->getScalarSizeInBits();
300 if (DL->isLegalInteger(OpSize) &&
301 OpSize <= DL->getPointerTypeSizeInBits(Ty))
Chandler Carruth511aa762013-01-21 01:27:39 +0000302 return TCC_Free;
303
304 // Otherwise it's not a no-op.
305 return TCC_Basic;
Matt Arsenault54c3cbc2013-08-28 22:41:57 +0000306 }
307 case Instruction::PtrToInt: {
308 if (!DL)
309 return TCC_Basic;
Chandler Carruth511aa762013-01-21 01:27:39 +0000310
Chandler Carruth511aa762013-01-21 01:27:39 +0000311 // A ptrtoint cast is free so long as the result is large enough to store
312 // the pointer, and a legal integer type.
Matt Arsenault54c3cbc2013-08-28 22:41:57 +0000313 unsigned DestSize = Ty->getScalarSizeInBits();
314 if (DL->isLegalInteger(DestSize) &&
315 DestSize >= DL->getPointerTypeSizeInBits(OpTy))
Chandler Carruth511aa762013-01-21 01:27:39 +0000316 return TCC_Free;
317
318 // Otherwise it's not a no-op.
319 return TCC_Basic;
Matt Arsenault54c3cbc2013-08-28 22:41:57 +0000320 }
Chandler Carruth511aa762013-01-21 01:27:39 +0000321 case Instruction::Trunc:
322 // trunc to a native type is free (assuming the target has compare and
323 // shift-right of the same width).
324 if (DL && DL->isLegalInteger(DL->getTypeSizeInBits(Ty)))
325 return TCC_Free;
326
327 return TCC_Basic;
328 }
329 }
330
331 unsigned getGEPCost(const Value *Ptr,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000332 ArrayRef<const Value *> Operands) const LLVM_OVERRIDE {
Chandler Carruth511aa762013-01-21 01:27:39 +0000333 // In the basic model, we just assume that all-constant GEPs will be folded
334 // into their uses via addressing modes.
335 for (unsigned Idx = 0, Size = Operands.size(); Idx != Size; ++Idx)
336 if (!isa<Constant>(Operands[Idx]))
337 return TCC_Basic;
338
339 return TCC_Free;
340 }
341
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000342 unsigned getCallCost(FunctionType *FTy, int NumArgs = -1) const LLVM_OVERRIDE
343 {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000344 assert(FTy && "FunctionType must be provided to this routine.");
345
346 // The target-independent implementation just measures the size of the
347 // function by approximating that each argument will take on average one
348 // instruction to prepare.
349
350 if (NumArgs < 0)
351 // Set the argument number to the number of explicit arguments in the
352 // function.
353 NumArgs = FTy->getNumParams();
354
355 return TCC_Basic * (NumArgs + 1);
356 }
357
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000358 unsigned getCallCost(const Function *F, int NumArgs = -1) const LLVM_OVERRIDE
359 {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000360 assert(F && "A concrete function must be provided to this routine.");
361
362 if (NumArgs < 0)
363 // Set the argument number to the number of explicit arguments in the
364 // function.
365 NumArgs = F->arg_size();
366
367 if (Intrinsic::ID IID = (Intrinsic::ID)F->getIntrinsicID()) {
368 FunctionType *FTy = F->getFunctionType();
369 SmallVector<Type *, 8> ParamTys(FTy->param_begin(), FTy->param_end());
370 return TopTTI->getIntrinsicCost(IID, FTy->getReturnType(), ParamTys);
371 }
372
373 if (!TopTTI->isLoweredToCall(F))
374 return TCC_Basic; // Give a basic cost if it will be lowered directly.
375
376 return TopTTI->getCallCost(F->getFunctionType(), NumArgs);
377 }
378
379 unsigned getCallCost(const Function *F,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000380 ArrayRef<const Value *> Arguments) const LLVM_OVERRIDE {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000381 // Simply delegate to generic handling of the call.
382 // FIXME: We should use instsimplify or something else to catch calls which
383 // will constant fold with these arguments.
384 return TopTTI->getCallCost(F, Arguments.size());
385 }
386
387 unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000388 ArrayRef<Type *> ParamTys) const LLVM_OVERRIDE {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000389 switch (IID) {
390 default:
391 // Intrinsics rarely (if ever) have normal argument setup constraints.
392 // Model them as having a basic instruction cost.
393 // FIXME: This is wrong for libc intrinsics.
394 return TCC_Basic;
395
396 case Intrinsic::dbg_declare:
397 case Intrinsic::dbg_value:
398 case Intrinsic::invariant_start:
399 case Intrinsic::invariant_end:
400 case Intrinsic::lifetime_start:
401 case Intrinsic::lifetime_end:
402 case Intrinsic::objectsize:
403 case Intrinsic::ptr_annotation:
404 case Intrinsic::var_annotation:
405 // These intrinsics don't actually represent code after lowering.
406 return TCC_Free;
407 }
408 }
409
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000410 unsigned
411 getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
412 ArrayRef<const Value *> Arguments) const LLVM_OVERRIDE {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000413 // Delegate to the generic intrinsic handling code. This mostly provides an
414 // opportunity for targets to (for example) special case the cost of
415 // certain intrinsics based on constants used as arguments.
416 SmallVector<Type *, 8> ParamTys;
417 ParamTys.reserve(Arguments.size());
418 for (unsigned Idx = 0, Size = Arguments.size(); Idx != Size; ++Idx)
419 ParamTys.push_back(Arguments[Idx]->getType());
420 return TopTTI->getIntrinsicCost(IID, RetTy, ParamTys);
421 }
422
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000423 unsigned getUserCost(const User *U) const LLVM_OVERRIDE {
Chandler Carruthbb9caa92013-01-21 13:04:33 +0000424 if (isa<PHINode>(U))
425 return TCC_Free; // Model all PHI nodes as free.
426
Chandler Carruth511aa762013-01-21 01:27:39 +0000427 if (const GEPOperator *GEP = dyn_cast<GEPOperator>(U))
428 // In the basic model we just assume that all-constant GEPs will be
429 // folded into their uses via addressing modes.
430 return GEP->hasAllConstantIndices() ? TCC_Free : TCC_Basic;
431
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000432 if (ImmutableCallSite CS = U) {
433 const Function *F = CS.getCalledFunction();
434 if (!F) {
435 // Just use the called value type.
436 Type *FTy = CS.getCalledValue()->getType()->getPointerElementType();
437 return TopTTI->getCallCost(cast<FunctionType>(FTy), CS.arg_size());
Chandler Carruth511aa762013-01-21 01:27:39 +0000438 }
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000439
Benjamin Kramer3c29c072014-02-10 14:17:42 +0000440 SmallVector<const Value *, 8> Arguments(CS.arg_begin(), CS.arg_end());
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000441 return TopTTI->getCallCost(F, Arguments);
Chandler Carruth511aa762013-01-21 01:27:39 +0000442 }
443
444 if (const CastInst *CI = dyn_cast<CastInst>(U)) {
445 // Result of a cmp instruction is often extended (to be used by other
446 // cmp instructions, logical or return instructions). These are usually
447 // nop on most sane targets.
448 if (isa<CmpInst>(CI->getOperand(0)))
449 return TCC_Free;
450 }
451
452 // Otherwise delegate to the fully generic implementations.
453 return getOperationCost(Operator::getOpcode(U), U->getType(),
454 U->getNumOperands() == 1 ?
455 U->getOperand(0)->getType() : 0);
456 }
Chandler Carruth539edf42013-01-05 11:43:11 +0000457
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000458 bool hasBranchDivergence() const LLVM_OVERRIDE { return false; }
Tom Stellard8b1e0212013-07-27 00:01:07 +0000459
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000460 bool isLoweredToCall(const Function *F) const LLVM_OVERRIDE {
Chandler Carruth0ba8db42013-01-22 11:26:02 +0000461 // FIXME: These should almost certainly not be handled here, and instead
462 // handled with the help of TLI or the target itself. This was largely
463 // ported from existing analysis heuristics here so that such refactorings
464 // can take place in the future.
465
466 if (F->isIntrinsic())
467 return false;
468
469 if (F->hasLocalLinkage() || !F->hasName())
470 return true;
471
472 StringRef Name = F->getName();
473
474 // These will all likely lower to a single selection DAG node.
475 if (Name == "copysign" || Name == "copysignf" || Name == "copysignl" ||
476 Name == "fabs" || Name == "fabsf" || Name == "fabsl" || Name == "sin" ||
477 Name == "sinf" || Name == "sinl" || Name == "cos" || Name == "cosf" ||
478 Name == "cosl" || Name == "sqrt" || Name == "sqrtf" || Name == "sqrtl")
479 return false;
480
481 // These are all likely to be optimized into something smaller.
482 if (Name == "pow" || Name == "powf" || Name == "powl" || Name == "exp2" ||
483 Name == "exp2l" || Name == "exp2f" || Name == "floor" || Name ==
484 "floorf" || Name == "ceil" || Name == "round" || Name == "ffs" ||
485 Name == "ffsl" || Name == "abs" || Name == "labs" || Name == "llabs")
486 return false;
487
488 return true;
489 }
490
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000491 void getUnrollingPreferences(Loop *,
492 UnrollingPreferences &) const LLVM_OVERRIDE
493 { }
Hal Finkel8f2e7002013-09-11 19:25:43 +0000494
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000495 bool isLegalAddImmediate(int64_t Imm) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000496 return false;
Chandler Carruth539edf42013-01-05 11:43:11 +0000497 }
498
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000499 bool isLegalICmpImmediate(int64_t Imm) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000500 return false;
Chandler Carruth539edf42013-01-05 11:43:11 +0000501 }
502
503 bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000504 bool HasBaseReg, int64_t Scale) const LLVM_OVERRIDE
505 {
Chandler Carruth26c59fa2013-01-07 14:41:08 +0000506 // Guess that reg+reg addressing is allowed. This heuristic is taken from
507 // the implementation of LSR.
508 return !BaseGV && BaseOffset == 0 && Scale <= 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000509 }
510
Quentin Colombetbf490d42013-05-31 21:29:03 +0000511 int getScalingFactorCost(Type *Ty, GlobalValue *BaseGV, int64_t BaseOffset,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000512 bool HasBaseReg, int64_t Scale) const LLVM_OVERRIDE {
Quentin Colombetbf490d42013-05-31 21:29:03 +0000513 // Guess that all legal addressing mode are free.
514 if(isLegalAddressingMode(Ty, BaseGV, BaseOffset, HasBaseReg, Scale))
515 return 0;
516 return -1;
517 }
518
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000519 bool isTruncateFree(Type *Ty1, Type *Ty2) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000520 return false;
Chandler Carruth539edf42013-01-05 11:43:11 +0000521 }
522
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000523 bool isTypeLegal(Type *Ty) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000524 return false;
Chandler Carruth539edf42013-01-05 11:43:11 +0000525 }
526
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000527 unsigned getJumpBufAlignment() const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000528 return 0;
Chandler Carruth539edf42013-01-05 11:43:11 +0000529 }
530
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000531 unsigned getJumpBufSize() const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000532 return 0;
Chandler Carruth539edf42013-01-05 11:43:11 +0000533 }
534
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000535 bool shouldBuildLookupTables() const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000536 return true;
Chandler Carruth539edf42013-01-05 11:43:11 +0000537 }
538
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000539 PopcntSupportKind
540 getPopcntSupport(unsigned IntTyWidthInBit) const LLVM_OVERRIDE {
Chandler Carruth50a36cd2013-01-07 03:16:03 +0000541 return PSK_Software;
Chandler Carruth539edf42013-01-05 11:43:11 +0000542 }
543
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000544 bool haveFastSqrt(Type *Ty) const LLVM_OVERRIDE {
Richard Sandiford37cd6cf2013-08-23 10:27:02 +0000545 return false;
546 }
547
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000548 unsigned getIntImmCost(const APInt &Imm, Type *Ty) const LLVM_OVERRIDE {
Juergen Ributzkaf26beda2014-01-25 02:02:55 +0000549 return TCC_Basic;
550 }
551
552 unsigned getIntImmCost(unsigned Opcode, const APInt &Imm,
553 Type *Ty) const LLVM_OVERRIDE {
554 return TCC_Free;
555 }
556
557 unsigned getIntImmCost(Intrinsic::ID IID, const APInt &Imm,
558 Type *Ty) const LLVM_OVERRIDE {
559 return TCC_Free;
Chandler Carruth539edf42013-01-05 11:43:11 +0000560 }
561
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000562 unsigned getNumberOfRegisters(bool Vector) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000563 return 8;
Chandler Carruth539edf42013-01-05 11:43:11 +0000564 }
565
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000566 unsigned getRegisterBitWidth(bool Vector) const LLVM_OVERRIDE {
Nadav Rotemb1791a72013-01-09 22:29:00 +0000567 return 32;
568 }
569
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000570 unsigned getMaximumUnrollFactor() const LLVM_OVERRIDE {
Nadav Rotemb696c362013-01-09 01:15:42 +0000571 return 1;
572 }
573
Arnold Schwaighoferb9773872013-04-04 23:26:21 +0000574 unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty, OperandValueKind,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000575 OperandValueKind) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000576 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000577 }
578
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000579 unsigned getShuffleCost(ShuffleKind Kind, Type *Ty,
580 int Index = 0, Type *SubTp = 0) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000581 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000582 }
583
584 unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000585 Type *Src) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000586 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000587 }
588
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000589 unsigned getCFInstrCost(unsigned Opcode) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000590 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000591 }
592
593 unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000594 Type *CondTy = 0) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000595 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000596 }
597
598 unsigned getVectorInstrCost(unsigned Opcode, Type *Val,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000599 unsigned Index = -1) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000600 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000601 }
602
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000603 unsigned getMemoryOpCost(unsigned Opcode,
604 Type *Src,
Chandler Carruth539edf42013-01-05 11:43:11 +0000605 unsigned Alignment,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000606 unsigned AddressSpace) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000607 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000608 }
609
610 unsigned getIntrinsicInstrCost(Intrinsic::ID ID,
611 Type *RetTy,
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000612 ArrayRef<Type*> Tys) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000613 return 1;
Chandler Carruth539edf42013-01-05 11:43:11 +0000614 }
615
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000616 unsigned getNumberOfParts(Type *Tp) const LLVM_OVERRIDE {
Chandler Carruth664e3542013-01-07 01:37:14 +0000617 return 0;
Chandler Carruth539edf42013-01-05 11:43:11 +0000618 }
Arnold Schwaighofer594fa2d2013-02-08 14:50:48 +0000619
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000620 unsigned getAddressComputationCost(Type *Tp, bool) const LLVM_OVERRIDE {
Arnold Schwaighofer594fa2d2013-02-08 14:50:48 +0000621 return 0;
622 }
Arnold Schwaighofercae87352013-09-17 18:06:50 +0000623
Juergen Ributzka3e752e72014-01-24 18:22:59 +0000624 unsigned getReductionCost(unsigned, Type *, bool) const LLVM_OVERRIDE {
Arnold Schwaighofercae87352013-09-17 18:06:50 +0000625 return 1;
626 }
Chandler Carruth539edf42013-01-05 11:43:11 +0000627};
628
629} // end anonymous namespace
630
Chandler Carruth664e3542013-01-07 01:37:14 +0000631INITIALIZE_AG_PASS(NoTTI, TargetTransformInfo, "notti",
Chandler Carruth539edf42013-01-05 11:43:11 +0000632 "No target information", true, true, true)
633char NoTTI::ID = 0;
634
Chandler Carruth664e3542013-01-07 01:37:14 +0000635ImmutablePass *llvm::createNoTargetTransformInfoPass() {
636 return new NoTTI();
Chandler Carruth539edf42013-01-05 11:43:11 +0000637}