[llvm] [IA]: Construct (de)interleave4 out of (de)interleave2 (PR #89276)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 8 05:44:08 PDT 2024
================
@@ -16958,40 +17085,96 @@ 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) {
+ ExtractedLdValues[J] = Builder.CreateInsertVector(
+ VTy, ExtractedLdValues[J], Builder.CreateExtractValue(LdN, J), Idx);
+ }
+ LLVM_DEBUG(dbgs() << "LdN4 res: "; LdN->dump());
}
-
- Result = PoisonValue::get(DI->getType());
- Result = Builder.CreateInsertValue(Result, Left, 0);
- Result = Builder.CreateInsertValue(Result, Right, 1);
+ // Replace output of deinterleave2 intrinsic by output of ldN2/ldN4
+ for (unsigned J = 0; J < Factor; ++J)
+ DeinterleavedValues[J]->replaceAllUsesWith(ExtractedLdValues[J]);
} else {
+ Value *Result;
if (UseScalable)
Result = Builder.CreateCall(LdNFunc, {Pred, BaseAddr}, "ldN");
else
Result = Builder.CreateCall(LdNFunc, BaseAddr, "ldN");
+ // Replace output of deinterleave2 intrinsic by output of ldN2/ldN4
+ for (unsigned I = 0; I < DeinterleavedValues.size(); I++) {
----------------
paulwalker-arm wrote:
Can you use `Factor` here instead of `DeinterleavedValues.size()`? since it's already cached.
https://github.com/llvm/llvm-project/pull/89276
More information about the llvm-commits
mailing list