[SCEV] Add zext(C + x + ...) -> D + zext(C-D + x + ...)<nuw><nsw> transform
authorRoman Tereshin <rtereshin@apple.com>
Tue, 24 Jul 2018 21:48:56 +0000 (21:48 +0000)
committerRoman Tereshin <rtereshin@apple.com>
Tue, 24 Jul 2018 21:48:56 +0000 (21:48 +0000)
commit1ba1f9310c26507bdeaa70695e4e5529b33e842d
tree6778503ce98ac0f807dd0ddce31681974c9cc5f6
parent5ddc0a2b149daf41a4df3d215555c96343326cf5
[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

llvm-svn: 337859
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll
llvm/test/Transforms/LoadStoreVectorizer/X86/codegenprepare-produced-address-math.ll [new file with mode: 0644]