[PATCH] D148096: [AMDGPU][GlobalISel] Widen the vector operand in G_BUILD/INSERT/EXTRACT_VECTOR

Mateja Marjanovic via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 12 02:44:07 PDT 2023


matejam created this revision.
matejam added reviewers: foad, arsenm.
matejam added a project: LLVM.
Herald added subscribers: kosarev, StephenFan, kerbowa, hiraditya, tpr, dstuttard, yaxunl, jvesely, kzhuravl.
Herald added a project: All.
matejam requested review of this revision.
Herald added a subscriber: wdng.

Widen the vector operand type in G_BUILD_VECTOR, G_INSERT_VECTOR_ELT,
G_EXTRACT_VECTOR_ELT to the nearest larger RegClass.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D148096

Files:
  llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
  llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp


Index: llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
+++ llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
@@ -1450,6 +1450,22 @@
     unsigned IdxTypeIdx = 2;
 
     getActionDefinitionsBuilder(Op)
+      .moreElementsIf(
+        [=](const LegalityQuery &Query) {
+          const LLT Ty = Query.Types[VecTypeIdx];
+          return Ty.getSizeInBits() < 1024 &&
+                 !SIRegisterInfo::getSGPRClassForBitWidth(Ty.getSizeInBits());
+        }, [=](const LegalityQuery &Query) {
+        const LLT Ty = Query.Types[VecTypeIdx];
+        unsigned NumElts = Ty.getNumElements();
+        unsigned EltSize = Ty.getElementType().getSizeInBits();
+
+        // Find the nearest legal RegClass that is larger than the current type.
+        while (!SIRegisterInfo::getSGPRClassForBitWidth(NumElts * EltSize))
+          ++NumElts;
+
+        return std::pair(VecTypeIdx, LLT::fixed_vector(NumElts, EltSize));
+      })
       .customIf([=](const LegalityQuery &Query) {
           const LLT EltTy = Query.Types[EltTypeIdx];
           const LLT VecTy = Query.Types[VecTypeIdx];
@@ -1534,6 +1550,22 @@
   }
 
   auto &BuildVector = getActionDefinitionsBuilder(G_BUILD_VECTOR)
+    .moreElementsIf(
+      [=](const LegalityQuery &Query) {
+        const LLT Ty = Query.Types[0];
+        return Ty.getSizeInBits() < 1024 &&
+               !SIRegisterInfo::getSGPRClassForBitWidth(Ty.getSizeInBits());
+      }, [=](const LegalityQuery &Query) {
+        const LLT Ty = Query.Types[0];
+        unsigned NumElts = Ty.getNumElements();
+        unsigned EltSize = Ty.getElementType().getSizeInBits();
+
+        // Find the nearest legal RegClass that is larger than the current type.
+        while (!SIRegisterInfo::getSGPRClassForBitWidth(NumElts * EltSize))
+          ++NumElts;
+
+        return std::pair(0, LLT::fixed_vector(NumElts, EltSize));
+      })
     .legalForCartesianProduct(AllS32Vectors, {S32})
     .legalForCartesianProduct(AllS64Vectors, {S64})
     .clampNumElements(0, V16S32, V32S32)
Index: llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -4896,6 +4896,7 @@
     return Legalized;
   }
   case TargetOpcode::G_EXTRACT:
+  case TargetOpcode::G_EXTRACT_VECTOR_ELT:
     if (TypeIdx != 1)
       return UnableToLegalize;
     Observer.changingInstr(MI);
@@ -4903,6 +4904,7 @@
     Observer.changedInstr(MI);
     return Legalized;
   case TargetOpcode::G_INSERT:
+  case TargetOpcode::G_INSERT_VECTOR_ELT:
   case TargetOpcode::G_FREEZE:
   case TargetOpcode::G_FNEG:
   case TargetOpcode::G_FABS:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148096.512727.patch
Type: text/x-patch
Size: 2817 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230412/840e9272/attachment.bin>


More information about the llvm-commits mailing list