[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