[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