From b03dd4be705bcd4e02384f2ea37b893ce477e512 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Mon, 14 Aug 2017 17:11:43 +0000 Subject: [PATCH] [ValueTracking] Don't delete assumes of side-effectful instructions ValueTracking has to strike a balance when attempting to propagate information backwards from assumes, because if the information is trivially propagated backwards, it can appear to LLVM that the assumption is known to be true, and therefore can be removed. This is sound (because an assumption has no semantic effect except for causing UB), but prevents the assume from allowing further optimizations. The isEphemeralValueOf check exists to try and prevent this issue by not removing the source of an assumption. This tries to make it a little bit more general to handle the case of side-effectful instructions, such as in %0 = call i1 @get_val() %1 = xor i1 %0, true call void @llvm.assume(i1 %1) Patch by Ariel Ben-Yehuda, thanks! Differential Revision: https://reviews.llvm.org/D36590 llvm-svn: 310859 --- llvm/lib/Analysis/ValueTracking.cpp | 14 +++++++------- llvm/test/Analysis/ValueTracking/assume.ll | 13 ++++++++++++- 2 files changed, 19 insertions(+), 8 deletions(-) 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)