diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-12-21 03:03:11 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-12-21 03:03:11 +0000 |
| commit | bee2ad718530e92b76218068aed07ecb14ce7d02 (patch) | |
| tree | b36ce421f6f9407f995ff414534f56bef5678690 /llvm/lib/Target | |
| parent | 5763cbb42645fd5cb5b08f2f91029d87776f7902 (diff) | |
| download | bcm5719-llvm-bee2ad718530e92b76218068aed07ecb14ce7d02.tar.gz bcm5719-llvm-bee2ad718530e92b76218068aed07ecb14ce7d02.zip | |
AMDGPU/GlobalISel: Redo legality for build_vector
It seems better to avoid using the callback if possible since
there are coverage assertions which are disabled if this is used.
Also fix missing tests. Only test the legal cases since it seems
legalization for build_vector is quite lacking.
llvm-svn: 349878
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 59111e17b61..c7df4440749 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -33,13 +33,42 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, }; const LLT S1 = LLT::scalar(1); - const LLT V2S16 = LLT::vector(2, 16); - const LLT V2S32 = LLT::vector(2, 32); - const LLT S32 = LLT::scalar(32); const LLT S64 = LLT::scalar(64); const LLT S512 = LLT::scalar(512); + const LLT V2S16 = LLT::vector(2, 16); + + const LLT V2S32 = LLT::vector(2, 32); + const LLT V3S32 = LLT::vector(3, 32); + const LLT V4S32 = LLT::vector(4, 32); + const LLT V5S32 = LLT::vector(5, 32); + const LLT V6S32 = LLT::vector(6, 32); + const LLT V7S32 = LLT::vector(7, 32); + const LLT V8S32 = LLT::vector(8, 32); + const LLT V9S32 = LLT::vector(9, 32); + const LLT V10S32 = LLT::vector(10, 32); + const LLT V11S32 = LLT::vector(11, 32); + const LLT V12S32 = LLT::vector(12, 32); + const LLT V13S32 = LLT::vector(13, 32); + const LLT V14S32 = LLT::vector(14, 32); + const LLT V15S32 = LLT::vector(15, 32); + const LLT V16S32 = LLT::vector(16, 32); + + const LLT V2S64 = LLT::vector(2, 64); + const LLT V3S64 = LLT::vector(3, 64); + const LLT V4S64 = LLT::vector(4, 64); + const LLT V5S64 = LLT::vector(5, 64); + const LLT V6S64 = LLT::vector(6, 64); + const LLT V7S64 = LLT::vector(7, 64); + const LLT V8S64 = LLT::vector(8, 64); + + std::initializer_list<LLT> AllS32Vectors = + {V2S32, V3S32, V4S32, V5S32, V6S32, V7S32, V8S32, + V9S32, V10S32, V11S32, V12S32, V13S32, V14S32, V15S32, V16S32}; + std::initializer_list<LLT> AllS64Vectors = + {V2S64, V3S64, V4S64, V5S64, V6S64, V7S64, V8S64}; + const LLT GlobalPtr = GetAddrSpacePtr(AMDGPUAS::GLOBAL_ADDRESS); const LLT ConstantPtr = GetAddrSpacePtr(AMDGPUAS::CONSTANT_ADDRESS); const LLT LocalPtr = GetAddrSpacePtr(AMDGPUAS::LOCAL_ADDRESS); @@ -231,13 +260,12 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, }); getActionDefinitionsBuilder(G_BUILD_VECTOR) - .legalIf([=](const LegalityQuery &Query) { - const LLT &VecTy = Query.Types[0]; - const LLT &ScalarTy = Query.Types[1]; - return VecTy.getSizeInBits() % 32 == 0 && - ScalarTy.getSizeInBits() % 32 == 0 && - VecTy.getSizeInBits() <= 512; - }); + .legalForCartesianProduct(AllS32Vectors, {S32}) + .legalForCartesianProduct(AllS64Vectors, {S64}) + .clampNumElements(0, V16S32, V16S32) + .clampNumElements(0, V2S64, V8S64) + .minScalarSameAs(1, 0); + // Merge/Unmerge for (unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) { unsigned BigTyIdx = Op == G_MERGE_VALUES ? 0 : 1; |

