summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorKeno Fischer <keno@alumni.harvard.edu>2017-06-09 19:31:10 +0000
committerKeno Fischer <keno@alumni.harvard.edu>2017-06-09 19:31:10 +0000
commit5329174cb1b32bb34b90f1fdd5525ed84716ecec (patch)
treec22a852ffa5d8e53bd14ca4fa5f69ff9e8cceee3 /llvm
parent5d2ed489870cb4b093ec8f52ab4a4ef81428d6fe (diff)
downloadbcm5719-llvm-5329174cb1b32bb34b90f1fdd5525ed84716ecec.tar.gz
bcm5719-llvm-5329174cb1b32bb34b90f1fdd5525ed84716ecec.zip
[Sink] Fix predicate in legality check
Summary: isSafeToSpeculativelyExecute is the wrong predicate to use here. All that checks for is whether it is safe to hoist a value due to unaligned/un-dereferencable accesses. However, not only are we doing sinking rather than hoisting, our concern is that the location we're loading from may have been modified. Instead forbid sinking any load across a critical edge. Reviewers: majnemer Subscribers: davide, llvm-commits Differential Revision: https://reviews.llvm.org/D33179 llvm-svn: 305102
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Transforms/Scalar/Sink.cpp2
-rw-r--r--llvm/test/Transforms/Sink/badloadsink.ll18
2 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/Sink.cpp b/llvm/lib/Transforms/Scalar/Sink.cpp
index 102e9eaeab7..5210f165b87 100644
--- a/llvm/lib/Transforms/Scalar/Sink.cpp
+++ b/llvm/lib/Transforms/Scalar/Sink.cpp
@@ -114,7 +114,7 @@ static bool IsAcceptableTarget(Instruction *Inst, BasicBlock *SuccToSinkTo,
if (SuccToSinkTo->getUniquePredecessor() != Inst->getParent()) {
// We cannot sink a load across a critical edge - there may be stores in
// other code paths.
- if (!isSafeToSpeculativelyExecute(Inst))
+ if (isa<LoadInst>(Inst))
return false;
// We don't want to sink across a critical edge if we don't dominate the
diff --git a/llvm/test/Transforms/Sink/badloadsink.ll b/llvm/test/Transforms/Sink/badloadsink.ll
new file mode 100644
index 00000000000..e3f4884c5a4
--- /dev/null
+++ b/llvm/test/Transforms/Sink/badloadsink.ll
@@ -0,0 +1,18 @@
+; RUN: opt < %s -basicaa -sink -S | FileCheck %s
+declare void @foo(i64 *)
+define i64 @sinkload(i1 %cmp) {
+; CHECK-LABEL: @sinkload
+top:
+ %a = alloca i64
+; CHECK: call void @foo(i64* %a)
+; CHECK-NEXT: %x = load i64, i64* %a
+ call void @foo(i64* %a)
+ %x = load i64, i64* %a
+ br i1 %cmp, label %A, label %B
+A:
+ store i64 0, i64 *%a
+ br label %B
+B:
+; CHECK-NOT: load i64, i64 *%a
+ ret i64 %x
+}
OpenPOWER on IntegriCloud