diff options
author | Nadav Rotem <nrotem@apple.com> | 2012-12-21 01:33:59 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2012-12-21 01:33:59 +0000 |
commit | f5637c399711e37287e01f9d9ca9ce7cd2f3d14f (patch) | |
tree | dcd65a6368e1ef7e88a0e9223df34ee4e70cb64a /lib | |
parent | c2a537bd08d9deedefe184c9fb887c6d30ae9fd2 (diff) |
Improve the X86 cost model for loads and stores.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170830 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 24 | ||||
-rw-r--r-- | lib/Target/X86/X86ISelLowering.h | 4 |
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 1e64741c25..6b650726b6 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -17818,6 +17818,30 @@ X86VectorTargetTransformInfo::getArithmeticInstrCost(unsigned Opcode, return VectorTargetTransformImpl::getArithmeticInstrCost(Opcode, Ty); } + +unsigned +X86VectorTargetTransformInfo::getMemoryOpCost(unsigned Opcode, Type *Src, + unsigned Alignment, + unsigned AddressSpace) const { + // Legalize the type. + std::pair<unsigned, MVT> LT = getTypeLegalizationCost(Src); + assert(Opcode == Instruction::Load || Opcode == Instruction::Store && + "Invalid Opcode"); + + const X86Subtarget &ST = + TLI->getTargetMachine().getSubtarget<X86Subtarget>(); + + // Each load/store unit costs 1. + unsigned Cost = LT.first * 1; + + // On Sandybridge 256bit load/stores are double pumped + // (but not on Haswell). + if (LT.second.getSizeInBits() > 128 && !ST.hasAVX2()) + Cost*=2; + + return Cost; +} + unsigned X86VectorTargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) const { diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index 5be7f095a4..72cd3b3f5b 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -953,6 +953,10 @@ namespace llvm { virtual unsigned getArithmeticInstrCost(unsigned Opcode, Type *Ty) const; + virtual unsigned getMemoryOpCost(unsigned Opcode, Type *Src, + unsigned Alignment, + unsigned AddressSpace) const; + virtual unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) const; |