diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 5cc64ded465b..34576ba6c13e 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -411,12 +411,14 @@ unsigned ARMTTI::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, EVT SelCondTy = TLI->getValueType(CondTy); EVT SelValTy = TLI->getValueType(ValTy); - int Idx = ConvertCostTableLookup(NEONVectorSelectTbl, - array_lengthof(NEONVectorSelectTbl), - ISD, SelCondTy.getSimpleVT(), - SelValTy.getSimpleVT()); - if (Idx != -1) - return NEONVectorSelectTbl[Idx].Cost; + if (SelCondTy.isSimple() && SelValTy.isSimple()) { + int Idx = ConvertCostTableLookup(NEONVectorSelectTbl, + array_lengthof(NEONVectorSelectTbl), + ISD, SelCondTy.getSimpleVT(), + SelValTy.getSimpleVT()); + if (Idx != -1) + return NEONVectorSelectTbl[Idx].Cost; + } std::pair LT = TLI->getTypeLegalizationCost(ValTy); return LT.first; diff --git a/llvm/test/Analysis/CostModel/ARM/select.ll b/llvm/test/Analysis/CostModel/ARM/select.ll index 34ed1eefdaf4..21eef83c4bbe 100644 --- a/llvm/test/Analysis/CostModel/ARM/select.ll +++ b/llvm/test/Analysis/CostModel/ARM/select.ll @@ -63,5 +63,13 @@ define void @casts() { ; CHECK: cost of 1 {{.*}} select %v19 = select <2 x i1> undef, <2 x double> undef, <2 x double> undef + ; odd vectors get legalized and should have similar costs + ; CHECK: cost of 1 {{.*}} select + %v20 = select <1 x i1> undef, <1 x i32> undef, <1 x i32> undef + ; CHECK: cost of 1 {{.*}} select + %v21 = select <3 x i1> undef, <3 x float> undef, <3 x float> undef + ; CHECK: cost of 4 {{.*}} select + %v22 = select <5 x i1> undef, <5 x double> undef, <5 x double> undef + ret void }