diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-13 17:15:42 +0000 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-13 17:15:42 +0000 |
commit | 2a4f26b4c28aaf9307e690b2f743ffcde5183b9e (patch) | |
tree | cf7dbc2bff0e1476b84db56aa51b188c82324dad /llvm/lib/Analysis/ValueTracking.cpp | |
parent | dde10cd7a968e57598726347b323348eceffeb05 (diff) | |
download | bcm5719-llvm-2a4f26b4c28aaf9307e690b2f743ffcde5183b9e.tar.gz bcm5719-llvm-2a4f26b4c28aaf9307e690b2f743ffcde5183b9e.zip |
[ValueTracking] Improve reverse assumption inference
Use isGuaranteedToTransferExecutionToSuccessor() instead of
isSafeToSpeculativelyExecute() when seeing whether we can propagate
the information in an assume backwards in isValidAssumeForContext().
The latter is more general - it also allows arbitrary loads/stores -
and is also the condition we want: if our assume is guaranteed to
execute, its condition not holding would be UB.
Original patch by arielb1.
Differential Revision: https://reviews.llvm.org/D37215
llvm-svn: 368723
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index c09530cd697..2773b60bb75 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -558,12 +558,18 @@ bool llvm::isValidAssumeForContext(const Instruction *Inv, return true; } + // Don't let an assume affect itself - this would cause the problems + // `isEphemeralValueOf` is trying to prevent, and it would also make + // the loop below go out of bounds. + if (Inv == CxtI) + return false; + // The context comes first, but they're both in the same block. Make sure // there is nothing in between that might interrupt the control flow. for (BasicBlock::const_iterator I = std::next(BasicBlock::const_iterator(CxtI)), IE(Inv); I != IE; ++I) - if (!isSafeToSpeculativelyExecute(&*I) && !isAssumeLikeIntrinsic(&*I)) + if (!isGuaranteedToTransferExecutionToSuccessor(&*I)) return false; return !isEphemeralValueOf(Inv, CxtI); |