[LICM] Ignore exits provably not taken on first iteration when computing must execute
authorPhilip Reames <listmail@philipreames.com>
Thu, 15 Mar 2018 21:04:28 +0000 (21:04 +0000)
committerPhilip Reames <listmail@philipreames.com>
Thu, 15 Mar 2018 21:04:28 +0000 (21:04 +0000)
commita21d5f1e180e3b6831bf818bf723ad55e6a061e0
treec3098a4f3cefe8967227aa5314a0639f835304c3
parentd4254ac1b9f1d1f20c7a1b745addc955e43876d3
[LICM] Ignore exits provably not taken on first iteration when computing must execute

It is common to have conditional exits within a loop which are known not to be taken on some iterations, but not necessarily all. This patches extends our reasoning around guaranteed to execute (used when establishing whether it's safe to dereference a location from the preheader) to handle the case where an exit is known not to be taken on the first iteration and the instruction of interest *is* known to be taken on the first iteration.

This case comes up in two major ways:
* If we have a range check which we've been unable to eliminate, we frequently know that it doesn't fail on the first iteration.
* Pass ordering. We may have a check which will be eliminated through some sequence of other passes, but depending on the exact pass sequence we might never actually do so or we might miss other optimizations from passes run before the check is finally eliminated.

The initial version (here) is implemented via InstSimplify. At the moment, it catches a few cases, but misses a lot too. I added test cases for missing cases in InstSimplify which I'll follow up on separately. Longer term, we should probably wire SCEV through to here to get much smarter loop aware simplification of the first iteration predicate.

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

llvm-svn: 327664
llvm/lib/Transforms/Utils/LoopUtils.cpp
llvm/test/Transforms/LICM/hoist-mustexec.ll [new file with mode: 0644]
llvm/test/Transforms/LICM/scalar-promote.ll