From 93ff6d0c38756ead4067f74bc84b11ce2814aa30 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov Date: Fri, 13 Jun 2025 13:47:08 +0900 Subject: [PATCH 1/2] [LLVM][CostModel] Support struct types in select --- llvm/include/llvm/CodeGen/BasicTTIImpl.h | 5 +++++ llvm/test/Analysis/CostModel/X86/select.ll | 24 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) 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..e7e12178db3f3 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 an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX1-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; +; AVX2-LABEL: 'test_struct' +; AVX2-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX2-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; +; AVX512-LABEL: 'test_struct' +; AVX512-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; AVX512-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; +; SLM-LABEL: 'test_struct' +; SLM-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b +; SLM-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; + %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b + ret { ptr, ptr } %sel +} From ef20c361777a88f586b3349981a9d0ddb33c8d5a Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov Date: Fri, 13 Jun 2025 14:59:58 +0900 Subject: [PATCH 2/2] fix test --- llvm/test/Analysis/CostModel/X86/select.ll | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/llvm/test/Analysis/CostModel/X86/select.ll b/llvm/test/Analysis/CostModel/X86/select.ll index e7e12178db3f3..0b77731f2b3cd 100644 --- a/llvm/test/Analysis/CostModel/X86/select.ll +++ b/llvm/test/Analysis/CostModel/X86/select.ll @@ -560,20 +560,20 @@ define { ptr, ptr } @test_struct( { ptr, ptr } %a, { ptr, ptr } %b, i1 %c) { ; 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 an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b -; AVX1-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; 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 an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b -; AVX2-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; 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 an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b -; AVX512-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; 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 an estimated cost of 1 for instruction: %sel = select i1 %c, { ptr, ptr } %a, { ptr, ptr } %b -; SLM-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret { ptr, ptr } %sel +; 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