Skip to content

Commit

Permalink
Revert "[SLP][NFC]Improve compile-time by using map {TreeEntry *, Ins…
Browse files Browse the repository at this point in the history
…truction *}"

This reverts commit 0d21b7c.

Causes broken IR, test case provided at
https://reviews.llvm.org/rG0d21b7cbdeb2f2eb5ef123a15099da0b651b24c0
  • Loading branch information
aeubanks committed Jul 17, 2023
1 parent bec04b4 commit 1cb3fbc
Showing 1 changed file with 28 additions and 15 deletions.
43 changes: 28 additions & 15 deletions llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Expand Up @@ -8994,9 +8994,6 @@ void BoUpSLP::reorderInputsAccordingToOpcode(
}

Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
auto &Res = EntryToLastInstruction.FindAndConstruct(E);
if (Res.second)
return *Res.second;
// Get the basic block this bundle is in. All instructions in the bundle
// should be in this block (except for extractelement-like instructions with
// constant indeces).
Expand All @@ -9011,7 +9008,7 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
isVectorLikeInstWithConstOps(I);
}));

auto FindLastInst = [&]() {
auto &&FindLastInst = [E, Front, this, &BB]() {
Instruction *LastInst = Front;
for (Value *V : E->Scalars) {
auto *I = dyn_cast<Instruction>(V);
Expand Down Expand Up @@ -9047,7 +9044,7 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
return LastInst;
};

auto FindFirstInst = [&]() {
auto &&FindFirstInst = [E, Front, this]() {
Instruction *FirstInst = Front;
for (Value *V : E->Scalars) {
auto *I = dyn_cast<Instruction>(V);
Expand Down Expand Up @@ -9087,6 +9084,7 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
if (doesNotNeedToSchedule(E->Scalars) ||
(E->State != TreeEntry::NeedToGather &&
all_of(E->Scalars, isVectorLikeInstWithConstOps))) {
Instruction *InsertInst;
if ((E->getOpcode() == Instruction::GetElementPtr &&
any_of(E->Scalars,
[](Value *V) {
Expand All @@ -9095,12 +9093,15 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
all_of(E->Scalars, [](Value *V) {
return !isVectorLikeInstWithConstOps(V) && isUsedOutsideBlock(V);
}))
Res.second = FindLastInst();
InsertInst = FindLastInst();
else
Res.second = FindFirstInst();
return *Res.second;
InsertInst = FindFirstInst();
return *InsertInst;
}

// The last instruction in the bundle in program order.
Instruction *LastInst = nullptr;

// Find the last instruction. The common case should be that BB has been
// scheduled, and the last instruction is VL.back(). So we start with
// VL.back() and iterate over schedule data until we reach the end of the
Expand All @@ -9113,7 +9114,7 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
if (Bundle && Bundle->isPartOfBundle())
for (; Bundle; Bundle = Bundle->NextInBundle)
if (Bundle->OpValue == Bundle->Inst)
Res.second = Bundle->Inst;
LastInst = Bundle->Inst;
}

// LastInst can still be null at this point if there's either not an entry
Expand All @@ -9134,15 +9135,15 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
// not ideal. However, this should be exceedingly rare since it requires that
// we both exit early from buildTree_rec and that the bundle be out-of-order
// (causing us to iterate all the way to the end of the block).
if (!Res.second)
Res.second = FindLastInst();
assert(Res.second && "Failed to find last instruction in bundle");
return *Res.second;
if (!LastInst)
LastInst = FindLastInst();
assert(LastInst && "Failed to find last instruction in bundle");
return *LastInst;
}

void BoUpSLP::setInsertPointAfterBundle(const TreeEntry *E) {
auto *Front = E->getMainOp();
Instruction *LastInst = &getLastInstructionInBundle(E);
Instruction *LastInst = EntryToLastInstruction.lookup(E);
assert(LastInst && "Failed to find last instruction in bundle");
// If the instruction is PHI, set the insert point after all the PHIs.
bool IsPHI = isa<PHINode>(LastInst);
Expand Down Expand Up @@ -9663,7 +9664,7 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx) {
IRBuilder<>::InsertPointGuard Guard(Builder);
if (E->getOpcode() != Instruction::InsertElement &&
E->getOpcode() != Instruction::PHI) {
Instruction *LastInst = &getLastInstructionInBundle(E);
Instruction *LastInst = EntryToLastInstruction.lookup(E);
assert(LastInst && "Failed to find last instruction in bundle");
Builder.SetInsertPoint(LastInst);
}
Expand Down Expand Up @@ -10683,6 +10684,18 @@ Value *BoUpSLP::vectorizeTree(
scheduleBlock(BSIter.second.get());
}

// Pre-gather last instructions.
for (const std::unique_ptr<TreeEntry> &E : VectorizableTree) {
if ((E->State == TreeEntry::NeedToGather &&
(!E->getMainOp() || E->Idx > 0)) ||
(E->State != TreeEntry::NeedToGather &&
E->getOpcode() == Instruction::ExtractValue) ||
E->getOpcode() == Instruction::InsertElement)
continue;
Instruction *LastInst = &getLastInstructionInBundle(E.get());
EntryToLastInstruction.try_emplace(E.get(), LastInst);
}

Builder.SetInsertPoint(ReductionRoot ? ReductionRoot
: &F->getEntryBlock().front());
auto *VectorRoot = vectorizeTree(VectorizableTree[0].get());
Expand Down

0 comments on commit 1cb3fbc

Please sign in to comment.