From acb459574afc344bcb676737496f3fa35b1f04c1 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sat, 2 Oct 2021 13:40:09 +0300 Subject: [PATCH] [X86][Costmodel] Load/store i8 Stride=4 VF=32 interleaving costs While we already model this tuple, the load cost is divergent from reality, so fix it. The only sched models that for cpu's that support avx2 but not avx512 are: haswell, broadwell, skylake, zen1-3 For load we have: https://godbolt.org/z/zWMhhnPYa - for intels `Block RThroughput: =56.0`; for ryzens, `Block RThroughput: <=24.0` So pick cost of `56`. For store we have: https://godbolt.org/z/vnqqjWx51 - for intels `Block RThroughput: =12.0`; for ryzens, `Block RThroughput: <=4.0` So pick cost of `12`. I'm directly using the shuffling asm the llc produced, without any manual fixups that may be needed to ensure sequential execution. Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D110971 --- llvm/lib/Target/X86/X86TargetTransformInfo.cpp | 2 +- llvm/test/Analysis/CostModel/X86/interleaved-load-i8-stride-4.ll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp index 6848987..a379938 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp @@ -5098,7 +5098,7 @@ InstructionCost X86TTIImpl::getInterleavedMemoryOpCostAVX2( {4, MVT::v4i8, 4}, // (load 16i8 and) deinterleave into 4 x 4i8 {4, MVT::v8i8, 12}, // (load 32i8 and) deinterleave into 4 x 8i8 {4, MVT::v16i8, 24}, // (load 64i8 and) deinterleave into 4 x 16i8 - {4, MVT::v32i8, 80}, // (load 128i8 and) deinterleave into 4 x 32i8 + {4, MVT::v32i8, 56}, // (load 128i8 and) deinterleave into 4 x 32i8 {4, MVT::v2i16, 6}, // (load 8i16 and) deinterleave into 4 x 2i16 {4, MVT::v4i16, 17}, // (load 16i16 and) deinterleave into 4 x 4i16 diff --git a/llvm/test/Analysis/CostModel/X86/interleaved-load-i8-stride-4.ll b/llvm/test/Analysis/CostModel/X86/interleaved-load-i8-stride-4.ll index 74b3860..59a6481 100644 --- a/llvm/test/Analysis/CostModel/X86/interleaved-load-i8-stride-4.ll +++ b/llvm/test/Analysis/CostModel/X86/interleaved-load-i8-stride-4.ll @@ -30,7 +30,7 @@ target triple = "x86_64-unknown-linux-gnu" ; AVX2: LV: Found an estimated cost of 5 for VF 4 For instruction: %v0 = load i8, i8* %in0, align 1 ; AVX2: LV: Found an estimated cost of 13 for VF 8 For instruction: %v0 = load i8, i8* %in0, align 1 ; AVX2: LV: Found an estimated cost of 26 for VF 16 For instruction: %v0 = load i8, i8* %in0, align 1 -; AVX2: LV: Found an estimated cost of 84 for VF 32 For instruction: %v0 = load i8, i8* %in0, align 1 +; AVX2: LV: Found an estimated cost of 60 for VF 32 For instruction: %v0 = load i8, i8* %in0, align 1 ; ; AVX512: LV: Found an estimated cost of 1 for VF 1 For instruction: %v0 = load i8, i8* %in0, align 1 ; AVX512: LV: Found an estimated cost of 5 for VF 2 For instruction: %v0 = load i8, i8* %in0, align 1 -- 2.7.4