Cost Model: Normalize the insert/extract index when splitting types
authorNadav Rotem <nrotem@apple.com>
Mon, 5 Nov 2012 21:12:13 +0000 (21:12 +0000)
committerNadav Rotem <nrotem@apple.com>
Mon, 5 Nov 2012 21:12:13 +0000 (21:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167402 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/Analysis/CostModel/X86/insert-extract-at-zero.ll

index 575d30df2e0be6ff7a2540f5b217f8267f032c18..a42b25b65f7bbb80af6d898e45949ce7410ef8d7 100644 (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);
 }
 
index eea5b601d01dfdeb720c0e51d87b53cdf4812555..87bf7c488b918143ff91491465fc3526d5f7092f 100644 (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
 }
+