[llvm] [GlobalISel] Turn shuffle a, b, mask -> shuffle undef, b, mask iff mask does not reference a (PR #115377)
Thorsten Schütt via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 7 21:52:21 PST 2024
================
@@ -7726,3 +7726,65 @@ bool CombinerHelper::matchShuffleUndefRHS(MachineInstr &MI,
return true;
}
+
+static void commuteMask(MutableArrayRef<int> Mask, const unsigned NumElems) {
+ const unsigned MaskSize = Mask.size();
+ for (unsigned I = 0; I < MaskSize; ++I) {
+ int Idx = Mask[I];
+ if (Idx < 0)
+ continue;
+
+ if (Idx < (int)NumElems)
+ Mask[I] = Idx + NumElems;
+ else
+ Mask[I] = Idx - NumElems;
+ }
+}
+
+bool CombinerHelper::matchShuffleDisjointMask(MachineInstr &MI,
+ BuildFnTy &MatchInfo) {
+
+ auto &Shuffle = cast<GShuffleVector>(MI);
+ // If any of the two inputs is already undef, don't check the mask again to
+ // prevent infinite loop
+ if (getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc1Reg(), MRI))
+ return false;
+
+ if (getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc2Reg(), MRI))
+ return false;
+
+ ArrayRef<int> Mask = Shuffle.getMask();
+ const LLT Src1Ty = MRI.getType(Shuffle.getSrc1Reg());
+
+ const unsigned NumSrcElems = Src1Ty.isVector() ? Src1Ty.getNumElements() : 1;
----------------
tschuett wrote:
I saw that in your other PR. It is a shuffle vector. There are no vectors of length 1. Both operands must be vectors.
https://github.com/llvm/llvm-project/pull/115377
More information about the llvm-commits
mailing list