diff options
author | David Green <david.green@arm.com> | 2024-04-21 13:53:22 +0100 |
---|---|---|
committer | David Green <david.green@arm.com> | 2024-04-21 13:53:22 +0100 |
commit | 18bb175428f520aaa4a5e388bd3b680a1a7c60c0 (patch) | |
tree | 2ef84ccc4cb545764d7e49d3203edadb86dba00f /llvm/lib/CodeGen/InterleavedAccessPass.cpp | |
parent | 8c0341df029d7eb8e60d1e4f49edd3e4af1b1e11 (diff) | |
download | llvm-18bb175428f520aaa4a5e388bd3b680a1a7c60c0.zip llvm-18bb175428f520aaa4a5e388bd3b680a1a7c60c0.tar.gz llvm-18bb175428f520aaa4a5e388bd3b680a1a7c60c0.tar.bz2 |
[AArch64] Add costs for LD3/LD4 shuffles.
Similar to #87934, this adds costs to the shuffles in a canonical LD3/LD4
pattern, which are represented in LLVM as deinterleaving-shuffle(load). This
likely has less effect at the moment than the ST3/ST4 costs as instcombine will
perform certain transforms without considering the cost.
Diffstat (limited to 'llvm/lib/CodeGen/InterleavedAccessPass.cpp')
-rw-r--r-- | llvm/lib/CodeGen/InterleavedAccessPass.cpp | 32 |
1 files changed, 5 insertions, 27 deletions
diff --git a/llvm/lib/CodeGen/InterleavedAccessPass.cpp b/llvm/lib/CodeGen/InterleavedAccessPass.cpp index 438ac1c..8989eab 100644 --- a/llvm/lib/CodeGen/InterleavedAccessPass.cpp +++ b/llvm/lib/CodeGen/InterleavedAccessPass.cpp @@ -200,28 +200,6 @@ FunctionPass *llvm::createInterleavedAccessPass() { return new InterleavedAccess(); } -/// Check if the mask is a DE-interleave mask of the given factor -/// \p Factor like: -/// <Index, Index+Factor, ..., Index+(NumElts-1)*Factor> -static bool isDeInterleaveMaskOfFactor(ArrayRef<int> Mask, unsigned Factor, - unsigned &Index) { - // Check all potential start indices from 0 to (Factor - 1). - for (Index = 0; Index < Factor; Index++) { - unsigned i = 0; - - // Check that elements are in ascending order by Factor. Ignore undef - // elements. - for (; i < Mask.size(); i++) - if (Mask[i] >= 0 && static_cast<unsigned>(Mask[i]) != Index + i * Factor) - break; - - if (i == Mask.size()) - return true; - } - - return false; -} - /// Check if the mask is a DE-interleave mask for an interleaved load. /// /// E.g. DE-interleave masks (Factor = 2) could be: @@ -238,7 +216,7 @@ static bool isDeInterleaveMask(ArrayRef<int> Mask, unsigned &Factor, // Make sure we don't produce a load wider than the input load. if (Mask.size() * Factor > NumLoadElements) return false; - if (isDeInterleaveMaskOfFactor(Mask, Factor, Index)) + if (ShuffleVectorInst::isDeInterleaveMaskOfFactor(Mask, Factor, Index)) return true; } @@ -333,8 +311,8 @@ bool InterleavedAccessImpl::lowerInterleavedLoad( for (auto *Shuffle : Shuffles) { if (Shuffle->getType() != VecTy) return false; - if (!isDeInterleaveMaskOfFactor(Shuffle->getShuffleMask(), Factor, - Index)) + if (!ShuffleVectorInst::isDeInterleaveMaskOfFactor( + Shuffle->getShuffleMask(), Factor, Index)) return false; assert(Shuffle->getShuffleMask().size() <= NumLoadElements); @@ -343,8 +321,8 @@ bool InterleavedAccessImpl::lowerInterleavedLoad( for (auto *Shuffle : BinOpShuffles) { if (Shuffle->getType() != VecTy) return false; - if (!isDeInterleaveMaskOfFactor(Shuffle->getShuffleMask(), Factor, - Index)) + if (!ShuffleVectorInst::isDeInterleaveMaskOfFactor( + Shuffle->getShuffleMask(), Factor, Index)) return false; assert(Shuffle->getShuffleMask().size() <= NumLoadElements); |