diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/Scalar/Sink.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/Sink/badloadsink.ll | 18 |
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 +} |