[llvm] [GlobalISel] Import extract/insert subvector (PR #110287)

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 28 12:07:19 PDT 2024


================
@@ -2588,6 +2588,20 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
                          getOrCreateVReg(*CI.getOperand(0)),
                          getOrCreateVReg(*CI.getOperand(1)));
     return true;
+  case Intrinsic::vector_extract: {
+    ConstantInt *Index = cast<ConstantInt>(CI.getOperand(1));
+    MIRBuilder.buildExtractSubvector(getOrCreateVReg(CI),
+                                     getOrCreateVReg(*CI.getOperand(0)),
+                                     Index->getZExtValue());
+    return true;
+  }
+  case Intrinsic::vector_insert: {
----------------
qcolombet wrote:

What would it take to reuse the implementation of `IRTranslator::translateInsertElement` directly? (And same question for extract)

Reimplementing things here will lead us to having to fix the same issues we had in the past.
E.g.,
```
  // If it is a <1 x Ty> vector, use the scalar as it is
  // not a legal vector type in LLT.
  if (auto *FVT = dyn_cast<FixedVectorType>(U.getType());
      FVT && FVT->getNumElements() == 1)
    return translateCopy(U, *U.getOperand(1), MIRBuilder);
```

https://github.com/llvm/llvm-project/pull/110287


More information about the llvm-commits mailing list