[llvm] [GlobalISel] Make scalar G_SHUFFLE_VECTOR illegal. (PR #140508)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 30 03:03:12 PDT 2025
================
@@ -3331,6 +3331,55 @@ bool IRTranslator::translateShuffleVector(const User &U,
Mask = SVI->getShuffleMask();
else
Mask = cast<ConstantExpr>(U).getShuffleMask();
+
+ // As GISel does not represent <1 x > vectors as a separate type from scalars,
+ // we transform shuffle_vector with a scalar output to an
+ // ExtractVectorElement. If the input type is also scalar it becomes a Copy.
+ unsigned DstElts = cast<FixedVectorType>(U.getType())->getNumElements();
+ unsigned SrcElts =
+ cast<FixedVectorType>(U.getOperand(0)->getType())->getNumElements();
+ if (DstElts == 1) {
+ unsigned M = Mask[0];
+ if (SrcElts == 1) {
+ if (M == 0 || M == 1) {
+ return translateCopy(U, *U.getOperand(M), MIRBuilder);
+ }
+ MIRBuilder.buildUndef(getOrCreateVReg(U));
+ return true;
+ } else {
+ if (M < SrcElts) {
+ MIRBuilder.buildExtractVectorElementConstant(
+ getOrCreateVReg(U), getOrCreateVReg(*U.getOperand(0)), M);
----------------
Pierre-vh wrote:
`getOrCreateVReg(U)` can be moved into a variable, it's used in all cases
https://github.com/llvm/llvm-project/pull/140508
More information about the llvm-commits
mailing list