diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index 574152e254f15..9208f76f020f5 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1370,6 +1370,11 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, Op1Info, Op2Info, I); + // Structs etc + if (getTLI()->getValueType(DL, ValTy, true) == MVT::Other) + return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, + Op1Info, Op2Info, I); + // Selects on vectors are actually vector selects. if (ISD == ISD::SELECT) { assert(CondTy && "CondTy must exist"); diff --git a/llvm/test/Analysis/CostModel/X86/select.ll b/llvm/test/Analysis/CostModel/X86/select.ll index f2c2890a182fc..0b77731f2b3cd 100644 --- a/llvm/test/Analysis/CostModel/X86/select.ll +++ b/llvm/test/Analysis/CostModel/X86/select.ll @@ -554,3 +554,27 @@ define <32 x i8> @test_32i8(<32 x i8> %a, <32 x i8> %b) { ret <32 x i8> %sel } +define { ptr, ptr } @test_struct( { ptr, ptr } %a, { ptr, ptr } %b, i1 %c) { +; SSE-LABEL: 'test_struct' +; SSE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; SSE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; +; AVX1-LABEL: 'test_struct' +; AVX1-NEXT: Cost Model: Found costs of 1 for: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX1-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret { ptr, ptr } %sel +; +; AVX2-LABEL: 'test_struct' +; AVX2-NEXT: Cost Model: Found costs of 1 for: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX2-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret { ptr, ptr } %sel +; +; AVX512-LABEL: 'test_struct' +; AVX512-NEXT: Cost Model: Found costs of 1 for: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX512-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret { ptr, ptr } %sel +; +; SLM-LABEL: 'test_struct' +; SLM-NEXT: Cost Model: Found costs of 1 for: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; SLM-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret { ptr, ptr } %sel +; + %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b + ret { ptr, ptr } %sel +}