================ @@ -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); + if (!isa<PoisonValue>(Op1) && !isa<UndefValue>(Op1)) + return std::nullopt; ---------------- RKSimon wrote:
can you put most of this matching inside a m_Shuffle() ? 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