aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/TargetTransformImpl.cpp
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 /lib/Target/TargetTransformImpl.cpp
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
Diffstat (limited to 'lib/Target/TargetTransformImpl.cpp')
-rw-r--r--lib/Target/TargetTransformImpl.cpp17
1 files changed, 13 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 {