[llvm] [LV]: Teach LV to recursively (de)interleave. (PR #89018)
Hassnaa Hamdi via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 11 08:09:12 PDT 2024
================
@@ -2126,10 +2127,39 @@ static Value *interleaveVectors(IRBuilderBase &Builder, ArrayRef<Value *> Vals,
// Scalable vectors cannot use arbitrary shufflevectors (only splats), so
// must use intrinsics to interleave.
if (VecTy->isScalableTy()) {
- VectorType *WideVecTy = VectorType::getDoubleElementsVectorType(VecTy);
- return Builder.CreateIntrinsic(WideVecTy, Intrinsic::vector_interleave2,
- Vals,
- /*FMFSource=*/nullptr, Name);
+ unsigned InterleaveFactor = Vals.size();
+ SmallVector<Value *> InterleavingValues;
+ unsigned InterleavingValuesCount =
+ InterleaveFactor + (InterleaveFactor - 2);
+ InterleavingValues.resize(InterleaveFactor);
+ // Place the values to be interleaved in the correct order for the
+ // interleaving
+ for (unsigned I = 0, J = InterleaveFactor / 2, K = 0; K < InterleaveFactor;
+ K++) {
+ if (K % 2 == 0) {
+ InterleavingValues[K] = Vals[I];
+ I++;
+ } else {
+ InterleavingValues[K] = Vals[J];
+ J++;
+ }
+ }
+#ifndef NDEBUG
+ for (Value *Val : InterleavingValues)
+ assert(Val && "NULL Interleaving Value");
+#endif
----------------
hassnaaHamdi wrote:
Done
https://github.com/llvm/llvm-project/pull/89018
More information about the llvm-commits
mailing list