================ @@ -3483,6 +3487,127 @@ 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()) { + // Ensure all uses match the required pattern. + User *Shuffle = Use.getUser(); + Value *Op0 = nullptr; + ArrayRef<int> Mask; + + if (!match(Shuffle, m_Shuffle(m_Value(Op0), m_Undef(), m_Mask(Mask)))) ---------------- RKSimon wrote:
Should m_Value(Op0) be m_Specific(OldLoad) ? https://github.com/llvm/llvm-project/pull/128938 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits