From c588e0e162fa08c81558871fb0c50fb51569afe3 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Tue, 30 Oct 2012 02:41:57 +0000 Subject: [PATCH] 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 --- lib/Target/TargetTransformImpl.cpp | 17 +++++++++++++---- test/Transforms/BBVectorize/X86/vs-cast.ll | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 test/Transforms/BBVectorize/X86/vs-cast.ll diff --git a/lib/Target/TargetTransformImpl.cpp b/lib/Target/TargetTransformImpl.cpp index 657491b4959..27877a9320a 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 00000000000..be3efca925b --- /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 +} +