summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-30 04:19:31 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-30 04:19:31 +0000
commitdc6c78596b76856d98830060359467483e58d36e (patch)
treec24011d3e40a0c942f36151def609ce286e97b7a /llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
parenta8710a6e7ea8bca33f25b0af796c34cf88bde066 (diff)
downloadbcm5719-llvm-dc6c78596b76856d98830060359467483e58d36e.tar.gz
bcm5719-llvm-dc6c78596b76856d98830060359467483e58d36e.zip
GlobalISel: Implement fewerElementsVector for select
llvm-svn: 352601
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
index 0da46072702..d665ffbb146 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
@@ -314,7 +314,26 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST,
getActionDefinitionsBuilder(G_SELECT)
.legalFor({{S32, S1}, {S64, S1}, {V2S32, S1}, {V2S16, S1}})
.clampScalar(0, S32, S64)
- .scalarize(0);
+ .fewerElementsIf(
+ [=](const LegalityQuery &Query) {
+ if (Query.Types[1].isVector())
+ return true;
+
+ LLT Ty = Query.Types[0];
+
+ // FIXME: Hack until odd splits handled
+ return Ty.isVector() &&
+ (Ty.getScalarSizeInBits() > 32 || Ty.getNumElements() % 2 != 0);
+ },
+ scalarize(0))
+ // FIXME: Handle 16-bit vectors better
+ .fewerElementsIf(
+ [=](const LegalityQuery &Query) {
+ return Query.Types[0].isVector() &&
+ Query.Types[0].getElementType().getSizeInBits() < 32;},
+ scalarize(0))
+ .scalarize(1)
+ .clampMaxNumElements(0, S32, 2);
// TODO: Only the low 4/5/6 bits of the shift amount are observed, so we can
// be more flexible with the shift amount type.
OpenPOWER on IntegriCloud