[llvm] [IA]: Construct (de)interleave4 out of (de)interleave2 (PR #89276)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 30 09:56:16 PDT 2024
================
@@ -16958,40 +17079,94 @@ bool AArch64TargetLowering::lowerDeinterleaveIntrinsicToLoad(
LdN = Builder.CreateCall(LdNFunc, {Pred, Address}, "ldN");
else
LdN = Builder.CreateCall(LdNFunc, Address, "ldN");
-
Value *Idx =
Builder.getInt64(I * LdTy->getElementCount().getKnownMinValue());
- Left = Builder.CreateInsertVector(
- VTy, Left, Builder.CreateExtractValue(LdN, 0), Idx);
- Right = Builder.CreateInsertVector(
- VTy, Right, Builder.CreateExtractValue(LdN, 1), Idx);
+ for (unsigned J = 0; J < Factor; ++J) {
+ WideValues[J] = Builder.CreateInsertVector(
+ VTy, WideValues[J], Builder.CreateExtractValue(LdN, J), Idx);
+ }
+ }
+ if (Factor == 2)
+ Result = PoisonValue::get(StructType::get(VTy, VTy));
+ else
+ Result = PoisonValue::get(StructType::get(VTy, VTy, VTy, VTy));
+ // Construct the wide result out of the small results.
+ for (unsigned J = 0; J < Factor; ++J) {
+ Result = Builder.CreateInsertValue(Result, WideValues[J], J);
}
-
- Result = PoisonValue::get(DI->getType());
- Result = Builder.CreateInsertValue(Result, Left, 0);
- Result = Builder.CreateInsertValue(Result, Right, 1);
} else {
if (UseScalable)
Result = Builder.CreateCall(LdNFunc, {Pred, BaseAddr}, "ldN");
else
Result = Builder.CreateCall(LdNFunc, BaseAddr, "ldN");
}
-
- DI->replaceAllUsesWith(Result);
+ // Itereate over old deinterleaved values to replace it by
+ // the new values.
+ for (unsigned I = 0; I < DeinterleavedValues.size(); I++) {
+ Value *NewExtract = Builder.CreateExtractValue(Result, I);
+ DeinterleavedValues[I]->replaceAllUsesWith(NewExtract);
+ cast<Instruction>(DeinterleavedValues[I])->eraseFromParent();
+ }
+ for (auto &dead : DeadInstructions)
+ dead->eraseFromParent();
return true;
}
+/*
+Diagram for Interleave tree.
+ A C B D
+ \ / \ /
+ [Interleave] [Interleave]
+ \ /
+ [Interleave]
+ |
+ [Store]
+values in correct order of interleave4: A B C D.
+If there is a pattern matches the interleave tree above, then we can construct
+Interleave4 out of that pattern. This function tries to match the interleave
+tree pattern, and fetch the values that we want to interleave, so that in
+further steps they can be replaced by the output of Inteleave4.
----------------
paulwalker-arm wrote:
Similar to before, perhaps:
Returns true if \`II\` is the root of an IR tree that represents a theoretical vector.interleave4 intrinsic. When true is returned \`ValuesToInterleave\` is populated with the inputs such an intrinsic would take (i.e. vector.interleave4(A, B, C, D)).
https://github.com/llvm/llvm-project/pull/89276
More information about the llvm-commits
mailing list