mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[SLPVectorizer] Introducing getTreeEntry() helper function [NFC]
Differential Revision: https://reviews.llvm.org/D34756 llvm-svn: 306655
This commit is contained in:
parent
d78cf6b3f0
commit
93e49735f5
@ -504,7 +504,7 @@ private:
|
||||
Last->NeedToGather = !Vectorized;
|
||||
if (Vectorized) {
|
||||
for (int i = 0, e = VL.size(); i != e; ++i) {
|
||||
assert(!ScalarToTreeEntry.count(VL[i]) && "Scalar already in tree!");
|
||||
assert(!getTreeEntry(VL[i]) && "Scalar already in tree!");
|
||||
ScalarToTreeEntry[VL[i]] = idx;
|
||||
}
|
||||
} else {
|
||||
@ -521,6 +521,20 @@ private:
|
||||
/// Holds all of the tree entries.
|
||||
std::vector<TreeEntry> VectorizableTree;
|
||||
|
||||
TreeEntry *getTreeEntry(Value *V) {
|
||||
auto I = ScalarToTreeEntry.find(V);
|
||||
if (I != ScalarToTreeEntry.end())
|
||||
return &VectorizableTree[I->second];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const TreeEntry *getTreeEntry(Value *V) const {
|
||||
auto I = ScalarToTreeEntry.find(V);
|
||||
if (I != ScalarToTreeEntry.end())
|
||||
return &VectorizableTree[I->second];
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// Maps a specific scalar to its tree entry.
|
||||
SmallDenseMap<Value*, int> ScalarToTreeEntry;
|
||||
|
||||
@ -1072,9 +1086,7 @@ void BoUpSLP::buildTree(ArrayRef<Value *> Roots,
|
||||
continue;
|
||||
|
||||
// Skip in-tree scalars that become vectors
|
||||
if (ScalarToTreeEntry.count(U)) {
|
||||
int Idx = ScalarToTreeEntry[U];
|
||||
TreeEntry *UseEntry = &VectorizableTree[Idx];
|
||||
if (TreeEntry *UseEntry = getTreeEntry(U)) {
|
||||
Value *UseScalar = UseEntry->Scalars[0];
|
||||
// Some in-tree scalars will remain as scalar in vectorized
|
||||
// instructions. If that is the case, the one in Lane 0 will
|
||||
@ -1083,7 +1095,7 @@ void BoUpSLP::buildTree(ArrayRef<Value *> Roots,
|
||||
!InTreeUserNeedToExtract(Scalar, UserInst, TLI)) {
|
||||
DEBUG(dbgs() << "SLP: \tInternal user will be removed:" << *U
|
||||
<< ".\n");
|
||||
assert(!VectorizableTree[Idx].NeedToGather && "Bad state");
|
||||
assert(!UseEntry->NeedToGather && "Bad state");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -1156,9 +1168,7 @@ void BoUpSLP::buildTree_rec(ArrayRef<Value *> VL, unsigned Depth,
|
||||
}
|
||||
|
||||
// Check if this is a duplicate of another entry.
|
||||
if (ScalarToTreeEntry.count(VL[0])) {
|
||||
int Idx = ScalarToTreeEntry[VL[0]];
|
||||
TreeEntry *E = &VectorizableTree[Idx];
|
||||
if (TreeEntry *E = getTreeEntry(VL[0])) {
|
||||
for (unsigned i = 0, e = VL.size(); i != e; ++i) {
|
||||
DEBUG(dbgs() << "SLP: \tChecking bundle: " << *VL[i] << ".\n");
|
||||
if (E->Scalars[i] != VL[i]) {
|
||||
@ -1997,7 +2007,7 @@ int BoUpSLP::getSpillCost() {
|
||||
// Update LiveValues.
|
||||
LiveValues.erase(PrevInst);
|
||||
for (auto &J : PrevInst->operands()) {
|
||||
if (isa<Instruction>(&*J) && ScalarToTreeEntry.count(&*J))
|
||||
if (isa<Instruction>(&*J) && getTreeEntry(&*J))
|
||||
LiveValues.insert(cast<Instruction>(&*J));
|
||||
}
|
||||
|
||||
@ -2393,9 +2403,7 @@ Value *BoUpSLP::Gather(ArrayRef<Value *> VL, VectorType *Ty) {
|
||||
CSEBlocks.insert(Insrt->getParent());
|
||||
|
||||
// Add to our 'need-to-extract' list.
|
||||
if (ScalarToTreeEntry.count(VL[i])) {
|
||||
int Idx = ScalarToTreeEntry[VL[i]];
|
||||
TreeEntry *E = &VectorizableTree[Idx];
|
||||
if (TreeEntry *E = getTreeEntry(VL[i])) {
|
||||
// Find which lane we need to extract.
|
||||
int FoundLane = -1;
|
||||
for (unsigned Lane = 0, LE = VL.size(); Lane != LE; ++Lane) {
|
||||
@ -2415,11 +2423,7 @@ Value *BoUpSLP::Gather(ArrayRef<Value *> VL, VectorType *Ty) {
|
||||
}
|
||||
|
||||
Value *BoUpSLP::alreadyVectorized(ArrayRef<Value *> VL) const {
|
||||
SmallDenseMap<Value*, int>::const_iterator Entry
|
||||
= ScalarToTreeEntry.find(VL[0]);
|
||||
if (Entry != ScalarToTreeEntry.end()) {
|
||||
int Idx = Entry->second;
|
||||
const TreeEntry *En = &VectorizableTree[Idx];
|
||||
if (const TreeEntry *En = getTreeEntry(VL[0])) {
|
||||
if (En->isSame(VL) && En->VectorizedValue)
|
||||
return En->VectorizedValue;
|
||||
}
|
||||
@ -2427,12 +2431,9 @@ Value *BoUpSLP::alreadyVectorized(ArrayRef<Value *> VL) const {
|
||||
}
|
||||
|
||||
Value *BoUpSLP::vectorizeTree(ArrayRef<Value *> VL) {
|
||||
if (ScalarToTreeEntry.count(VL[0])) {
|
||||
int Idx = ScalarToTreeEntry[VL[0]];
|
||||
TreeEntry *E = &VectorizableTree[Idx];
|
||||
if (TreeEntry *E = getTreeEntry(VL[0]))
|
||||
if (E->isSame(VL))
|
||||
return vectorizeTree(E);
|
||||
}
|
||||
|
||||
Type *ScalarTy = VL[0]->getType();
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(VL[0]))
|
||||
@ -2667,9 +2668,9 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The pointer operand uses an in-tree scalar so we add the new BitCast to
|
||||
// ExternalUses list to make sure that an extract will be generated in the
|
||||
// future.
|
||||
if (ScalarToTreeEntry.count(LI->getPointerOperand()))
|
||||
ExternalUses.push_back(
|
||||
ExternalUser(LI->getPointerOperand(), cast<User>(VecPtr), 0));
|
||||
Value *PO = LI->getPointerOperand();
|
||||
if (getTreeEntry(PO))
|
||||
ExternalUses.push_back(ExternalUser(PO, cast<User>(VecPtr), 0));
|
||||
|
||||
unsigned Alignment = LI->getAlignment();
|
||||
LI = Builder.CreateLoad(VecPtr);
|
||||
@ -2700,9 +2701,9 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The pointer operand uses an in-tree scalar so we add the new BitCast to
|
||||
// ExternalUses list to make sure that an extract will be generated in the
|
||||
// future.
|
||||
if (ScalarToTreeEntry.count(SI->getPointerOperand()))
|
||||
ExternalUses.push_back(
|
||||
ExternalUser(SI->getPointerOperand(), cast<User>(VecPtr), 0));
|
||||
Value *PO = SI->getPointerOperand();
|
||||
if (getTreeEntry(PO))
|
||||
ExternalUses.push_back(ExternalUser(PO, cast<User>(VecPtr), 0));
|
||||
|
||||
if (!Alignment) {
|
||||
Alignment = DL->getABITypeAlignment(SI->getValueOperand()->getType());
|
||||
@ -2783,7 +2784,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
// The scalar argument uses an in-tree scalar so we add the new vectorized
|
||||
// call to ExternalUses list to make sure that an extract will be
|
||||
// generated in the future.
|
||||
if (ScalarArg && ScalarToTreeEntry.count(ScalarArg))
|
||||
if (ScalarArg && getTreeEntry(ScalarArg))
|
||||
ExternalUses.push_back(ExternalUser(ScalarArg, cast<User>(V), 0));
|
||||
|
||||
E->VectorizedValue = V;
|
||||
@ -2897,10 +2898,8 @@ BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues) {
|
||||
// has multiple uses of the same value.
|
||||
if (User && !is_contained(Scalar->users(), User))
|
||||
continue;
|
||||
assert(ScalarToTreeEntry.count(Scalar) && "Invalid scalar");
|
||||
|
||||
int Idx = ScalarToTreeEntry[Scalar];
|
||||
TreeEntry *E = &VectorizableTree[Idx];
|
||||
TreeEntry *E = getTreeEntry(Scalar);
|
||||
assert(E && "Invalid scalar");
|
||||
assert(!E->NeedToGather && "Extracting from a gather list");
|
||||
|
||||
Value *Vec = E->VectorizedValue;
|
||||
@ -2986,7 +2985,7 @@ BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues) {
|
||||
for (User *U : Scalar->users()) {
|
||||
DEBUG(dbgs() << "SLP: \tvalidating user:" << *U << ".\n");
|
||||
|
||||
assert((ScalarToTreeEntry.count(U) ||
|
||||
assert((getTreeEntry(U) ||
|
||||
// It is legal to replace users in the ignorelist by undef.
|
||||
is_contained(UserIgnoreList, U)) &&
|
||||
"Replacing out-of-tree value with undef");
|
||||
@ -3449,7 +3448,7 @@ void BoUpSLP::scheduleBlock(BlockScheduling *BS) {
|
||||
I = I->getNextNode()) {
|
||||
ScheduleData *SD = BS->getScheduleData(I);
|
||||
assert(
|
||||
SD->isPartOfBundle() == (ScalarToTreeEntry.count(SD->Inst) != 0) &&
|
||||
SD->isPartOfBundle() == (getTreeEntry(SD->Inst) != nullptr) &&
|
||||
"scheduler and vectorizer have different opinion on what is a bundle");
|
||||
SD->FirstInBundle->SchedulingPriority = Idx++;
|
||||
if (SD->isSchedulingEntity()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user