summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-07-20 20:07:37 +0000
committerJustin Lebar <jlebar@google.com>2016-07-20 20:07:37 +0000
commita272c12b7351f741694bec2291491b16f12832c3 (patch)
tree26ad7422f372dd4a2a7e10308b4acb21e2ffdd62 /llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
parent62b03e344eeb168d0ac87a442275b28d3e95016a (diff)
downloadbcm5719-llvm-a272c12b7351f741694bec2291491b16f12832c3.tar.gz
bcm5719-llvm-a272c12b7351f741694bec2291491b16f12832c3.zip
[LSV] Don't move stores across may-load instrs, and loosen restrictions on moving loads.
Summary: Previously we wouldn't move loads/stores across instructions that had side-effects, where that was defined as may-write or may-throw. But this is not sufficiently restrictive: Stores can't safely be moved across instructions that may load. This patch also adds a DEBUG check that all instructions in our chain are either loads or stores. Reviewers: asbirlea Subscribers: llvm-commits, jholewinski, arsenm, mzolotukhin Differential Revision: https://reviews.llvm.org/D22547 llvm-svn: 276171
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp')
-rw-r--r--llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
index 674c451f640..804db412e29 100644
--- a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp
@@ -429,6 +429,18 @@ ArrayRef<Value *> Vectorizer::getVectorizablePrefix(ArrayRef<Value *> Chain) {
SmallVector<std::pair<Value *, unsigned>, 16> MemoryInstrs;
SmallVector<std::pair<Value *, unsigned>, 16> ChainInstrs;
+ bool IsLoadChain = isa<LoadInst>(Chain[0]);
+ DEBUG({
+ for (Value *V : Chain) {
+ if (IsLoadChain)
+ assert(isa<LoadInst>(V) &&
+ "All elements of Chain must be loads, or all must be stores.");
+ else
+ assert(isa<StoreInst>(V) &&
+ "All elements of Chain must be loads, or all must be stores.");
+ }
+ });
+
unsigned InstrIdx = 0;
for (Instruction &I : make_range(getBoundaryInstrs(Chain))) {
++InstrIdx;
@@ -437,8 +449,12 @@ ArrayRef<Value *> Vectorizer::getVectorizablePrefix(ArrayRef<Value *> Chain) {
MemoryInstrs.push_back({&I, InstrIdx});
else
ChainInstrs.push_back({&I, InstrIdx});
- } else if (I.mayHaveSideEffects()) {
- DEBUG(dbgs() << "LSV: Found side-effecting operation: " << I << '\n');
+ } else if (IsLoadChain && (I.mayWriteToMemory() || I.mayThrow())) {
+ DEBUG(dbgs() << "LSV: Found may-write/throw operation: " << I << '\n');
+ break;
+ } else if (!IsLoadChain && (I.mayReadOrWriteMemory() || I.mayThrow())) {
+ DEBUG(dbgs() << "LSV: Found may-read/write/throw operation: " << I
+ << '\n');
break;
}
}
OpenPOWER on IntegriCloud