[PATCH] D126713: [SLPVectorizer] Fix extractelement insertion point

Alexey Bataev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 31 13:56:59 PDT 2022


ABataev added a comment.

Could you try this patch:

  diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
  index db8f97271db6..1f33ad604d11 100644
  --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
  +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
  @@ -7237,18 +7237,41 @@ void BoUpSLP::setInsertPointAfterBundle(const TreeEntry *E) {
     auto *BB = Front->getParent();
     assert(llvm::all_of(E->Scalars, [=](Value *V) -> bool {
       auto *I = cast<Instruction>(V);
  -    return !E->isOpcodeOrAlt(I) || I->getParent() == BB;
  +    return !E->isOpcodeOrAlt(I) || I->getParent() == BB ||
  +           isVectorLikeInstWithConstOps(I);
     }));
  
  -  auto &&FindLastInst = [E, Front]() {
  +  auto &&FindLastInst = [E, Front, this, &BB]() {
       Instruction *LastInst = Front;
       for (Value *V : E->Scalars) {
         auto *I = dyn_cast<Instruction>(V);
         if (!I)
           continue;
  -      if (LastInst->comesBefore(I))
  +      if (LastInst->getParent() == I->getParent()) {
  +        if (LastInst->comesBefore(I))
  +          LastInst = I;
  +        continue;
  +      }
  +      assert(isVectorLikeInstWithConstOps(LastInst) &&
  +             isVectorLikeInstWithConstOps(I) &&
  +             "Expected vector-like insts only.");
  +      if (!DT->isReachableFromEntry(LastInst->getParent())) {
  +        LastInst = I;
  +        continue;
  +      }
  +      if (!DT->isReachableFromEntry(I->getParent()))
  +        continue;
  +      auto *NodeA = DT->getNode(LastInst->getParent());
  +      auto *NodeB = DT->getNode(I->getParent());
  +      assert(NodeA && "Should only process reachable instructions");
  +      assert(NodeB && "Should only process reachable instructions");
  +      assert((NodeA == NodeB) ==
  +                 (NodeA->getDFSNumIn() == NodeB->getDFSNumIn()) &&
  +             "Different nodes should have different DFS numbers");
  +      if (NodeA->getDFSNumIn() < NodeB->getDFSNumIn())
           LastInst = I;
       }
  +    BB = LastInst->getParent();
       return LastInst;
     };


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D126713/new/

https://reviews.llvm.org/D126713



More information about the llvm-commits mailing list