[clang] [llvm] [VectorCombine] Shrink loads used in shufflevector rebroadcasts (PR #128938)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue May 6 09:32:01 PDT 2025
================
@@ -3483,6 +3487,131 @@ bool VectorCombine::foldInterleaveIntrinsics(Instruction &I) {
return true;
}
+// Attempt to shrink loads that are only used by shufflevector instructions.
+bool VectorCombine::shrinkLoadForShuffles(Instruction &I) {
+ auto *OldLoad = dyn_cast<LoadInst>(&I);
+ if (!OldLoad || !OldLoad->isSimple())
+ return false;
+
+ auto *VecTy = dyn_cast<FixedVectorType>(OldLoad->getType());
+ if (!VecTy)
+ return false;
+
+ // Search all uses of load. If all uses are shufflevector instructions, and
+ // the second operands are all poison values, find the minimum and maximum
+ // indices of the vector elements referenced by all shuffle masks.
+ // Otherwise return `std::nullopt`.
+ using IndexRange = std::pair<int, int>;
+ auto GetIndexRangeInShuffles = [&]() -> std::optional<IndexRange> {
+ IndexRange OutputRange = IndexRange(VecTy->getNumElements(), -1);
+ for (auto &Use : I.uses()) {
+ // All uses must be shufflevector instructions.
+ auto *Shuffle = dyn_cast<ShuffleVectorInst>(Use.getUser());
+ if (!Shuffle)
+ return std::nullopt;
+
+ // Ignore shufflevector instructions that have no uses.
+ if (!Shuffle->hasNUsesOrMore(1u))
+ continue;
+
+ // Ensure second operand is a poison value.
+ auto *Op0 = Shuffle->getOperand(0);
+ auto *Op1 = Shuffle->getOperand(1);
----------------
RKSimon wrote:
(style) avoid auto apart from casts
https://github.com/llvm/llvm-project/pull/128938
More information about the llvm-commits
mailing list