forked from OSchip/llvm-project
[X86] Make X86TTIImpl::getCastInstrCost properly handle the case where AVX512 is enabled, but 512-bit vectors aren't legal.
Unlike most cost model functions this code makes a lot of table lookups without using the results from getTypeLegalizationCost. This means 512-bit vectors can be looked up even when the type isn't legal. This patch adds a check around the two tables that contain 512-bit types to make sure that neither of the types would be split by type legalization. Meaning 512 bit types are illegal. I wanted to write this in a somewhat generic way that uses type legalization query hooks. But if prefered, I can switch to just using is512BitVector and the subtarget feature. Differential Revision: https://reviews.llvm.org/D54984 llvm-svn: 347786
This commit is contained in:
parent
d3bb036bc9
commit
81f1b4a361
|
@ -1570,49 +1570,51 @@ int X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
|
||||||
if (!SrcTy.isSimple() || !DstTy.isSimple())
|
if (!SrcTy.isSimple() || !DstTy.isSimple())
|
||||||
return BaseT::getCastInstrCost(Opcode, Dst, Src);
|
return BaseT::getCastInstrCost(Opcode, Dst, Src);
|
||||||
|
|
||||||
|
MVT SimpleSrcTy = SrcTy.getSimpleVT();
|
||||||
|
MVT SimpleDstTy = DstTy.getSimpleVT();
|
||||||
|
|
||||||
|
// Make sure that neither type is going to be split before using the
|
||||||
|
// AVX512 tables. This handles -mprefer-vector-width=256
|
||||||
|
// with -min-legal-vector-width<=256
|
||||||
|
if (TLI->getTypeAction(SimpleSrcTy) != TargetLowering::TypeSplitVector &&
|
||||||
|
TLI->getTypeAction(SimpleDstTy) != TargetLowering::TypeSplitVector) {
|
||||||
if (ST->hasBWI())
|
if (ST->hasBWI())
|
||||||
if (const auto *Entry = ConvertCostTableLookup(AVX512BWConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(AVX512BWConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
|
|
||||||
if (ST->hasDQI())
|
if (ST->hasDQI())
|
||||||
if (const auto *Entry = ConvertCostTableLookup(AVX512DQConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(AVX512DQConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
|
|
||||||
if (ST->hasAVX512())
|
if (ST->hasAVX512())
|
||||||
if (const auto *Entry = ConvertCostTableLookup(AVX512FConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(AVX512FConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
|
}
|
||||||
|
|
||||||
if (ST->hasAVX2()) {
|
if (ST->hasAVX2()) {
|
||||||
if (const auto *Entry = ConvertCostTableLookup(AVX2ConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(AVX2ConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ST->hasAVX()) {
|
if (ST->hasAVX()) {
|
||||||
if (const auto *Entry = ConvertCostTableLookup(AVXConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(AVXConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ST->hasSSE41()) {
|
if (ST->hasSSE41()) {
|
||||||
if (const auto *Entry = ConvertCostTableLookup(SSE41ConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(SSE41ConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ST->hasSSE2()) {
|
if (ST->hasSSE2()) {
|
||||||
if (const auto *Entry = ConvertCostTableLookup(SSE2ConversionTbl, ISD,
|
if (const auto *Entry = ConvertCostTableLookup(SSE2ConversionTbl, ISD,
|
||||||
DstTy.getSimpleVT(),
|
SimpleDstTy, SimpleSrcTy))
|
||||||
SrcTy.getSimpleVT()))
|
|
||||||
return Entry->Cost;
|
return Entry->Cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,21 +4,13 @@
|
||||||
; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mattr=+avx512vl,+avx512bw,+avx512dq,-prefer-256-bit | FileCheck %s --check-prefixes=CHECK,VEC512
|
; RUN: opt < %s -cost-model -analyze -mtriple=x86_64-apple-macosx10.8.0 -mattr=+avx512vl,+avx512bw,+avx512dq,-prefer-256-bit | FileCheck %s --check-prefixes=CHECK,VEC512
|
||||||
|
|
||||||
define void @zext256() "min-legal-vector-width"="256" {
|
define void @zext256() "min-legal-vector-width"="256" {
|
||||||
; AVX-LABEL: 'zext256'
|
; VEC256-LABEL: 'zext256'
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %A = zext <8 x i16> undef to <8 x i64>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %A = zext <8 x i16> undef to <8 x i64>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %B = zext <8 x i32> undef to <8 x i64>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %B = zext <8 x i32> undef to <8 x i64>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %C = zext <16 x i8> undef to <16 x i32>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %C = zext <16 x i8> undef to <16 x i32>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %D = zext <16 x i16> undef to <16 x i32>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %D = zext <16 x i16> undef to <16 x i32>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %E = zext <32 x i8> undef to <32 x i16>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %E = zext <32 x i8> undef to <32 x i16>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
||||||
;
|
|
||||||
; SKX256-LABEL: 'zext256'
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %A = zext <8 x i16> undef to <8 x i64>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %B = zext <8 x i32> undef to <8 x i64>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %C = zext <16 x i8> undef to <16 x i32>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %D = zext <16 x i16> undef to <16 x i32>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %E = zext <32 x i8> undef to <32 x i16>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
|
||||||
;
|
;
|
||||||
; VEC512-LABEL: 'zext256'
|
; VEC512-LABEL: 'zext256'
|
||||||
; VEC512-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %A = zext <8 x i16> undef to <8 x i64>
|
; VEC512-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %A = zext <8 x i16> undef to <8 x i64>
|
||||||
|
@ -70,23 +62,14 @@ define void @zext512() "min-legal-vector-width"="512" {
|
||||||
}
|
}
|
||||||
|
|
||||||
define void @sext256() "min-legal-vector-width"="256" {
|
define void @sext256() "min-legal-vector-width"="256" {
|
||||||
; AVX-LABEL: 'sext256'
|
; VEC256-LABEL: 'sext256'
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %A = sext <8 x i8> undef to <8 x i64>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %A = sext <8 x i8> undef to <8 x i64>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %B = sext <8 x i16> undef to <8 x i64>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %B = sext <8 x i16> undef to <8 x i64>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %C = sext <8 x i32> undef to <8 x i64>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %C = sext <8 x i32> undef to <8 x i64>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %D = sext <16 x i8> undef to <16 x i32>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %D = sext <16 x i8> undef to <16 x i32>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %E = sext <16 x i16> undef to <16 x i32>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %E = sext <16 x i16> undef to <16 x i32>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %F = sext <32 x i8> undef to <32 x i16>
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %F = sext <32 x i8> undef to <32 x i16>
|
||||||
; AVX-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
; VEC256-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
||||||
;
|
|
||||||
; SKX256-LABEL: 'sext256'
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %A = sext <8 x i8> undef to <8 x i64>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %B = sext <8 x i16> undef to <8 x i64>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %C = sext <8 x i32> undef to <8 x i64>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %D = sext <16 x i8> undef to <16 x i32>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %E = sext <16 x i16> undef to <16 x i32>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F = sext <32 x i8> undef to <32 x i16>
|
|
||||||
; SKX256-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
|
||||||
;
|
;
|
||||||
; VEC512-LABEL: 'sext256'
|
; VEC512-LABEL: 'sext256'
|
||||||
; VEC512-NEXT: Cost Model: Found an estimated cost of 24 for instruction: %A = sext <8 x i8> undef to <8 x i64>
|
; VEC512-NEXT: Cost Model: Found an estimated cost of 24 for instruction: %A = sext <8 x i8> undef to <8 x i64>
|
||||||
|
|
Loading…
Reference in New Issue