[SCEV] Add zext(C + x + ...) -> D + zext(C-D + x + ...)<nuw><nsw> transform

if the top level addition in (D + (C-D + x + ...)) could be proven to

not wrap, where the choice of D also maximizes the number of trailing

zeroes of (C-D + x + ...), ensuring homogeneous behaviour of the

transformation and better canonicalization of such expressions.

This enables better canonicalization of expressions like

1 + zext(5 + 20 * %x + 24 * %y) and zext(6 + 20 * %x + 24 * %y)

which get both transformed to

2 + zext(4 + 20 * %x + 24 * %y)

This pattern is common in address arithmetics and the transformation

makes it easier for passes like LoadStoreVectorizer to prove that 2 or

more memory accesses are consecutive and optimize (vectorize) them.

Reviewed By: mzolotukhin

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