[llvm] r185085 - CostModel: improve the cost model for load/store of non power-of-two types such as <3 x float>, which are popular in graphics.
Nadav Rotem
nrotem at apple.com
Thu Jun 27 10:52:04 PDT 2013
Author: nadav
Date: Thu Jun 27 12:52:04 2013
New Revision: 185085
URL: http://llvm.org/viewvc/llvm-project?rev=185085&view=rev
Log:
CostModel: improve the cost model for load/store of non power-of-two types such as <3 x float>, which are popular in graphics.
Modified:
llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
llvm/trunk/test/Analysis/CostModel/X86/load_store.ll
Modified: llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp?rev=185085&r1=185084&r2=185085&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp Thu Jun 27 12:52:04 2013
@@ -539,8 +539,51 @@ unsigned X86TTI::getVectorInstrCost(unsi
return TargetTransformInfo::getVectorInstrCost(Opcode, Val, Index);
}
+unsigned X86TTI::getScalarizationOverhead(Type *Ty, bool Insert,
+ bool Extract) const {
+ assert (Ty->isVectorTy() && "Can only scalarize vectors");
+ unsigned Cost = 0;
+
+ for (int i = 0, e = Ty->getVectorNumElements(); i < e; ++i) {
+ if (Insert)
+ Cost += TopTTI->getVectorInstrCost(Instruction::InsertElement, Ty, i);
+ if (Extract)
+ Cost += TopTTI->getVectorInstrCost(Instruction::ExtractElement, Ty, i);
+ }
+
+ return Cost;
+}
+
unsigned X86TTI::getMemoryOpCost(unsigned Opcode, Type *Src, unsigned Alignment,
unsigned AddressSpace) const {
+ // Handle non power of two vectors such as <3 x float>
+ if (VectorType *VTy = dyn_cast<VectorType>(Src)) {
+ unsigned NumElem = VTy->getVectorNumElements();
+
+ // Handle a few common cases:
+ // <3 x float>
+ if (NumElem == 3 && VTy->getScalarSizeInBits() == 32)
+ // Cost = 64 bit store + extract + 32 bit store.
+ return 3;
+
+ // <3 x double>
+ if (NumElem == 3 && VTy->getScalarSizeInBits() == 64)
+ // Cost = 128 bit store + unpack + 64 bit store.
+ return 3;
+
+ // Assume that all other non power-of-two numbers are scalarized.
+ if (!isPowerOf2_32(NumElem)) {
+ unsigned Cost = TargetTransformInfo::getMemoryOpCost(Opcode,
+ VTy->getScalarType(),
+ Alignment,
+ AddressSpace);
+ unsigned SplitCost = getScalarizationOverhead(Src,
+ Opcode == Instruction::Load,
+ Opcode==Instruction::Store);
+ return NumElem * Cost + SplitCost;
+ }
+ }
+
// Legalize the type.
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);
assert((Opcode == Instruction::Load || Opcode == Instruction::Store) &&
Modified: llvm/trunk/test/Analysis/CostModel/X86/load_store.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/X86/load_store.ll?rev=185085&r1=185084&r2=185085&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/CostModel/X86/load_store.ll (original)
+++ llvm/trunk/test/Analysis/CostModel/X86/load_store.ll Thu Jun 27 12:52:04 2013
@@ -59,6 +59,25 @@ define i32 @loads(i32 %arg) {
;CHECK: cost of 4 {{.*}} load
load <8 x i64>* undef, align 4
+
+ ;CHECK: cost of 3 {{.*}} load
+ load <3 x float>* undef, align 4
+
+ ;CHECK: cost of 3 {{.*}} load
+ load <3 x double>* undef, align 4
+
+ ;CHECK: cost of 3 {{.*}} load
+ load <3 x i32>* undef, align 4
+
+ ;CHECK: cost of 3 {{.*}} load
+ load <3 x i64>* undef, align 4
+
+ ;CHECK: cost of 10 {{.*}} load
+ load <5 x i32>* undef, align 4
+
+ ;CHECK: cost of 10 {{.*}} load
+ load <5 x i64>* undef, align 4
+
ret i32 undef
}
More information about the llvm-commits
mailing list