diff options
author | Justin Lebar <jlebar@google.com> | 2016-07-20 20:07:37 +0000 |
---|---|---|
committer | Justin Lebar <jlebar@google.com> | 2016-07-20 20:07:37 +0000 |
commit | a272c12b7351f741694bec2291491b16f12832c3 (patch) | |
tree | 26ad7422f372dd4a2a7e10308b4acb21e2ffdd62 /llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp | |
parent | 62b03e344eeb168d0ac87a442275b28d3e95016a (diff) | |
download | bcm5719-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.cpp | 20 |
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; } } |