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