1a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//===-- PPCTargetTransformInfo.cpp - PPC specific TTI pass ----------------===//
2a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//
3a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//                     The LLVM Compiler Infrastructure
4a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//
5a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel// This file is distributed under the University of Illinois Open Source
6a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel// License. See LICENSE.TXT for details.
7a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//
8a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//===----------------------------------------------------------------------===//
9a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel/// \file
10a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel/// This file implements a TargetTransformInfo analysis pass specific to the
11a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel/// PPC target machine. It uses the target's detailed information to provide
12a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel/// more precise answers to certain TTI queries, while letting the target
13a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel/// independent and default TTI implementations handle the rest.
14a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel///
15a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//===----------------------------------------------------------------------===//
16a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
17a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel#include "PPC.h"
18a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel#include "PPCTargetMachine.h"
19a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel#include "llvm/Analysis/TargetTransformInfo.h"
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/CommandLine.h"
21a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel#include "llvm/Support/Debug.h"
22a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel#include "llvm/Target/CostTable.h"
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetLowering.h"
24a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelusing namespace llvm;
25a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "ppctti"
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic cl::opt<bool> DisablePPCConstHoist("disable-ppc-constant-hoisting",
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinescl::desc("disable constant hoisting on PPC"), cl::init(false), cl::Hidden);
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
31a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel// Declare the pass initialization routine locally as target-specific passes
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// don't have a target-wide initialization entry point, and so we rely on the
33a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel// pass constructor initialization.
34a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelnamespace llvm {
35a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelvoid initializePPCTTIPass(PassRegistry &);
36a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
37a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
38a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelnamespace {
39a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PPCTTI final : public ImmutablePass, public TargetTransformInfo {
41a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  const PPCSubtarget *ST;
42a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  const PPCTargetLowering *TLI;
43a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
44a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelpublic:
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PPCTTI() : ImmutablePass(ID), ST(nullptr), TLI(nullptr) {
46a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    llvm_unreachable("This pass cannot be directly constructed");
47a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
48a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
49a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  PPCTTI(const PPCTargetMachine *TM)
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : ImmutablePass(ID), ST(TM->getSubtargetImpl()),
51a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel        TLI(TM->getTargetLowering()) {
52a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    initializePPCTTIPass(*PassRegistry::getPassRegistry());
53a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
54a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void initializePass() override {
56a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    pushTTIStack(this);
57a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
58a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void getAnalysisUsage(AnalysisUsage &AU) const override {
60a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    TargetTransformInfo::getAnalysisUsage(AU);
61a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
62a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
63a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// Pass identification.
64a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  static char ID;
65a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
66a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// Provide necessary pointer adjustments for the two base classes.
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void *getAdjustedAnalysisPointer(const void *ID) override {
68a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    if (ID == &TargetTransformInfo::ID)
69a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel      return (TargetTransformInfo*)this;
70a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return this;
71a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
72a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
73a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// \name Scalar TTI Implementations
74a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// @{
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getIntImmCost(const APInt &Imm, Type *Ty) const override;
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         Type *Ty) const override;
79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned getIntImmCost(Intrinsic::ID IID, unsigned Idx, const APInt &Imm,
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                         Type *Ty) const override;
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual PopcntSupportKind
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  getPopcntSupport(unsigned TyWidth) const override;
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual void getUnrollingPreferences(
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Loop *L, UnrollingPreferences &UP) const override;
86a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
87a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// @}
88a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
89a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// \name Vector TTI Implementations
90a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// @{
91a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual unsigned getNumberOfRegisters(bool Vector) const override;
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual unsigned getRegisterBitWidth(bool Vector) const override;
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual unsigned getMaximumUnrollFactor() const override;
956bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer  virtual unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty,
966bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer                                          OperandValueKind,
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          OperandValueKind) const override;
98a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  virtual unsigned getShuffleCost(ShuffleKind Kind, Type *Tp,
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                  int Index, Type *SubTp) const override;
100a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  virtual unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                    Type *Src) const override;
102a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  virtual unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                      Type *CondTy) const override;
104a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  virtual unsigned getVectorInstrCost(unsigned Opcode, Type *Val,
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                      unsigned Index) const override;
106a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  virtual unsigned getMemoryOpCost(unsigned Opcode, Type *Src,
107a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                                   unsigned Alignment,
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   unsigned AddressSpace) const override;
109a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
110a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  /// @}
111a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel};
112a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
113a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel} // end anonymous namespace
114a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
115a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal FinkelINITIALIZE_AG_PASS(PPCTTI, TargetTransformInfo, "ppctti",
116a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                   "PPC Target Transform Info", true, true, false)
117a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelchar PPCTTI::ID = 0;
118a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
119a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal FinkelImmutablePass *
120a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelllvm::createPPCTargetTransformInfoPass(const PPCTargetMachine *TM) {
121a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return new PPCTTI(TM);
122a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
123a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
124a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
125a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//===----------------------------------------------------------------------===//
126a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//
127a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel// PPC cost model.
128a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//
129a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel//===----------------------------------------------------------------------===//
130a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
131a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal FinkelPPCTTI::PopcntSupportKind PPCTTI::getPopcntSupport(unsigned TyWidth) const {
132a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
133c53ab4d77f4b3d2905cf9ad625c28ff6b1c04affHal Finkel  if (ST->hasPOPCNTD() && TyWidth <= 64)
134c53ab4d77f4b3d2905cf9ad625c28ff6b1c04affHal Finkel    return PSK_FastHardware;
135a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return PSK_Software;
136a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
137a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned PPCTTI::getIntImmCost(const APInt &Imm, Type *Ty) const {
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DisablePPCConstHoist)
140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TargetTransformInfo::getIntImmCost(Imm, Ty);
141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(Ty->isIntegerTy());
143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned BitSize = Ty->getPrimitiveSizeInBits();
145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (BitSize == 0)
146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return ~0U;
147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Imm == 0)
149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TCC_Free;
150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Imm.getBitWidth() <= 64) {
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (isInt<16>(Imm.getSExtValue()))
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return TCC_Basic;
154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (isInt<32>(Imm.getSExtValue())) {
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      // A constant that can be materialized using lis.
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      if ((Imm.getZExtValue() & 0xFFFF) == 0)
158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return TCC_Basic;
159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return 2 * TCC_Basic;
161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    }
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return 4 * TCC_Basic;
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned PPCTTI::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               const APInt &Imm, Type *Ty) const {
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DisablePPCConstHoist)
170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TargetTransformInfo::getIntImmCost(IID, Idx, Imm, Ty);
171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(Ty->isIntegerTy());
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned BitSize = Ty->getPrimitiveSizeInBits();
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (BitSize == 0)
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return ~0U;
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (IID) {
179dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: return TCC_Free;
180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Intrinsic::sadd_with_overflow:
181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Intrinsic::uadd_with_overflow:
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Intrinsic::ssub_with_overflow:
183dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Intrinsic::usub_with_overflow:
184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if ((Idx == 1) && Imm.getBitWidth() <= 64 && isInt<16>(Imm.getSExtValue()))
185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return TCC_Free;
186dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return PPCTTI::getIntImmCost(Imm, Ty);
189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned PPCTTI::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               Type *Ty) const {
193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (DisablePPCConstHoist)
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TargetTransformInfo::getIntImmCost(Opcode, Idx, Imm, Ty);
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(Ty->isIntegerTy());
197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned BitSize = Ty->getPrimitiveSizeInBits();
199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (BitSize == 0)
200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return ~0U;
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned ImmIdx = ~0U;
203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool ShiftedFree = false, RunFree = false, UnsignedFree = false,
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines       ZeroFree = false;
205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  switch (Opcode) {
206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  default: return TCC_Free;
207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::GetElementPtr:
208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Always hoist the base address of a GetElementPtr. This prevents the
209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // creation of new constants for every base constant that gets constant
210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // folded with the offset.
211dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (Idx == 0)
212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return 2 * TCC_Basic;
213dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TCC_Free;
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::And:
215dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    RunFree = true; // (for the rotate-and-mask instructions)
216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Fallthrough...
217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Add:
218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Or:
219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Xor:
220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ShiftedFree = true;
221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Fallthrough...
222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Sub:
223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Mul:
224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Shl:
225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::LShr:
226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::AShr:
227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ImmIdx = 1;
228dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
229dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::ICmp:
230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    UnsignedFree = true;
231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ImmIdx = 1;
232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Fallthrough... (zero comparisons can use record-form instructions)
233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Select:
234dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ZeroFree = true;
235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
236dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::PHI:
237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Call:
238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Ret:
239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Load:
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Instruction::Store:
241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (ZeroFree && Imm == 0)
245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TCC_Free;
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Idx == ImmIdx && Imm.getBitWidth() <= 64) {
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (isInt<16>(Imm.getSExtValue()))
249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return TCC_Free;
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
251dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (RunFree) {
252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      if (Imm.getBitWidth() <= 32 &&
253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          (isShiftedMask_32(Imm.getZExtValue()) ||
254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           isShiftedMask_32(~Imm.getZExtValue())))
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return TCC_Free;
256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      if (ST->isPPC64() &&
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines          (isShiftedMask_64(Imm.getZExtValue()) ||
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines           isShiftedMask_64(~Imm.getZExtValue())))
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        return TCC_Free;
262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    }
263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (UnsignedFree && isUInt<16>(Imm.getZExtValue()))
265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return TCC_Free;
266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (ShiftedFree && (Imm.getZExtValue() & 0xFFFF) == 0)
268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return TCC_Free;
269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
271dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return PPCTTI::getIntImmCost(Imm, Ty);
272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
274a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkelvoid PPCTTI::getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) const {
275a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel  if (ST->getDarwinDirective() == PPC::DIR_A2) {
276a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel    // The A2 is in-order with a deep pipeline, and concatenation unrolling
277a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel    // helps expose latency-hiding opportunities to the instruction scheduler.
278a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel    UP.Partial = UP.Runtime = true;
279a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel  }
280a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel}
281a5d756ca39c8566a0995a3f748812befe9021ef0Hal Finkel
282a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getNumberOfRegisters(bool Vector) const {
283a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (Vector && !ST->hasAltivec())
284a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 0;
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return ST->hasVSX() ? 64 : 32;
286a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
287a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
288a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getRegisterBitWidth(bool Vector) const {
289a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (Vector) {
290a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    if (ST->hasAltivec()) return 128;
291a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 0;
292a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  }
293a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
294a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (ST->isPPC64())
295a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 64;
296a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return 32;
297a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
298a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
299a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
300a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getMaximumUnrollFactor() const {
301a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  unsigned Directive = ST->getDarwinDirective();
302a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // The 440 has no SIMD support, but floating-point instructions
303a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // have a 5-cycle latency, so unroll by 5x for latency hiding.
304a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (Directive == PPC::DIR_440)
305a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 5;
306a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
307a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // The A2 has no SIMD support, but floating-point instructions
308a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // have a 6-cycle latency, so unroll by 6x for latency hiding.
309a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (Directive == PPC::DIR_A2)
310a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 6;
311a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
312a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // FIXME: For lack of any better information, do no harm...
313a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  if (Directive == PPC::DIR_E500mc || Directive == PPC::DIR_E5500)
314a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel    return 1;
315a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
316a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // For most things, modern systems have two execution units (and
317a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // out-of-order execution).
318a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return 2;
319a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
320a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
3216bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighoferunsigned PPCTTI::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
3226bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer                                        OperandValueKind Op1Info,
3236bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer                                        OperandValueKind Op2Info) const {
324395210d15b323aa620059fe362e0f8e5eacc0b05Dmitri Gribenko  assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode");
325a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
326a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // Fallback to the default implementation.
3276bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer  return TargetTransformInfo::getArithmeticInstrCost(Opcode, Ty, Op1Info,
3286bf4f676413b8f7d97aaff289997aab344180957Arnold Schwaighofer                                                     Op2Info);
329a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
330a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
331a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getShuffleCost(ShuffleKind Kind, Type *Tp, int Index,
332a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                                Type *SubTp) const {
333a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return TargetTransformInfo::getShuffleCost(Kind, Tp, Index, SubTp);
334a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
335a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
336a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src) const {
337395210d15b323aa620059fe362e0f8e5eacc0b05Dmitri Gribenko  assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode");
338a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
339a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return TargetTransformInfo::getCastInstrCost(Opcode, Dst, Src);
340a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
341a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
342a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
343a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                                    Type *CondTy) const {
344a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return TargetTransformInfo::getCmpSelInstrCost(Opcode, ValTy, CondTy);
345a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
346a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
347a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getVectorInstrCost(unsigned Opcode, Type *Val,
348a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                                    unsigned Index) const {
349a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  assert(Val->isVectorTy() && "This must be a vector type");
350a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
3510f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  int ISD = TLI->InstructionOpcodeToISD(Opcode);
3520f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  assert(ISD && "Invalid opcode");
3530f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt
35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (ST->hasVSX() && Val->getScalarType()->isDoubleTy()) {
35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Double-precision scalars are already located in index #0.
35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (Index == 0)
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return 0;
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return TargetTransformInfo::getVectorInstrCost(Opcode, Val, Index);
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3620f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // Estimated cost of a load-hit-store delay.  This was obtained
3630f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // experimentally as a minimum needed to prevent unprofitable
3640f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // vectorization for the paq8p benchmark.  It may need to be
3650f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // raised further if other unprofitable cases remain.
366dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned LHSPenalty = 2;
367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (ISD == ISD::INSERT_VECTOR_ELT)
368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LHSPenalty += 7;
3690f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt
3700f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // Vector element insert/extract with Altivec is very expensive,
3710f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // because they require store and reload with the attendant
3720f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // processor stall for load-hit-store.  Until VSX is available,
3730f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  // these need to be estimated as very costly.
3740f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt  if (ISD == ISD::EXTRACT_VECTOR_ELT ||
3750f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt      ISD == ISD::INSERT_VECTOR_ELT)
3760f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt    return LHSPenalty +
3770f58dbae4ab2397dc310e19d171a4bc60fc6c9a7Bill Schmidt      TargetTransformInfo::getVectorInstrCost(Opcode, Val, Index);
3788f7dc823bfda3efede14a3cf9c294a2da3ad8777Bill Schmidt
379a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return TargetTransformInfo::getVectorInstrCost(Opcode, Val, Index);
380a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
381a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
382a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkelunsigned PPCTTI::getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment,
383a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel                                 unsigned AddressSpace) const {
384a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // Legalize the type.
385a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
386a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
387a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel         "Invalid Opcode");
388a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned Cost =
39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TargetTransformInfo::getMemoryOpCost(Opcode, Src, Alignment, AddressSpace);
39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // VSX loads/stores support unaligned access.
393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (ST->hasVSX()) {
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (LT.second == MVT::v2f64 || LT.second == MVT::v2i64)
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return Cost;
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool UnalignedAltivec =
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Src->isVectorTy() &&
400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Src->getPrimitiveSizeInBits() >= LT.second.getSizeInBits() &&
401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LT.second.getSizeInBits() == 128 &&
402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Opcode == Instruction::Load;
403a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
404a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // PPC in general does not support unaligned loads and stores. They'll need
405a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  // to be decomposed based on the alignment factor.
406a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  unsigned SrcBytes = LT.second.getStoreSize();
407dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (SrcBytes && Alignment && Alignment < SrcBytes && !UnalignedAltivec) {
40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Cost += LT.first*(SrcBytes/Alignment-1);
409a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // For a vector type, there is also scalarization overhead (only for
411dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // stores, loads are expanded using the vector-load + permutation sequence,
412dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // which is much less expensive).
413dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (Src->isVectorTy() && Opcode == Instruction::Store)
414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      for (int i = 0, e = Src->getVectorNumElements(); i < e; ++i)
415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        Cost += getVectorInstrCost(Instruction::ExtractElement, Src, i);
416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
418a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel  return Cost;
419a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel}
420a8b289b70d5ef416608bb71a874b8b4fe80158e1Hal Finkel
421