[llvm] [GISel][AMDGPU] Expand ShuffleVector (PR #124527)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 26 22:46:12 PST 2025
================
@@ -384,6 +384,45 @@ void CombinerHelper::applyCombineConcatVectors(
MI.eraseFromParent();
}
+bool CombinerHelper::matchCombineShuffleToBuildVector(MachineInstr &MI) const {
+ assert(MI.getOpcode() == TargetOpcode::G_SHUFFLE_VECTOR &&
+ "Invalid instruction");
+ auto &Shuffle = cast<GShuffleVector>(MI);
+
+ auto SrcVec1 = Shuffle.getSrc1Reg();
+ auto SrcVec2 = Shuffle.getSrc2Reg();
+
+ LLT SrcVec1Type = MRI.getType(SrcVec1);
+ LLT SrcVec2Type = MRI.getType(SrcVec2);
+ return SrcVec1Type.isVector() && SrcVec2Type.isVector();
+}
+
+void CombinerHelper::applyCombineShuffleToBuildVector(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 Unmerge1 = Builder.buildUnmerge(EltTy, SrcVec1);
+ auto Unmerge2 = Builder.buildUnmerge(EltTy, SrcVec2);
+
+ SmallVector<Register> Extracts;
+ // Select only applicable elements from unmerged values.
+ for (auto Val : Shuffle.getMask()) {
+ if (Val == -1)
+ Extracts.push_back(Builder.buildUndef(EltTy).getReg(0));
+ else if (Val < Width)
+ Extracts.push_back(Unmerge1.getReg(Val));
+ else
+ Extracts.push_back(Unmerge2.getReg(Val - Width));
+ }
+
+ Builder.buildBuildVector(MI.getOperand(0).getReg(), Extracts);
----------------
arsenm wrote:
I thought @aemerson already did the shuffle -> build case?
Should this try to fold directly to extract_subvector like the comment suggests if it's reading consecutive elements?
https://github.com/llvm/llvm-project/pull/124527
More information about the llvm-commits
mailing list