diff options
author | Ilya Enkovich <ilya.enkovich@intel.com> | 2016-04-29 13:27:24 +0000 |
---|---|---|
committer | Ilya Enkovich <ienkovich@gcc.gnu.org> | 2016-04-29 13:27:24 +0000 |
commit | cca535a4c158308a7a3a6486b6b66efb576da585 (patch) | |
tree | d784c314f3a6795ebd3163ce9db4f9afa2d8ecd5 /gcc | |
parent | 2fff3db89fa064071835924a7a9e1751a0b383fa (diff) | |
download | gcc-cca535a4c158308a7a3a6486b6b66efb576da585.zip gcc-cca535a4c158308a7a3a6486b6b66efb576da585.tar.gz gcc-cca535a4c158308a7a3a6486b6b66efb576da585.tar.bz2 |
tree-vect-loop.c (vect_transform_loop): Fix nb_iterations_upper_bound computation for vectorized loop.
gcc/
* tree-vect-loop.c (vect_transform_loop): Fix
nb_iterations_upper_bound computation for vectorized loop.
gcc/testsuite/
* gcc.target/i386/vect-unpack-2.c (avx512bw_test): Avoid
optimization of vector loop.
* gcc.target/i386/vect-unpack-3.c: New test.
* gcc.dg/vect/vect-nb-iter-ub-1.c: New test.
* gcc.dg/vect/vect-nb-iter-ub-2.c: New test.
* gcc.dg/vect/vect-nb-iter-ub-3.c: New test.
From-SVN: r235639
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-1.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-3.c | 30 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/vect-unpack-2.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/vect-unpack-3.c | 29 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 6 |
8 files changed, 143 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6b6804..454b8af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-04-29 Ilya Enkovich <ilya.enkovich@intel.com> + + * tree-vect-loop.c (vect_transform_loop): Fix + nb_iterations_upper_bound computation for vectorized loop. + 2016-04-29 Marek Polacek <polacek@redhat.com> Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3911534..24d3a83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2016-04-29 Ilya Enkovich <ilya.enkovich@intel.com> + + * gcc.target/i386/vect-unpack-2.c (avx512bw_test): Avoid + optimization of vector loop. + * gcc.target/i386/vect-unpack-3.c: New test. + * gcc.dg/vect/vect-nb-iter-ub-1.c: New test. + * gcc.dg/vect/vect-nb-iter-ub-2.c: New test. + * gcc.dg/vect/vect-nb-iter-ub-3.c: New test. + 2016-04-29 Marek Polacek <polacek@redhat.com> PR sanitizer/70342 diff --git a/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-1.c b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-1.c new file mode 100644 index 0000000..456866d --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-1.c @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-additional-options "-msse2 -fdump-tree-cunroll-details" { target { i?86-*-* x86_64-*-* } } } */ + +int ii[31]; +char cc[31] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }; + +void __attribute__((noinline,noclone)) +foo (int s) +{ + int i; + for (i = 0; i < s; i++) + ii[i] = (int) cc[i]; +} + +int main (int argc, const char **argv) +{ + int i; + foo (31); + for (i = 0; i < 31; i++) + if (ii[i] != i) + __builtin_abort (); +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { i?86-*-* x86_64-*-* } } } } */ +/* { dg-final { scan-tree-dump "loop turned into non-loop; it never loops" "cunroll" { target { i?86-*-* x86_64-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "loop with 2 iterations completely unrolled" "cunroll" { target { i?86-*-* x86_64-*-* } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c new file mode 100644 index 0000000..cf1c1ef --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c @@ -0,0 +1,31 @@ +/* { dg-do run } */ +/* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-additional-options "-msse2 -fdump-tree-cunroll-details" { target { i?86-*-* x86_64-*-* } } } */ + +int ii[32]; +char cc[66] = + { 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, + 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, + 20, 0, 21, 0, 22, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0, + 30, 0, 31, 0 }; + +void __attribute__((noinline,noclone)) +foo (int s) +{ + int i; + for (i = 0; i < s; i++) + ii[i] = (int) cc[i*2]; +} + +int main (int argc, const char **argv) +{ + int i; + foo (32); + for (i = 0; i < 32; i++) + if (ii[i] != i) + __builtin_abort (); +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { i?86-*-* x86_64-*-* } } } } */ +/* { dg-final { scan-tree-dump "loop turned into non-loop; it never loops" "cunroll" { target { i?86-*-* x86_64-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "loop with 2 iterations completely unrolled" "cunroll" { target { i?86-*-* x86_64-*-* } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-3.c b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-3.c new file mode 100644 index 0000000..d8fe307 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-3.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-require-effective-target sse2 { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-additional-options "-msse2 -fdump-tree-cunroll-details" { target { i?86-*-* x86_64-*-* } } } */ + +int ii[33]; +char cc[66] = + { 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, + 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, + 20, 0, 21, 0, 22, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0, + 30, 0, 31, 0, 32, 0 }; + +void __attribute__((noinline,noclone)) +foo (int s) +{ + int i; + for (i = 0; i < s; i++) + ii[i] = (int) cc[i*2]; +} + +int main (int argc, const char **argv) +{ + int i; + foo (33); + for (i = 0; i < 33; i++) + if (ii[i] != i) + __builtin_abort (); +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target { i?86-*-* x86_64-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "loop turned into non-loop; it never loops" "cunroll" { target { i?86-*-* x86_64-*-* } } } } */ diff --git a/gcc/testsuite/gcc.target/i386/vect-unpack-2.c b/gcc/testsuite/gcc.target/i386/vect-unpack-2.c index 4825248..51c518e 100644 --- a/gcc/testsuite/gcc.target/i386/vect-unpack-2.c +++ b/gcc/testsuite/gcc.target/i386/vect-unpack-2.c @@ -6,19 +6,22 @@ #define N 120 signed int yy[10000]; +signed char zz[10000]; void -__attribute__ ((noinline)) foo (signed char s) +__attribute__ ((noinline,noclone)) foo (int s) { - signed char i; + int i; for (i = 0; i < s; i++) - yy[i] = (signed int) i; + yy[i] = zz[i]; } void avx512bw_test () { signed char i; + for (i = 0; i < N; i++) + zz[i] = i; foo (N); for (i = 0; i < N; i++) if ( (signed int)i != yy [i] ) diff --git a/gcc/testsuite/gcc.target/i386/vect-unpack-3.c b/gcc/testsuite/gcc.target/i386/vect-unpack-3.c new file mode 100644 index 0000000..eb8a93e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/vect-unpack-3.c @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fdump-tree-vect-details -ftree-vectorize -ffast-math -mavx512bw -save-temps" } */ +/* { dg-require-effective-target avx512bw } */ + +#include "avx512bw-check.h" + +#define N 120 +signed int yy[10000]; + +void +__attribute__ ((noinline)) foo (signed char s) +{ + signed char i; + for (i = 0; i < s; i++) + yy[i] = (signed int) i; +} + +void +avx512bw_test () +{ + signed char i; + foo (N); + for (i = 0; i < N; i++) + if ( (signed int)i != yy [i] ) + abort (); +} + +/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */ +/* { dg-final { scan-assembler-not "vpmovsxbw\[ \\t\]+\[^\n\]*%zmm" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index d813b86..da98211 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6921,11 +6921,13 @@ vect_transform_loop (loop_vec_info loop_vinfo) /* Reduce loop iterations by the vectorization factor. */ scale_loop_profile (loop, GCOV_COMPUTE_SCALE (1, vectorization_factor), expected_iterations / vectorization_factor); - loop->nb_iterations_upper_bound - = wi::udiv_floor (loop->nb_iterations_upper_bound, vectorization_factor); if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) && loop->nb_iterations_upper_bound != 0) loop->nb_iterations_upper_bound = loop->nb_iterations_upper_bound - 1; + loop->nb_iterations_upper_bound + = wi::udiv_floor (loop->nb_iterations_upper_bound + 1, + vectorization_factor) - 1; + if (loop->any_estimate) { loop->nb_iterations_estimate |