diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 81fd43e73a4..a57da6493ce 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -28,6 +28,11 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, const GCNTargetMachine &TM) { using namespace TargetOpcode; + auto scalarize = [=](const LegalityQuery &Query, unsigned TypeIdx) { + const LLT &Ty = Query.Types[TypeIdx]; + return std::make_pair(TypeIdx, Ty.getElementType()); + }; + auto GetAddrSpacePtr = [&TM](unsigned AS) { return LLT::pointer(AS, TM.getPointerSizeInBits(AS)); }; @@ -136,10 +141,12 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, setAction({G_FRAME_INDEX, PrivatePtr}, Legal); - getActionDefinitionsBuilder( - { G_FADD, G_FMUL, G_FNEG, G_FABS, G_FMA}) - .legalFor({S32, S64}) - .clampScalar(0, S32, S64); + getActionDefinitionsBuilder({G_FADD, G_FMUL, G_FNEG, G_FABS, G_FMA}) + .legalFor({S32, S64}) + .fewerElementsIf( + [=](const LegalityQuery &Query) { return Query.Types[0].isVector(); }, + [=](const LegalityQuery &Query) { return scalarize(Query, 0); }) + .clampScalar(0, S32, S64); getActionDefinitionsBuilder(G_FPTRUNC) .legalFor({{S32, S64}, {S16, S32}}); @@ -149,11 +156,14 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, .lowerFor({{S64, S16}}); // FIXME: Implement getActionDefinitionsBuilder(G_FSUB) - // Use actual fsub instruction - .legalFor({S32}) - // Must use fadd + fneg - .lowerFor({S64, S16}) - .clampScalar(0, S32, S64); + // Use actual fsub instruction + .legalFor({S32}) + // Must use fadd + fneg + .lowerFor({S64, S16, V2S16}) + .fewerElementsIf( + [=](const LegalityQuery &Query) { return Query.Types[0].isVector(); }, + [=](const LegalityQuery &Query) { return scalarize(Query, 0); }) + .clampScalar(0, S32, S64); setAction({G_FCMP, S1}, Legal); setAction({G_FCMP, 1, S32}, Legal); @@ -295,11 +305,15 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, }); getActionDefinitionsBuilder(G_BUILD_VECTOR) - .legalForCartesianProduct(AllS32Vectors, {S32}) - .legalForCartesianProduct(AllS64Vectors, {S64}) - .clampNumElements(0, V16S32, V16S32) - .clampNumElements(0, V2S64, V8S64) - .minScalarSameAs(1, 0); + .legalForCartesianProduct(AllS32Vectors, {S32}) + .legalForCartesianProduct(AllS64Vectors, {S64}) + .clampNumElements(0, V16S32, V16S32) + .clampNumElements(0, V2S64, V8S64) + .minScalarSameAs(1, 0) + // FIXME: Sort of a hack to make progress on other legalizations. + .legalIf([=](const LegalityQuery &Query) { + return Query.Types[0].getScalarSizeInBits() < 32; + }); // TODO: Support any combination of v2s32 getActionDefinitionsBuilder(G_CONCAT_VECTORS) @@ -328,12 +342,6 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, return false; }; - auto scalarize = - [=](const LegalityQuery &Query, unsigned TypeIdx) { - const LLT &Ty = Query.Types[TypeIdx]; - return std::make_pair(TypeIdx, Ty.getElementType()); - }; - getActionDefinitionsBuilder(Op) // Break up vectors with weird elements into scalars .fewerElementsIf( |

