[IndVars] Fix a subtle bug in optimizeLoopExits
authorPhilip Reames <listmail@philipreames.com>
Tue, 23 Jul 2019 17:45:11 +0000 (17:45 +0000)
committerPhilip Reames <listmail@philipreames.com>
Tue, 23 Jul 2019 17:45:11 +0000 (17:45 +0000)
commitea5c94b497cfc43f9ec513f721e03aa5c669249a
tree27f7d292e5913bc405e7e3abe4ef12334f46eb4d
parent532f756555717e730166ac882e4c97ac0eeb1664
[IndVars] Fix a subtle bug in optimizeLoopExits

The original code failed to account for the fact that one exit can have a pointer exit count without all of them having pointer exit counts.  This could cause two separate bugs:
1) We might exit the loop early, and leave optimizations undone.  This is what triggered the assertion failure in the reported test case.
2) We might optimize one exit, then exit without indicating a change.  This could result in an analysis invalidaton bug if no other transform is done by the rest of indvars.

Note that the pointer exit counts are a really fragile concept.  They show up only when we have a pointer IV w/o a datalayout to provide their size.  It's really questionable to me whether the complexity implied is worth it.

llvm-svn: 366829
llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
llvm/test/Transforms/IndVarSimplify/eliminate-exit-no-dl.ll [new file with mode: 0644]