diff options
author | Karl-Johan Karlsson <karl-johan.karlsson@ericsson.com> | 2018-05-30 15:56:46 +0000 |
---|---|---|
committer | Karl-Johan Karlsson <karl-johan.karlsson@ericsson.com> | 2018-05-30 15:56:46 +0000 |
commit | ebaaa2ddae28edd5a29eeec3a7eb927da11f4fb6 (patch) | |
tree | 5ca58ec0c17385a463e37149cb7e6bcabf92134b /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 1054541490dbb538fe67408598e93b5494ba7b25 (diff) | |
download | llvm-ebaaa2ddae28edd5a29eeec3a7eb927da11f4fb6.zip llvm-ebaaa2ddae28edd5a29eeec3a7eb927da11f4fb6.tar.gz llvm-ebaaa2ddae28edd5a29eeec3a7eb927da11f4fb6.tar.bz2 |
[ValueTracking] Fix endless recursion in isKnownNonZero()
Summary:
The isKnownNonZero() function have checks that abort the recursion when
it reaches the specified max depth. However one of the recursive calls
was placed before the max depth check was done, resulting in a endless
recursion that eventually triggered a segmentation fault.
Fixed the problem by moving the max depth check above the first
recursive call.
Reviewers: Prazek, nlopes, spatel, craig.topper, hfinkel
Reviewed By: hfinkel
Subscribers: hfinkel, bjope, llvm-commits
Differential Revision: https://reviews.llvm.org/D47531
llvm-svn: 333557
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 5f5d1be..8cff7a6 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1943,6 +1943,10 @@ bool isKnownNonZero(const Value *V, unsigned Depth, const Query &Q) { } } + // Some of the tests below are recursive, so bail out if we hit the limit. + if (Depth++ >= MaxDepth) + return false; + // Check for pointer simplifications. if (V->getType()->isPointerTy()) { // Alloca never returns null, malloc might. @@ -1963,13 +1967,10 @@ bool isKnownNonZero(const Value *V, unsigned Depth, const Query &Q) { if (CS.isReturnNonNull()) return true; if (const auto *RP = getArgumentAliasingToReturnedPointer(CS)) - return isKnownNonZero(RP, Depth + 1, Q); + return isKnownNonZero(RP, Depth, Q); } } - // The remaining tests are all recursive, so bail out if we hit the limit. - if (Depth++ >= MaxDepth) - return false; // Check for recursive pointer simplifications. if (V->getType()->isPointerTy()) { |