diff options
author | Hassnaa Hamdi <hassnaa.hamdi@arm.com> | 2024-08-12 17:23:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-12 17:23:00 +0100 |
commit | 3176f255c9dd43e8bacad0f9e56cf4f9f8816009 (patch) | |
tree | bcdb92b164486a85817999d908d9c2aff391a476 /llvm/lib/CodeGen/InterleavedAccessPass.cpp | |
parent | 7c4c72b52038810a8997938a2b3485363cd6be3a (diff) | |
download | llvm-3176f255c9dd43e8bacad0f9e56cf4f9f8816009.zip llvm-3176f255c9dd43e8bacad0f9e56cf4f9f8816009.tar.gz llvm-3176f255c9dd43e8bacad0f9e56cf4f9f8816009.tar.bz2 |
[IA][AArch64]: Construct (de)interleave4 out of (de)interleave2 (#89276)
- [AArch64]: TargetLowering is updated to spot load/store (de)interleave4 like sequences using PatternMatch,
and emit equivalent sve.ld4 and sve.st4 intrinsics.
Diffstat (limited to 'llvm/lib/CodeGen/InterleavedAccessPass.cpp')
-rw-r--r-- | llvm/lib/CodeGen/InterleavedAccessPass.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/InterleavedAccessPass.cpp b/llvm/lib/CodeGen/InterleavedAccessPass.cpp index 8c9065a..ef11713 100644 --- a/llvm/lib/CodeGen/InterleavedAccessPass.cpp +++ b/llvm/lib/CodeGen/InterleavedAccessPass.cpp @@ -489,7 +489,7 @@ bool InterleavedAccessImpl::lowerDeinterleaveIntrinsic( LLVM_DEBUG(dbgs() << "IA: Found a deinterleave intrinsic: " << *DI << "\n"); // Try and match this with target specific intrinsics. - if (!TLI->lowerDeinterleaveIntrinsicToLoad(DI, LI)) + if (!TLI->lowerDeinterleaveIntrinsicToLoad(DI, LI, DeadInsts)) return false; // We now have a target-specific load, so delete the old one. @@ -510,13 +510,16 @@ bool InterleavedAccessImpl::lowerInterleaveIntrinsic( LLVM_DEBUG(dbgs() << "IA: Found an interleave intrinsic: " << *II << "\n"); + SmallVector<Instruction *, 4> InterleaveDeadInsts; // Try and match this with target specific intrinsics. - if (!TLI->lowerInterleaveIntrinsicToStore(II, SI)) + if (!TLI->lowerInterleaveIntrinsicToStore(II, SI, InterleaveDeadInsts)) return false; // We now have a target-specific store, so delete the old one. DeadInsts.push_back(SI); DeadInsts.push_back(II); + DeadInsts.insert(DeadInsts.end(), InterleaveDeadInsts.begin(), + InterleaveDeadInsts.end()); return true; } @@ -537,7 +540,7 @@ bool InterleavedAccessImpl::runOnFunction(Function &F) { // with a factor of 2. if (II->getIntrinsicID() == Intrinsic::vector_deinterleave2) Changed |= lowerDeinterleaveIntrinsic(II, DeadInsts); - if (II->getIntrinsicID() == Intrinsic::vector_interleave2) + else if (II->getIntrinsicID() == Intrinsic::vector_interleave2) Changed |= lowerInterleaveIntrinsic(II, DeadInsts); } } |