[llvm] [IA][RISCV] Support VP loads/stores in InterleavedAccessPass (PR #120490)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 27 08:13:33 PST 2025
================
@@ -643,43 +666,92 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic(
DeinterleaveDeadInsts))
return false;
- LLVM_DEBUG(dbgs() << "IA: Found a deinterleave intrinsic: " << *DI
- << " with factor = " << DeinterleaveValues.size() << "\n");
+ const unsigned Factor = DeinterleaveValues.size();
- // Try and match this with target specific intrinsics.
- if (!TLI->lowerDeinterleaveIntrinsicToLoad(LI, DeinterleaveValues))
- return false;
+ if (auto *VPLoad = dyn_cast<VPIntrinsic>(LoadedVal)) {
+ if (VPLoad->getIntrinsicID() != Intrinsic::vp_load)
+ return false;
+ // Check mask operand. Handle both all-true and interleaved mask.
+ Value *WideMask = VPLoad->getOperand(1);
+ std::optional<Value *> Mask = getMask(WideMask, Factor);
+ if (!Mask)
+ return false;
+
+ LLVM_DEBUG(dbgs() << "IA: Found a vp.load with deinterleave intrinsic "
+ << *DI << " and factor = " << Factor << "\n");
+
+ // Since lowerInterleaveLoad expects Shuffles and LoadInst, use special
+ // TLI function to emit target-specific interleaved instruction.
+ if (!TLI->lowerInterleavedScalableLoad(VPLoad, *Mask, DI,
+ DeinterleaveValues))
----------------
lukel97 wrote:
Is there anything preventing this from being called with a fixed length vector? Or why do we need to restrict it to scalable vectors in the first place?
It looks like RISCVTargetLowering::lowerDeinterleaveIntrinsicToLoad already handles fixed length vectors.
I don't think we need to handle fixed length vectors in this PR necessarily, we could just check for them in the TII hook and return false.
https://github.com/llvm/llvm-project/pull/120490
More information about the llvm-commits
mailing list