[LoopPred] Fix two subtle issues found by inspection
authorPhilip Reames <listmail@philipreames.com>
Wed, 6 Nov 2019 20:36:28 +0000 (12:36 -0800)
committerPhilip Reames <listmail@philipreames.com>
Wed, 6 Nov 2019 22:04:45 +0000 (14:04 -0800)
commit9bfa5ab3d1982a7cef60ee00b935f4ddc89fc98e
treeaef1dff69b0dc2c363f04591f97b7d23f99c7522
parent6cecd3c3dbef48eca6c4cf2dcc2df3290ab91488
[LoopPred] Fix two subtle issues found by inspection

This patch fixes two issues noticed by inspection when going to enable the loop predication code in IndVarSimplify.

Issue 1 - Both the LoopPredication transform, and the already on by default optimizeLoopExits transform, modify the exit count of the exits they modify. (either to 0 or Infinity) Looking at the code more closely, this was not reflected into SCEV and we were instead running later transforms with incorrect SCEVs. Fixing this requires forgetting the loop, weakening a too strong assert, and updating SCEV to not pessimize results when a loop is provable untaken. I haven't been able to find a test case to demonstrate the miscompile.

Issue 2 - For modules without a data layout, we can end up with unsized pointer typed exit counts. Just bail out of this case.

I think these are the last two issues which need addressed before we enable this by default. The code has already survived a decent amount of fuzzing without revealing either of the above.

Differential Revision: https://reviews.llvm.org/D69695
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/lib/Transforms/Scalar/IndVarSimplify.cpp