blob: 073bbb0c5567801a98c2ef537feeeac056470932 [file] [log] [blame]
Chandler Carruth93dcdc42015-01-31 11:17:59 +00001//===-- PPCTargetTransformInfo.cpp - PPC specific TTI ---------------------===//
Hal Finkel4e5ca9e2013-01-25 23:05:59 +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//===----------------------------------------------------------------------===//
Hal Finkel4e5ca9e2013-01-25 23:05:59 +00009
Chandler Carruth93dcdc42015-01-31 11:17:59 +000010#include "PPCTargetTransformInfo.h"
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000011#include "llvm/Analysis/TargetTransformInfo.h"
Chandler Carruth705b1852015-01-31 03:43:40 +000012#include "llvm/CodeGen/BasicTTIImpl.h"
Hal Finkel0192cba2014-04-13 23:02:40 +000013#include "llvm/Support/CommandLine.h"
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000014#include "llvm/Support/Debug.h"
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000015#include "llvm/Target/CostTable.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000016#include "llvm/Target/TargetLowering.h"
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000017using namespace llvm;
18
Chandler Carruth84e68b22014-04-22 02:41:26 +000019#define DEBUG_TYPE "ppctti"
20
Hal Finkel0192cba2014-04-13 23:02:40 +000021static cl::opt<bool> DisablePPCConstHoist("disable-ppc-constant-hoisting",
22cl::desc("disable constant hoisting on PPC"), cl::init(false), cl::Hidden);
23
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000024//===----------------------------------------------------------------------===//
25//
26// PPC cost model.
27//
28//===----------------------------------------------------------------------===//
29
Chandler Carruth705b1852015-01-31 03:43:40 +000030TargetTransformInfo::PopcntSupportKind
31PPCTTIImpl::getPopcntSupport(unsigned TyWidth) {
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000032 assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
Hal Finkela4d07482013-03-28 13:29:47 +000033 if (ST->hasPOPCNTD() && TyWidth <= 64)
Chandler Carruth705b1852015-01-31 03:43:40 +000034 return TTI::PSK_FastHardware;
35 return TTI::PSK_Software;
Hal Finkel4e5ca9e2013-01-25 23:05:59 +000036}
37
Chandler Carruth705b1852015-01-31 03:43:40 +000038unsigned PPCTTIImpl::getIntImmCost(const APInt &Imm, Type *Ty) {
Hal Finkel0192cba2014-04-13 23:02:40 +000039 if (DisablePPCConstHoist)
Chandler Carruth705b1852015-01-31 03:43:40 +000040 return BaseT::getIntImmCost(Imm, Ty);
Hal Finkel0192cba2014-04-13 23:02:40 +000041
42 assert(Ty->isIntegerTy());
43
44 unsigned BitSize = Ty->getPrimitiveSizeInBits();
45 if (BitSize == 0)
46 return ~0U;
47
48 if (Imm == 0)
Chandler Carruth705b1852015-01-31 03:43:40 +000049 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +000050
51 if (Imm.getBitWidth() <= 64) {
52 if (isInt<16>(Imm.getSExtValue()))
Chandler Carruth705b1852015-01-31 03:43:40 +000053 return TTI::TCC_Basic;
Hal Finkel0192cba2014-04-13 23:02:40 +000054
55 if (isInt<32>(Imm.getSExtValue())) {
56 // A constant that can be materialized using lis.
57 if ((Imm.getZExtValue() & 0xFFFF) == 0)
Chandler Carruth705b1852015-01-31 03:43:40 +000058 return TTI::TCC_Basic;
Hal Finkel0192cba2014-04-13 23:02:40 +000059
Chandler Carruth705b1852015-01-31 03:43:40 +000060 return 2 * TTI::TCC_Basic;
Hal Finkel0192cba2014-04-13 23:02:40 +000061 }
62 }
63
Chandler Carruth705b1852015-01-31 03:43:40 +000064 return 4 * TTI::TCC_Basic;
Hal Finkel0192cba2014-04-13 23:02:40 +000065}
66
Chandler Carruth705b1852015-01-31 03:43:40 +000067unsigned PPCTTIImpl::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
68 const APInt &Imm, Type *Ty) {
Hal Finkel0192cba2014-04-13 23:02:40 +000069 if (DisablePPCConstHoist)
Chandler Carruth705b1852015-01-31 03:43:40 +000070 return BaseT::getIntImmCost(IID, Idx, Imm, Ty);
Hal Finkel0192cba2014-04-13 23:02:40 +000071
72 assert(Ty->isIntegerTy());
73
74 unsigned BitSize = Ty->getPrimitiveSizeInBits();
75 if (BitSize == 0)
76 return ~0U;
77
78 switch (IID) {
Chandler Carruth705b1852015-01-31 03:43:40 +000079 default:
80 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +000081 case Intrinsic::sadd_with_overflow:
82 case Intrinsic::uadd_with_overflow:
83 case Intrinsic::ssub_with_overflow:
84 case Intrinsic::usub_with_overflow:
85 if ((Idx == 1) && Imm.getBitWidth() <= 64 && isInt<16>(Imm.getSExtValue()))
Chandler Carruth705b1852015-01-31 03:43:40 +000086 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +000087 break;
Hal Finkel934361a2015-01-14 01:07:51 +000088 case Intrinsic::experimental_stackmap:
89 if ((Idx < 2) || (Imm.getBitWidth() <= 64 && isInt<64>(Imm.getSExtValue())))
Chandler Carruth705b1852015-01-31 03:43:40 +000090 return TTI::TCC_Free;
Hal Finkel934361a2015-01-14 01:07:51 +000091 break;
92 case Intrinsic::experimental_patchpoint_void:
93 case Intrinsic::experimental_patchpoint_i64:
94 if ((Idx < 4) || (Imm.getBitWidth() <= 64 && isInt<64>(Imm.getSExtValue())))
Chandler Carruth705b1852015-01-31 03:43:40 +000095 return TTI::TCC_Free;
Hal Finkel934361a2015-01-14 01:07:51 +000096 break;
Hal Finkel0192cba2014-04-13 23:02:40 +000097 }
Chandler Carruth705b1852015-01-31 03:43:40 +000098 return PPCTTIImpl::getIntImmCost(Imm, Ty);
Hal Finkel0192cba2014-04-13 23:02:40 +000099}
100
Chandler Carruth705b1852015-01-31 03:43:40 +0000101unsigned PPCTTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx,
102 const APInt &Imm, Type *Ty) {
Hal Finkel0192cba2014-04-13 23:02:40 +0000103 if (DisablePPCConstHoist)
Chandler Carruth705b1852015-01-31 03:43:40 +0000104 return BaseT::getIntImmCost(Opcode, Idx, Imm, Ty);
Hal Finkel0192cba2014-04-13 23:02:40 +0000105
106 assert(Ty->isIntegerTy());
107
108 unsigned BitSize = Ty->getPrimitiveSizeInBits();
109 if (BitSize == 0)
110 return ~0U;
111
112 unsigned ImmIdx = ~0U;
113 bool ShiftedFree = false, RunFree = false, UnsignedFree = false,
114 ZeroFree = false;
115 switch (Opcode) {
Chandler Carruth705b1852015-01-31 03:43:40 +0000116 default:
117 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000118 case Instruction::GetElementPtr:
119 // Always hoist the base address of a GetElementPtr. This prevents the
120 // creation of new constants for every base constant that gets constant
121 // folded with the offset.
122 if (Idx == 0)
Chandler Carruth705b1852015-01-31 03:43:40 +0000123 return 2 * TTI::TCC_Basic;
124 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000125 case Instruction::And:
126 RunFree = true; // (for the rotate-and-mask instructions)
127 // Fallthrough...
128 case Instruction::Add:
129 case Instruction::Or:
130 case Instruction::Xor:
131 ShiftedFree = true;
132 // Fallthrough...
133 case Instruction::Sub:
134 case Instruction::Mul:
135 case Instruction::Shl:
136 case Instruction::LShr:
137 case Instruction::AShr:
138 ImmIdx = 1;
139 break;
140 case Instruction::ICmp:
141 UnsignedFree = true;
142 ImmIdx = 1;
143 // Fallthrough... (zero comparisons can use record-form instructions)
144 case Instruction::Select:
145 ZeroFree = true;
146 break;
147 case Instruction::PHI:
148 case Instruction::Call:
149 case Instruction::Ret:
150 case Instruction::Load:
151 case Instruction::Store:
152 break;
153 }
154
155 if (ZeroFree && Imm == 0)
Chandler Carruth705b1852015-01-31 03:43:40 +0000156 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000157
158 if (Idx == ImmIdx && Imm.getBitWidth() <= 64) {
159 if (isInt<16>(Imm.getSExtValue()))
Chandler Carruth705b1852015-01-31 03:43:40 +0000160 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000161
162 if (RunFree) {
163 if (Imm.getBitWidth() <= 32 &&
164 (isShiftedMask_32(Imm.getZExtValue()) ||
165 isShiftedMask_32(~Imm.getZExtValue())))
Chandler Carruth705b1852015-01-31 03:43:40 +0000166 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000167
168 if (ST->isPPC64() &&
169 (isShiftedMask_64(Imm.getZExtValue()) ||
170 isShiftedMask_64(~Imm.getZExtValue())))
Chandler Carruth705b1852015-01-31 03:43:40 +0000171 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000172 }
173
174 if (UnsignedFree && isUInt<16>(Imm.getZExtValue()))
Chandler Carruth705b1852015-01-31 03:43:40 +0000175 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000176
177 if (ShiftedFree && (Imm.getZExtValue() & 0xFFFF) == 0)
Chandler Carruth705b1852015-01-31 03:43:40 +0000178 return TTI::TCC_Free;
Hal Finkel0192cba2014-04-13 23:02:40 +0000179 }
180
Chandler Carruth705b1852015-01-31 03:43:40 +0000181 return PPCTTIImpl::getIntImmCost(Imm, Ty);
Hal Finkel0192cba2014-04-13 23:02:40 +0000182}
183
Chandler Carruthab5cb362015-02-01 14:31:23 +0000184void PPCTTIImpl::getUnrollingPreferences(Loop *L,
Chandler Carruth705b1852015-01-31 03:43:40 +0000185 TTI::UnrollingPreferences &UP) {
Chandler Carruthc956ab662015-02-01 14:22:17 +0000186 if (ST->getDarwinDirective() == PPC::DIR_A2) {
Hal Finkel71780ec2013-09-11 21:20:40 +0000187 // The A2 is in-order with a deep pipeline, and concatenation unrolling
188 // helps expose latency-hiding opportunities to the instruction scheduler.
189 UP.Partial = UP.Runtime = true;
190 }
Hal Finkelb359b732015-01-09 15:51:16 +0000191
Chandler Carruthab5cb362015-02-01 14:31:23 +0000192 BaseT::getUnrollingPreferences(L, UP);
Hal Finkel71780ec2013-09-11 21:20:40 +0000193}
194
Chandler Carruth705b1852015-01-31 03:43:40 +0000195unsigned PPCTTIImpl::getNumberOfRegisters(bool Vector) {
Hal Finkelc93a9a22015-02-25 01:06:45 +0000196 if (Vector && !ST->hasAltivec() && !ST->hasQPX())
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000197 return 0;
Hal Finkel27774d92014-03-13 07:58:58 +0000198 return ST->hasVSX() ? 64 : 32;
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000199}
200
Chandler Carruth705b1852015-01-31 03:43:40 +0000201unsigned PPCTTIImpl::getRegisterBitWidth(bool Vector) {
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000202 if (Vector) {
Hal Finkelc93a9a22015-02-25 01:06:45 +0000203 if (ST->hasQPX()) return 256;
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000204 if (ST->hasAltivec()) return 128;
205 return 0;
206 }
207
208 if (ST->isPPC64())
209 return 64;
210 return 32;
211
212}
213
Chandler Carruth705b1852015-01-31 03:43:40 +0000214unsigned PPCTTIImpl::getMaxInterleaveFactor() {
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000215 unsigned Directive = ST->getDarwinDirective();
216 // The 440 has no SIMD support, but floating-point instructions
217 // have a 5-cycle latency, so unroll by 5x for latency hiding.
218 if (Directive == PPC::DIR_440)
219 return 5;
220
221 // The A2 has no SIMD support, but floating-point instructions
222 // have a 6-cycle latency, so unroll by 6x for latency hiding.
223 if (Directive == PPC::DIR_A2)
224 return 6;
225
226 // FIXME: For lack of any better information, do no harm...
227 if (Directive == PPC::DIR_E500mc || Directive == PPC::DIR_E5500)
228 return 1;
229
Olivier Sallenave05e69152015-02-12 22:57:58 +0000230 // For P7 and P8, floating-point instructions have a 6-cycle latency and
231 // there are two execution units, so unroll by 12x for latency hiding.
232 if (Directive == PPC::DIR_PWR7 ||
233 Directive == PPC::DIR_PWR8)
234 return 12;
235
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000236 // For most things, modern systems have two execution units (and
237 // out-of-order execution).
238 return 2;
239}
240
Chandler Carruth705b1852015-01-31 03:43:40 +0000241unsigned PPCTTIImpl::getArithmeticInstrCost(
242 unsigned Opcode, Type *Ty, TTI::OperandValueKind Op1Info,
243 TTI::OperandValueKind Op2Info, TTI::OperandValueProperties Opd1PropInfo,
244 TTI::OperandValueProperties Opd2PropInfo) {
Dmitri Gribenkoc451bdf2013-01-25 23:17:21 +0000245 assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode");
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000246
247 // Fallback to the default implementation.
Chandler Carruth705b1852015-01-31 03:43:40 +0000248 return BaseT::getArithmeticInstrCost(Opcode, Ty, Op1Info, Op2Info,
249 Opd1PropInfo, Opd2PropInfo);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000250}
251
Chandler Carruth705b1852015-01-31 03:43:40 +0000252unsigned PPCTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, int Index,
253 Type *SubTp) {
254 return BaseT::getShuffleCost(Kind, Tp, Index, SubTp);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000255}
256
Chandler Carruth705b1852015-01-31 03:43:40 +0000257unsigned PPCTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) {
Dmitri Gribenkoc451bdf2013-01-25 23:17:21 +0000258 assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode");
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000259
Chandler Carruth705b1852015-01-31 03:43:40 +0000260 return BaseT::getCastInstrCost(Opcode, Dst, Src);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000261}
262
Chandler Carruth705b1852015-01-31 03:43:40 +0000263unsigned PPCTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
264 Type *CondTy) {
265 return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000266}
267
Chandler Carruth705b1852015-01-31 03:43:40 +0000268unsigned PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
269 unsigned Index) {
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000270 assert(Val->isVectorTy() && "This must be a vector type");
271
Bill Schmidt62fe7a5b2013-02-08 18:19:17 +0000272 int ISD = TLI->InstructionOpcodeToISD(Opcode);
273 assert(ISD && "Invalid opcode");
Bill Schmidtb3cece12013-02-07 20:33:57 +0000274
Hal Finkel27774d92014-03-13 07:58:58 +0000275 if (ST->hasVSX() && Val->getScalarType()->isDoubleTy()) {
276 // Double-precision scalars are already located in index #0.
277 if (Index == 0)
278 return 0;
279
Chandler Carruth705b1852015-01-31 03:43:40 +0000280 return BaseT::getVectorInstrCost(Opcode, Val, Index);
Hal Finkelc93a9a22015-02-25 01:06:45 +0000281 } else if (ST->hasQPX() && Val->getScalarType()->isFloatingPointTy()) {
282 // Floating point scalars are already located in index #0.
283 if (Index == 0)
284 return 0;
285
286 return BaseT::getVectorInstrCost(Opcode, Val, Index);
Hal Finkel27774d92014-03-13 07:58:58 +0000287 }
288
Bill Schmidt62fe7a5b2013-02-08 18:19:17 +0000289 // Estimated cost of a load-hit-store delay. This was obtained
290 // experimentally as a minimum needed to prevent unprofitable
291 // vectorization for the paq8p benchmark. It may need to be
292 // raised further if other unprofitable cases remain.
Hal Finkelde0b4132014-04-04 23:51:18 +0000293 unsigned LHSPenalty = 2;
294 if (ISD == ISD::INSERT_VECTOR_ELT)
295 LHSPenalty += 7;
Bill Schmidtb3cece12013-02-07 20:33:57 +0000296
Bill Schmidt62fe7a5b2013-02-08 18:19:17 +0000297 // Vector element insert/extract with Altivec is very expensive,
298 // because they require store and reload with the attendant
299 // processor stall for load-hit-store. Until VSX is available,
300 // these need to be estimated as very costly.
301 if (ISD == ISD::EXTRACT_VECTOR_ELT ||
302 ISD == ISD::INSERT_VECTOR_ELT)
Chandler Carruth705b1852015-01-31 03:43:40 +0000303 return LHSPenalty + BaseT::getVectorInstrCost(Opcode, Val, Index);
Bill Schmidtb3cece12013-02-07 20:33:57 +0000304
Chandler Carruth705b1852015-01-31 03:43:40 +0000305 return BaseT::getVectorInstrCost(Opcode, Val, Index);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000306}
307
Chandler Carruth705b1852015-01-31 03:43:40 +0000308unsigned PPCTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
309 unsigned Alignment,
310 unsigned AddressSpace) {
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000311 // Legalize the type.
312 std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
313 assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
314 "Invalid Opcode");
315
Chandler Carruth705b1852015-01-31 03:43:40 +0000316 unsigned Cost = BaseT::getMemoryOpCost(Opcode, Src, Alignment, AddressSpace);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000317
Hal Finkelde0b4132014-04-04 23:51:18 +0000318 // VSX loads/stores support unaligned access.
319 if (ST->hasVSX()) {
320 if (LT.second == MVT::v2f64 || LT.second == MVT::v2i64)
321 return Cost;
322 }
323
324 bool UnalignedAltivec =
325 Src->isVectorTy() &&
326 Src->getPrimitiveSizeInBits() >= LT.second.getSizeInBits() &&
327 LT.second.getSizeInBits() == 128 &&
328 Opcode == Instruction::Load;
Hal Finkel6e28e6a2014-03-26 19:39:09 +0000329
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000330 // PPC in general does not support unaligned loads and stores. They'll need
331 // to be decomposed based on the alignment factor.
332 unsigned SrcBytes = LT.second.getStoreSize();
Hal Finkelde0b4132014-04-04 23:51:18 +0000333 if (SrcBytes && Alignment && Alignment < SrcBytes && !UnalignedAltivec) {
Hal Finkelf8233802014-04-02 22:43:49 +0000334 Cost += LT.first*(SrcBytes/Alignment-1);
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000335
Hal Finkelde0b4132014-04-04 23:51:18 +0000336 // For a vector type, there is also scalarization overhead (only for
337 // stores, loads are expanded using the vector-load + permutation sequence,
338 // which is much less expensive).
339 if (Src->isVectorTy() && Opcode == Instruction::Store)
340 for (int i = 0, e = Src->getVectorNumElements(); i < e; ++i)
341 Cost += getVectorInstrCost(Instruction::ExtractElement, Src, i);
342 }
343
Hal Finkel4e5ca9e2013-01-25 23:05:59 +0000344 return Cost;
345}
346