diff options
author | Alina Sbirlea <asbirlea@google.com> | 2016-08-30 23:53:59 +0000 |
---|---|---|
committer | Alina Sbirlea <asbirlea@google.com> | 2016-08-30 23:53:59 +0000 |
commit | 3f8f7840bf12ffa4bfd558e5115acbd66b39280a (patch) | |
tree | a20c66b655f152f81902a1037d847e83c3a3402f /llvm/lib/Transforms | |
parent | fdb32d566a5e81deb9a3e4c0714f74337edcfbb7 (diff) | |
download | bcm5719-llvm-3f8f7840bf12ffa4bfd558e5115acbd66b39280a.tar.gz bcm5719-llvm-3f8f7840bf12ffa4bfd558e5115acbd66b39280a.zip |
[LoadStoreVectorizer] Change VectorSet to Vector to match head and tail positions. Resolves PR29148.
Summary:
LSV was using two vector sets (heads and tails) to track pairs of adjiacent position to vectorize.
A recent optimization is trying to obtain the longest chain to vectorize and assumes the positions
in heads(H) and tails(T) match, which is not the case is there are multiple tails for the same head.
e.g.:
i1: store a[0]
i2: store a[1]
i3: store a[1]
Leads to:
H: i1
T: i2 i3
Instead of:
H: i1 i1
T: i2 i3
So the positions for instructions that follow i3 will have different indexes in H/T.
This patch resolves PR29148.
This issue also surfaced the fact that if the chain is too long, and TLI
returns a "not-fast" answer, the whole chain will be abandoned for
vectorization, even though a smaller one would be beneficial.
Added a testcase and FIXME for this.
Reviewers: tstellarAMD, arsenm, jlebar
Subscribers: mzolotukhin, wdng, llvm-commits
Differential Revision: https://reviews.llvm.org/D24057
llvm-svn: 280179
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp index 9fd0b8c3c25..90adf9f90e0 100644 --- a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp @@ -628,7 +628,7 @@ bool Vectorizer::vectorizeChains(InstrListMap &Map) { bool Vectorizer::vectorizeInstructions(ArrayRef<Instruction *> Instrs) { DEBUG(dbgs() << "LSV: Vectorizing " << Instrs.size() << " instructions.\n"); - SmallSetVector<int, 16> Heads, Tails; + SmallVector<int, 16> Heads, Tails; int ConsecutiveChain[64]; // Do a quadratic search on all of the given stores and find all of the pairs @@ -647,8 +647,8 @@ bool Vectorizer::vectorizeInstructions(ArrayRef<Instruction *> Instrs) { continue; // Should not insert. } - Tails.insert(j); - Heads.insert(i); + Tails.push_back(j); + Heads.push_back(i); ConsecutiveChain[i] = j; } } @@ -660,21 +660,21 @@ bool Vectorizer::vectorizeInstructions(ArrayRef<Instruction *> Instrs) { for (int Head : Heads) { if (InstructionsProcessed.count(Instrs[Head])) continue; - bool longerChainExists = false; + bool LongerChainExists = false; for (unsigned TIt = 0; TIt < Tails.size(); TIt++) if (Head == Tails[TIt] && !InstructionsProcessed.count(Instrs[Heads[TIt]])) { - longerChainExists = true; + LongerChainExists = true; break; } - if (longerChainExists) + if (LongerChainExists) continue; // We found an instr that starts a chain. Now follow the chain and try to // vectorize it. SmallVector<Instruction *, 16> Operands; int I = Head; - while (I != -1 && (Tails.count(I) || Heads.count(I))) { + while (I != -1 && (is_contained(Tails, I) || is_contained(Heads, I))) { if (InstructionsProcessed.count(Instrs[I])) break; |