Was D9784: "Remove loop variant range check when induction variable is
strictly increasing"
This change re-implements D9784 with the two differences:
- It does not use SCEVExpander and does not generate new instructions. Instead, it does a quick local search for existing llvm::Values that it needs when modifying the icmp instruction.
- It is more general -- it deals with both increasing and decreasing induction variables.
I've added all of the tests included with D9784, and two more.
As an example on what this change does (copied from D9784):
Given C code:
for (int i = M; i < N; i++) // i is known not to overflow if (i < 0) break; a[i] = 0; }
This transformation produces:
for (int i = M; i < N; i++) if (M < 0) break; a[i] = 0; }
Which can be unswitched into:
if (!(M < 0)) for (int i = M; i < N; i++) a[i] = 0; }
I went back and forth on whether the top level logic should live in
SimplifyIndvar::eliminateIVComparison or be put into its own
routine. Right now I've put it under eliminateIVComparison because
even though the icmp is not *eliminated*, it no longer is an IV
comparison. I'm open to putting it in its own helper routine if you
think that is better.