[llvm] [SLP]Improve/fix subvectors in gather/buildvector nodes handling (PR #104144)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 21 11:56:19 PDT 2024
================
@@ -8361,8 +8367,49 @@ getGEPCosts(const TargetTransformInfo &TTI, ArrayRef<Value *> Ptrs,
void BoUpSLP::transformNodes() {
constexpr TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
- for (std::unique_ptr<TreeEntry> &TE : VectorizableTree) {
- TreeEntry &E = *TE;
+ // The tree may grow here, so iterate over nodes, built before.
+ for (unsigned Idx : seq<unsigned>(VectorizableTree.size())) {
+ TreeEntry &E = *VectorizableTree[Idx];
+ if (E.isGather()) {
+ ArrayRef<Value *> VL = E.Scalars;
+ const unsigned Sz = getVectorElementSize(VL.front());
+ unsigned MinVF = getMinVF(2 * Sz);
+ if (VL.size() <= 2 ||
+ (E.getOpcode() &&
+ (E.isAltShuffle() || E.getOpcode() != Instruction::Load)))
+ continue;
+ // Try to find vectorizable sequences and transform them into a serie of
+ // insertvector instructions.
+ unsigned StartIdx = 0;
+ unsigned End = VL.size();
+ for (unsigned VF = VL.size() / 2; VF >= MinVF; VF /= 2) {
+ for (unsigned Cnt = StartIdx; Cnt + VF <= End; Cnt += VF) {
+ ArrayRef<Value *> Slice = VL.slice(Cnt, VF);
+ InstructionsState S = getSameOpcode(Slice, *TLI);
+ if (!S.getOpcode() || S.isAltShuffle() ||
+ (S.getOpcode() != Instruction::Load &&
+ any_of(Slice, [&](Value *V) {
+ return !areAllUsersVectorized(cast<Instruction>(V),
+ UserIgnoreList);
+ })))
+ continue;
+ if (!getTreeEntry(Slice.front()) && !getTreeEntry(Slice.back())) {
+ unsigned PrevSize = VectorizableTree.size();
+ buildTree_rec(Slice, 0, EdgeInfo(&E, UINT_MAX));
+ if (PrevSize + 1 == VectorizableTree.size() &&
+ VectorizableTree[PrevSize]->isGather()) {
+ VectorizableTree.pop_back();
----------------
alexey-bataev wrote:
Yes. The vector of nodes may only grow here, we need to iterate over the nodes that existed before this loop, so it is safe.
https://github.com/llvm/llvm-project/pull/104144
More information about the llvm-commits
mailing list