summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2016-08-11 20:32:43 +0000
committerDaniel Berlin <dberlin@dberlin.org>2016-08-11 20:32:43 +0000
commitf75fd1b58b83e2e0ed1125f8088a4a15136639bc (patch)
tree7d522b430fbdbc19a45c395704c1e6a09b96a6e2 /llvm/lib/Transforms
parent91db988dfba333bc18745c1368c1344202bb2aeb (diff)
downloadbcm5719-llvm-f75fd1b58b83e2e0ed1125f8088a4a15136639bc.tar.gz
bcm5719-llvm-f75fd1b58b83e2e0ed1125f8088a4a15136639bc.zip
Fix PR 28933
Summary: This fixes PR 28933 by making sure GVNHoist does not try to recreate memory accesses when it has not actually moved them. Reviewers: sebpop Subscribers: llvm-commits, george.burgess.iv Differential Revision: https://reviews.llvm.org/D23411 llvm-svn: 278401
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/GVNHoist.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/GVNHoist.cpp b/llvm/lib/Transforms/Scalar/GVNHoist.cpp
index 63f00256248..0d7364bb974 100644
--- a/llvm/lib/Transforms/Scalar/GVNHoist.cpp
+++ b/llvm/lib/Transforms/Scalar/GVNHoist.cpp
@@ -740,10 +740,14 @@ private:
if (!Repl || firstInBB(I, Repl))
Repl = I;
+ // Keep track of whether we moved the instruction so we know whether we
+ // should move the MemoryAccess.
+ bool MoveAccess = true;
if (Repl) {
// Repl is already in HoistPt: it remains in place.
assert(allOperandsAvailable(Repl, HoistPt) &&
"instruction depends on operands that are not available");
+ MoveAccess = false;
} else {
// When we do not find Repl in HoistPt, select the first in the list
// and move it to HoistPt.
@@ -771,14 +775,16 @@ private:
DFSNumber[Repl] = DFSNumber[Last]++;
}
- MemoryAccess *NewMemAcc = nullptr;
- if (MemoryAccess *MA = MSSA->getMemoryAccess(Repl)) {
- if (MemoryUseOrDef *OldMemAcc = dyn_cast<MemoryUseOrDef>(MA)) {
+ MemoryAccess *NewMemAcc = MSSA->getMemoryAccess(Repl);
+
+ if (MoveAccess) {
+ if (MemoryUseOrDef *OldMemAcc =
+ dyn_cast_or_null<MemoryUseOrDef>(NewMemAcc)) {
// The definition of this ld/st will not change: ld/st hoisting is
// legal when the ld/st is not moved past its current definition.
MemoryAccess *Def = OldMemAcc->getDefiningAccess();
- NewMemAcc = MSSA->createMemoryAccessInBB(Repl, Def, HoistPt,
- MemorySSA::End);
+ NewMemAcc =
+ MSSA->createMemoryAccessInBB(Repl, Def, HoistPt, MemorySSA::End);
OldMemAcc->replaceAllUsesWith(NewMemAcc);
MSSA->removeMemoryAccess(OldMemAcc);
}
OpenPOWER on IntegriCloud