diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index b81bf9ec9d1a..d73e5f251192 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -384,13 +384,13 @@ static bool isEphemeralValueOf(const Instruction *I, const Value *E) { if (V == E) return true; - EphValues.insert(V); - if (const User *U = dyn_cast(V)) - for (User::const_op_iterator J = U->op_begin(), JE = U->op_end(); - J != JE; ++J) { - if (isSafeToSpeculativelyExecute(*J)) - WorkSet.push_back(*J); - } + if (V == I || isSafeToSpeculativelyExecute(V)) { + EphValues.insert(V); + if (const User *U = dyn_cast(V)) + for (User::const_op_iterator J = U->op_begin(), JE = U->op_end(); + J != JE; ++J) + WorkSet.push_back(*J); + } } } diff --git a/llvm/test/Analysis/ValueTracking/assume.ll b/llvm/test/Analysis/ValueTracking/assume.ll index fe0ee53eb416..87ac74c2ad1a 100644 --- a/llvm/test/Analysis/ValueTracking/assume.ll +++ b/llvm/test/Analysis/ValueTracking/assume.ll @@ -18,5 +18,16 @@ define i32 @assume_add(i32 %a, i32 %b) { ret i32 %t3 } -declare void @llvm.assume(i1) +define void @assume_not() { +; CHECK-LABEL: @assume_not( +entry-block: + %0 = call i1 @get_val() +; CHECK: call void @llvm.assume + %1 = xor i1 %0, true + call void @llvm.assume(i1 %1) + ret void +} + +declare i1 @get_val() +declare void @llvm.assume(i1)