Index: llvm/trunk/lib/Transforms/Scalar/Sink.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/Sink.cpp +++ llvm/trunk/lib/Transforms/Scalar/Sink.cpp @@ -114,7 +114,7 @@ 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(Inst)) return false; // We don't want to sink across a critical edge if we don't dominate the Index: llvm/trunk/test/Transforms/Sink/badloadsink.ll =================================================================== --- llvm/trunk/test/Transforms/Sink/badloadsink.ll +++ llvm/trunk/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 +}