[llvm] [GISel][AMDGPU] Expand ShuffleVector (PR #124527)

Pierre van Houtryve via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 17 04:34:51 PST 2025


================
@@ -384,6 +384,72 @@ void CombinerHelper::applyCombineConcatVectors(
   MI.eraseFromParent();
 }
 
+bool CombinerHelper::matchCombineShuffle(MachineInstr &MI) const {
+  assert(MI.getOpcode() == TargetOpcode::G_SHUFFLE_VECTOR &&
+         "Invalid instruction");
+  auto &Shuffle = cast<GShuffleVector>(MI);
+
+  auto SrcVec1 = Shuffle.getSrc1Reg();
+  int SrcVec2 = Shuffle.getSrc2Reg();
+
+  LLT SrcVec1Type = MRI.getType(SrcVec1);
+  LLT SrcVec2Type = MRI.getType(SrcVec2);
+  if (!SrcVec1Type.isVector() || !SrcVec2Type.isVector()) {
+    return false;
+  }
+
+  /*
+  auto Mask = Shuffle.getMask();
+
+  // Check if all elements are extracted from the same vector, or within single
+  // vector.
+  // TODO: this is unnecessary.
+  auto MaxValue = *std::max_element(Mask.begin(), Mask.end());
+  auto MinValue = *std::min_element(Mask.begin(), Mask.end());
+  if (MaxValue >= Width && MinValue < Width) {
+    return false;
+  }
+
+  // Check if the extractee's order is kept, and they should be consecutive.
+  // This would allow opportunities.
+  for (size_t i = 1; i < Mask.size(); ++i) {
+    if (Mask[i] != Mask[i - 1] + 1) {
+      return false; // Not consecutive
+    }
+  }
+  */
+
+  return true;
+}
+
+void CombinerHelper::applyCombineShuffle(MachineInstr &MI) const {
+  auto &Shuffle = cast<GShuffleVector>(MI);
+
+  auto SrcVec1 = Shuffle.getSrc1Reg();
+  auto SrcVec2 = Shuffle.getSrc2Reg();
+  auto EltTy = MRI.getType(SrcVec1).getElementType();
+  auto Width = MRI.getType(SrcVec1).getNumElements();
+  auto ExtractWidth = Shuffle.getMask().size();
+
+  auto Unmerge1 = Builder.buildUnmerge(EltTy, SrcVec1);
+  auto Unmerge2 = Builder.buildUnmerge(EltTy, SrcVec2);
+
+  llvm::SmallVector<Register> Extracts;
----------------
Pierre-vh wrote:

```suggestion
  SmallVector<Register> Extracts;
```

https://github.com/llvm/llvm-project/pull/124527


More information about the llvm-commits mailing list