This patch teaches SCEV how to prove implications for SCEVUnknown nodes that are Phis.
If we need to prove Pred for LHS, RHS, and LHS is a Phi with possible incoming values
L1, L2, ..., LN, then if we prove Pred for (L1, RHS), (L2, RHS), ..., (LN, RHS) then we can also
prove it for (LHS, RHS). If both LHS and RHS are Phis from the same block, it is sufficient
to prove the predicate for values that come from the same predecessor block.
The typical case that it handles is that we sometimes need to prove that Phi(Len, Len - 1) >= 0
given that Len > 0. The new logic was added to isImpliedViaOperations and only uses it and
non-recursive reasoning to prove the facts we need, so it should not hurt compile time a lot.
This assertion is triggering on the polly-AOSP buildbot: http://lab.llvm.org:8011/builders/aosp-O3-polly-before-vectorizer-unprofitable/builds/477 .
I can try to reduce a testcase if you need it, but the assertion is pretty obviously just wrong: in general, SCEV doesn't care care whether a loop has a preheader.