[INDVARS] Extend using of widening of induction variables for the cases of "sub nsw...
authorZinovy Nis <zinovy.nis@gmail.com>
Thu, 21 Aug 2014 08:25:45 +0000 (08:25 +0000)
committerZinovy Nis <zinovy.nis@gmail.com>
Thu, 21 Aug 2014 08:25:45 +0000 (08:25 +0000)
commit164cd0161ed5006c8fe89859a62d74b2dc3f1514
tree59b434916cceb30384aa6cf295739db9f7e8bd27
parent6623af789290def4513b835e6a2b8bdcccc1030f
[INDVARS] Extend using of widening of induction variables for the cases of "sub nsw" and "mul nsw" instructions.

Currently only "add nsw" are widened. This patch eliminates tons of "sext" instructions for 64 bit code (and the corresponding target code) in cases like:

int N = 100;
float **A;

void foo(int x0, int x1)
{
        float * A_cur = &A[0][0];
        float * A_next = &A[1][0];
        for(int x = x0; x < x1; ++x).
        {
          // Currently only [x+N] case is widened. Others 2 cases lead to sext.
          // This patch fixes it, so all 3 cases do not need sext.
          const float div = A_cur[x + N] + A_cur[x - N] + A_cur[x * N];
          A_next[x] = div;
        }
}
...
> clang++ test.cpp -march=core-avx2 -Ofast  -fno-unroll-loops -fno-tree-vectorize -S -o -

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216160 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/IndVarSimplify.cpp
test/Transforms/IndVarSimplify/2011-09-10-widen-nsw.ll