diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-20 16:39:11 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-20 16:39:11 +0000 |
commit | 025e26dd324eb254964c41de3717972bc3529f44 (patch) | |
tree | 1e483dd445aa6bcb226b5ab499ee4b04c612bab2 /llvm/lib/Target/X86/X86TargetTransformInfo.cpp | |
parent | e55fd41f73a1487757b77fdd4db552edb21de5bc (diff) | |
download | bcm5719-llvm-025e26dd324eb254964c41de3717972bc3529f44.tar.gz bcm5719-llvm-025e26dd324eb254964c41de3717972bc3529f44.zip |
[CostModel][X86] Fixed AVX1/AVX512 sdiv/udiv general costs for 256/512 bit integer vectors
We weren't accounting for legal types on every subtarget, meaning that many of the costs were using defaults.
We still don't correctly cost (or test) the 512-bit sdiv/udiv by uniform const cases, nor the power-of-2 cases.
llvm-svn: 284744
Diffstat (limited to 'llvm/lib/Target/X86/X86TargetTransformInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86TargetTransformInfo.cpp | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp index a37ecd59023..11bce7c46f5 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp @@ -156,6 +156,25 @@ int X86TTIImpl::getArithmeticInstrCost( return LT.first * Entry->Cost; } + static const CostTblEntry AVX512BWCostTable[] = { + // Vectorizing division is a bad idea. See the SSE2 table for more comments. + { ISD::SDIV, MVT::v64i8, 64*20 }, + { ISD::SDIV, MVT::v32i16, 32*20 }, + { ISD::SDIV, MVT::v16i32, 16*20 }, + { ISD::SDIV, MVT::v8i64, 8*20 }, + { ISD::UDIV, MVT::v64i8, 64*20 }, + { ISD::UDIV, MVT::v32i16, 32*20 }, + { ISD::UDIV, MVT::v16i32, 16*20 }, + { ISD::UDIV, MVT::v8i64, 8*20 }, + }; + + // Look for AVX512BW lowering tricks for custom cases. + if (ST->hasBWI()) { + if (const auto *Entry = CostTableLookup(AVX512BWCostTable, ISD, + LT.second)) + return LT.first * Entry->Cost; + } + static const CostTblEntry AVX512CostTable[] = { { ISD::SHL, MVT::v16i32, 1 }, { ISD::SRL, MVT::v16i32, 1 }, @@ -244,7 +263,16 @@ int X86TTIImpl::getArithmeticInstrCost( { ISD::SRA, MVT::v16i16, 10 }, // extend/vpsravd/pack sequence. { ISD::SRA, MVT::v2i64, 4 }, // srl/xor/sub sequence. { ISD::SRA, MVT::v4i64, 4 }, // srl/xor/sub sequence. + }; + + // Look for AVX2 lowering tricks for custom cases. + if (ST->hasAVX2()) { + if (const auto *Entry = CostTableLookup(AVX2CustomCostTable, ISD, + LT.second)) + return LT.first * Entry->Cost; + } + static const CostTblEntry AVXCustomCostTable[] = { // Vectorizing division is a bad idea. See the SSE2 table for more comments. { ISD::SDIV, MVT::v32i8, 32*20 }, { ISD::SDIV, MVT::v16i16, 16*20 }, @@ -257,8 +285,8 @@ int X86TTIImpl::getArithmeticInstrCost( }; // Look for AVX2 lowering tricks for custom cases. - if (ST->hasAVX2()) { - if (const auto *Entry = CostTableLookup(AVX2CustomCostTable, ISD, + if (ST->hasAVX()) { + if (const auto *Entry = CostTableLookup(AVXCustomCostTable, ISD, LT.second)) return LT.first * Entry->Cost; } |