[SLSR] handle candidate form (B + i * S)
authorJingyue Wu <jingyue@google.com>
Wed, 15 Apr 2015 16:46:13 +0000 (16:46 +0000)
committerJingyue Wu <jingyue@google.com>
Wed, 15 Apr 2015 16:46:13 +0000 (16:46 +0000)
commitd4ceea3837f86356fb38b2b7efa395189f51532d
tree156c6f0d87c9de765d7222cd9d340855a8382054
parent6d9fd9bc709bece390a074172060b76e9bbba0fa
[SLSR] handle candidate form (B + i * S)

Summary:
With this patch, SLSR may rewrite

S1: X = B + i * S
S2: Y = B + i' * S

to

S2: Y = X + (i' - i) * S

A secondary improvement: if (i' - i) is a power of 2, emit Y as X + (S << log(i' - i)). (S << log(i' -i)) is in a canonical form and thus more likely GVN'ed than (i' - i) * S.

Test Plan: slsr-add.ll

Reviewers: hfinkel, sanjoy, meheff, broune, eliben

Reviewed By: eliben

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D8983

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235019 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/StraightLineStrengthReduce.cpp
test/Transforms/StraightLineStrengthReduce/X86/no-slsr.ll
test/Transforms/StraightLineStrengthReduce/slsr-add.ll [new file with mode: 0644]
test/Transforms/StraightLineStrengthReduce/slsr-mul.ll