Cost Model: Normalize the insert/extract index when splitting types

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167402 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nadav Rotem 2012-11-05 21:12:13 +00:00
parent 75138f58b0
commit a4ab5290e6
2 changed files with 27 additions and 3 deletions

View File

@ -17556,9 +17556,26 @@ X86VectorTargetTransformInfo::getArithmeticInstrCost(unsigned Opcode,
unsigned
X86VectorTargetTransformInfo::getVectorInstrCost(unsigned Opcode, Type *Val,
unsigned Index) const {
// Floating point scalars are already located in index #0.
if (Val->getScalarType()->isFloatingPointTy() && Index == 0)
return 0;
assert(Val->isVectorTy() && "This must be a vector type");
if (Index != -1) {
// Legalize the type.
std::pair<unsigned, MVT> LT =
getTypeLegalizationCost(Val->getContext(), TLI->getValueType(Val));
// This type is legalized to a scalar type.
if (!LT.second.isVector())
return 0;
// The type may be split. Normalize the index to the new type.
unsigned Width = LT.second.getVectorNumElements();
Index = Index % Width;
// Floating point scalars are already located in index #0.
if (Val->getScalarType()->isFloatingPointTy() && Index == 0)
return 0;
}
return VectorTargetTransformImpl::getVectorInstrCost(Opcode, Val, Index);
}

View File

@ -29,5 +29,12 @@ define i32 @insert-extract-at-zero-idx(i32 %arg, float %fl) {
;CHECK: cost of 0 {{.*}} insert
%J = insertelement <4 x double> undef, double undef, i32 0
;CHECK: cost of 0 {{.*}} insert
%K = insertelement <8 x double> undef, double undef, i32 4
;CHECK: cost of 0 {{.*}} insert
%L = insertelement <16 x double> undef, double undef, i32 8
;CHECK: cost of 1 {{.*}} insert
%M = insertelement <16 x double> undef, double undef, i32 9
ret i32 0
}