LoopVectorizer: integer division is not a reduction operation
authorArnold Schwaighofer <aschwaighofer@apple.com>
Fri, 12 Apr 2013 15:15:19 +0000 (15:15 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Fri, 12 Apr 2013 15:15:19 +0000 (15:15 +0000)
commit08a0e8f8dbae6314dade60e1ef92e73e89c5ff23
treec92a7deba86db295ab34ac2acbcd84ed94d77325
parentb6ad2bd51195f7675db0f71c5826a12a2b7090fc
LoopVectorizer: integer division is not a reduction operation

Don't classify idiv/udiv as a reduction operation. Integer division is lossy.
For example : (1 / 2) * 4 != 4/2.

Example:

int a[] = { 2, 5, 2, 2}
int x = 80;

for()
  x /= a[i];

Scalar:
  x /= 2 // = 40
  x /= 5 // = 8
  x /= 2 // = 4
  x /= 2 // = 2

Vectorized:

 <80, 1> / <2,5> //= <40,0>
 <40, 0> / <2,2> //= <20,0>

 20*0 = 0

radar://13640654

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179381 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Vectorize/LoopVectorize.cpp
test/Transforms/LoopVectorize/no_idiv_reduction.ll [new file with mode: 0644]