[SCEV] Handle case where MaxBECount is less precise than ExactBECount for OR.
authorFlorian Hahn <flo@fhahn.com>
Sat, 2 Mar 2019 02:31:44 +0000 (02:31 +0000)
committerFlorian Hahn <flo@fhahn.com>
Sat, 2 Mar 2019 02:31:44 +0000 (02:31 +0000)
commit98f11a7d75b54b44b3b136b537644fd3f6d77239
tree66bdb10f6057d1534d47fea2a908e9f8084e63ef
parent1cc0f6061f8d11f409590b09f945fe4470c9f679
[SCEV] Handle case where MaxBECount is less precise than ExactBECount for OR.

In some cases, MaxBECount can be less precise than ExactBECount for AND
and OR (the AND case was PR26207). In the OR test case, both ExactBECounts are
undef, but MaxBECount are different, so we hit the assertion below. This
patch uses the same solution the AND case already uses.

Assertion failed:
   ((isa<SCEVCouldNotCompute>(ExactNotTaken) || !isa<SCEVCouldNotCompute>(MaxNotTaken))
     && "Exact is not allowed to be less precise than Max"), function ExitLimit

This patch also consolidates test cases for both AND and OR in a single
test case.

Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13245

Reviewers: sanjoy, efriedma, mkazantsev

Reviewed By: sanjoy

Differential Revision: https://reviews.llvm.org/D58853

llvm-svn: 355259
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Analysis/ScalarEvolution/exact-exit-count-more-precise.ll [new file with mode: 0644]
llvm/test/Transforms/IndVarSimplify/pr26207.ll [deleted file]