Fix ScalarEvolution::ComputeExitLimitFromCond for 'or' conditions.
authorAndrew Trick <atrick@apple.com>
Fri, 31 May 2013 06:43:25 +0000 (06:43 +0000)
committerAndrew Trick <atrick@apple.com>
Fri, 31 May 2013 06:43:25 +0000 (06:43 +0000)
commit616011418e7460f765469f6347417fa25b5b740b
tree350eec7de69f9a4c5ebec3b0649726b4e71ab4cf
parentaffed7e11d9107285b1a9ffa2cf78a141fa27a3d
Fix ScalarEvolution::ComputeExitLimitFromCond for 'or' conditions.

Fixes PR16130 - clang produces incorrect code with loop/expression at -O2.

This is a 2+ year old bug that's now holding up the release. It's a
case where we knowingly made aggressive assumptions about undefined
behavior. These assumptions are wrong when SCEV is computing a
subexpression that does not directly control the branch. With this
fix, we avoid making assumptions in those cases but still optimize the
common case. SCEV's trip count computation for exits controlled by
'or' expressions is now analagous to the trip count computation for
loops with multiple exits. I had already fixed the multiple exit case
to be conservative.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182989 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/ScalarEvolution.h
lib/Analysis/ScalarEvolution.cpp