Index: llvm/trunk/lib/Analysis/ValueTracking.cpp =================================================================== --- llvm/trunk/lib/Analysis/ValueTracking.cpp +++ llvm/trunk/lib/Analysis/ValueTracking.cpp @@ -384,13 +384,13 @@ 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); + } } } Index: llvm/trunk/test/Analysis/ValueTracking/assume.ll =================================================================== --- llvm/trunk/test/Analysis/ValueTracking/assume.ll +++ llvm/trunk/test/Analysis/ValueTracking/assume.ll @@ -18,5 +18,16 @@ 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)