aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2012-10-30 02:41:57 +0000
committerHal Finkel <hfinkel@anl.gov>2012-10-30 02:41:57 +0000
commitc588e0e162fa08c81558871fb0c50fb51569afe3 (patch)
tree6b1d823890dcd191354283a16854dfa22eab50ea
parent8ceffeb95cca477d1faf176e95140272a28cb91c (diff)
Remove an invalid assert in TargetTransformImpl
getCastInstrCost had an assert prohibiting scalar to vector casts. Such casts, however, are allowed. This should make the vectorizer buildbot happier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166998 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/TargetTransformImpl.cpp17
-rw-r--r--test/Transforms/BBVectorize/X86/vs-cast.ll12
2 files changed, 25 insertions, 4 deletions
diff --git a/lib/Target/TargetTransformImpl.cpp b/lib/Target/TargetTransformImpl.cpp
index 657491b495..27877a9320 100644
--- a/lib/Target/TargetTransformImpl.cpp
+++ b/lib/Target/TargetTransformImpl.cpp
@@ -196,7 +196,6 @@ unsigned VectorTargetTransformImpl::getBroadcastCost(Type *Tp) const {
unsigned VectorTargetTransformImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
Type *Src) const {
- assert(Src->isVectorTy() == Dst->isVectorTy() && "Invalid input types");
int ISD = InstructionOpcodeToISD(Opcode);
assert(ISD && "Invalid opcode");
@@ -217,6 +216,8 @@ unsigned VectorTargetTransformImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
}
}
+ unsigned ScalarizationCost = 1;
+
// Otherwise, assume that the cast is scalarized.
if (Dst->isVectorTy()) {
unsigned Num = Dst->getVectorNumElements();
@@ -224,11 +225,19 @@ unsigned VectorTargetTransformImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
Dst->getScalarType());
// return the cost of multiple scalar invocation plus the cost of inserting
// and extracting the values.
- return getScalarizationOverhead(Dst, true, true) + Num * Cost;
+ ScalarizationCost *= getScalarizationOverhead(Dst, true, true) + Num * Cost;
}
- // Unknown scalar opcode.
- return 1;
+ if (Src->isVectorTy()) {
+ unsigned Num = Src->getVectorNumElements();
+ unsigned Cost = getCastInstrCost(Opcode, Dst->getScalarType(),
+ Src->getScalarType());
+ // return the cost of multiple scalar invocation plus the cost of inserting
+ // and extracting the values.
+ ScalarizationCost *= getScalarizationOverhead(Src, true, true) + Num * Cost;
+ }
+
+ return ScalarizationCost;
}
unsigned VectorTargetTransformImpl::getCFInstrCost(unsigned Opcode) const {
diff --git a/test/Transforms/BBVectorize/X86/vs-cast.ll b/test/Transforms/BBVectorize/X86/vs-cast.ll
new file mode 100644
index 0000000000..be3efca925
--- /dev/null
+++ b/test/Transforms/BBVectorize/X86/vs-cast.ll
@@ -0,0 +1,12 @@
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -bb-vectorize -S | FileCheck %s
+
+define void @main() nounwind uwtable {
+entry:
+ %0 = bitcast <2 x i64> undef to i128
+ %1 = bitcast <2 x i64> undef to i128
+ ret void
+; CHECK: @main
+}
+